Skip to content

Commit 9f82258

Browse files
committed
refactor: make get key return OpenBao.Key
Signed-off-by: Francesco Noacco <francesco.noacco@secomind.com>
1 parent a179784 commit 9f82258

File tree

5 files changed

+72
-24
lines changed

5 files changed

+72
-24
lines changed

apps/astarte_pairing/lib/astarte_pairing/fdo/open_bao/core.ex

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ defmodule Astarte.Pairing.FDO.OpenBao.Core do
4646
end
4747
end
4848

49+
@spec key_algorithm_enum :: Keyword.t(String.t())
50+
def key_algorithm_enum do
51+
[
52+
es256: "ecdsa-p256",
53+
es384: "ecdsa-p384",
54+
rs256: "rsa-2048",
55+
rs384: "rsa-3072"
56+
]
57+
end
58+
4959
@spec digest_type(digest_type) :: {:ok, String.t()} | :error
5060
def digest_type(:sha), do: {:ok, "sha1"}
5161
def digest_type(:sha224), do: {:ok, "sha2-224"}
@@ -225,21 +235,19 @@ defmodule Astarte.Pairing.FDO.OpenBao.Core do
225235
end
226236
end
227237

228-
@spec get_key(String.t(), String.t()) ::
229-
:error | {:error, Jason.DecodeError.t()} | {:ok, any()}
238+
@spec get_key(String.t(), String.t()) :: {:ok, String.t()} | :error
230239
def get_key(key_name, namespace) do
231240
headers = [{"Content-Type", "application/json"}]
232241

233242
options = [{:namespace, namespace}]
234243

235244
case Client.get("/transit/keys/#{key_name}", headers, options) do
236245
{:ok, %HTTPoison.Response{status_code: 200, body: resp_body}} ->
237-
parse_json_data(resp_body)
246+
{:ok, resp_body}
238247

239248
error_resp ->
240-
Logger.error(
241-
"Encountered HTTP error while getting key #{key_name}: #{inspect(error_resp)}"
242-
)
249+
"Encountered HTTP error while getting key #{key_name}: #{inspect(error_resp)}"
250+
|> Logger.error()
243251

244252
:error
245253
end
@@ -338,7 +346,7 @@ defmodule Astarte.Pairing.FDO.OpenBao.Core do
338346
end
339347
end
340348

341-
defp parse_json_data(json_str) do
349+
def parse_json_data(json_str) do
342350
with {:ok, map} when is_map(map) <- Jason.decode(json_str),
343351
{:ok, data} <- Map.fetch(map, "data") do
344352
{:ok, data}

apps/astarte_pairing/lib/astarte_pairing/fdo/open_bao/key.ex

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,42 @@ defmodule Astarte.Pairing.FDO.OpenBao.Key do
2121
`COSE.Keys.Key` implementation for OpenBao keys.
2222
"""
2323

24-
use TypedStruct
24+
use TypedEctoSchema
25+
26+
import Ecto.Changeset
2527

2628
alias Astarte.Pairing.FDO.OpenBao.Core
29+
alias Astarte.Pairing.FDO.OpenBao.Key
30+
31+
@primary_key false
32+
typed_embedded_schema do
33+
field :name, :string
34+
field :namespace, :string
35+
field :alg, Ecto.Enum, values: Core.key_algorithm_enum()
36+
field :public_pem, :string
37+
end
38+
39+
@doc """
40+
Convert the result from OpenBao's API into `t()`
41+
"""
42+
@spec parse(String.t(), String.t(), String.t()) :: {:ok, t()} | {:error, term()}
43+
def parse(key_name, namespace, response_body) do
44+
with {:ok, data} <- Core.parse_json_data(response_body) do
45+
params = %{
46+
"namespace" => namespace,
47+
"name" => key_name,
48+
"alg" => data["type"],
49+
"public_pem" => get_in(data, ["keys", "1", "public_key"])
50+
}
51+
52+
changeset = changeset(%Key{}, params)
53+
apply_action(changeset, :insert)
54+
end
55+
end
2756

28-
typedstruct do
29-
field :name, String.t()
30-
field :namespace, String.t()
31-
field :alg, Core.key_algorithm()
57+
def changeset(key, params) do
58+
key
59+
|> cast(params, [:namespace, :name, :alg, :public_pem])
3260
end
3361
end
3462

apps/astarte_pairing/lib/astarte_pairing/fdo/open_bao/open_bao.ex

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ defmodule Astarte.Pairing.FDO.OpenBao do
2020
@moduledoc """
2121
Functionality to interface with OpenBao APIs.
2222
"""
23-
24-
alias Astarte.Pairing.FDO.OpenBao.{Client, Core}
23+
alias Astarte.Pairing.FDO.OpenBao.Client
24+
alias Astarte.Pairing.FDO.OpenBao.Core
25+
alias Astarte.Pairing.FDO.OpenBao.Key
2526
alias COSE.Keys.ECC
2627
alias COSE.Keys.RSA
2728

@@ -31,17 +32,18 @@ defmodule Astarte.Pairing.FDO.OpenBao do
3132
def get_key(key_name, opts \\ []) do
3233
namespace = Keyword.fetch!(opts, :namespace)
3334

34-
Core.get_key(key_name, namespace)
35+
with {:ok, resp} <- Core.get_key(key_name, namespace) do
36+
Key.parse(key_name, namespace, resp)
37+
end
3538
end
3639

3740
@spec list_keys_names() :: {:ok, map()} | :error
3841
def list_keys_names(opts \\ []) do
3942
namespace = Keyword.fetch!(opts, :namespace)
43+
4044
Core.list_keys(namespace)
4145
end
4246

43-
alias Astarte.Pairing.FDO.OpenBao.Core
44-
4547
def create_namespace(realm_name, user_id \\ nil, key_algorithm) do
4648
with {:ok, algorithm} <- Core.key_type_to_string(key_algorithm),
4749
namespace_tokens = Core.namespace_tokens(realm_name, user_id, algorithm),

apps/astarte_pairing/test/astarte_pairing/fdo/open_bao/core_test.exs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ defmodule Astarte.Pairing.FDO.OpenBao.CoreTest do
222222
|> String.trim_trailing()
223223

224224
assert {:ok, key_data} = OpenBao.get_key(key_name, opts)
225-
stored_pem = get_in(key_data, ["keys", "1", "public_key"]) |> String.trim_trailing()
225+
stored_pem = key_data.public_pem |> String.trim_trailing()
226226
assert expected_pub_pem == stored_pem
227227
end
228228

@@ -244,7 +244,7 @@ defmodule Astarte.Pairing.FDO.OpenBao.CoreTest do
244244
|> String.trim_trailing()
245245

246246
assert {:ok, key_data} = OpenBao.get_key(key_name, opts)
247-
stored_pem = get_in(key_data, ["keys", "1", "public_key"]) |> String.trim_trailing()
247+
stored_pem = key_data.public_pem |> String.trim_trailing()
248248
assert expected_pub_pem == stored_pem
249249
end
250250

@@ -266,7 +266,7 @@ defmodule Astarte.Pairing.FDO.OpenBao.CoreTest do
266266
|> String.trim_trailing()
267267

268268
assert {:ok, key_data} = OpenBao.get_key(key_name, opts)
269-
stored_pem = get_in(key_data, ["keys", "1", "public_key"]) |> String.trim_trailing()
269+
stored_pem = key_data.public_pem |> String.trim_trailing()
270270
assert expected_pub_pem == stored_pem
271271
end
272272
end

apps/astarte_pairing/test/astarte_pairing/fdo/open_bao/open_bao_test.exs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ defmodule Astarte.Pairing.FDO.OpenBaoTest do
2424
alias Astarte.Pairing.FDO.OpenBao
2525
alias Astarte.Pairing.FDO.OpenBao.Client
2626
alias Astarte.Pairing.FDO.OpenBao.Core
27+
alias Astarte.Pairing.FDO.OpenBao.Key
2728
alias COSE.Keys.ECC
2829

2930
import Astarte.Helpers.OpenBao
@@ -250,6 +251,7 @@ defmodule Astarte.Pairing.FDO.OpenBaoTest do
250251
key_type: key_type,
251252
key_type_to_string: key_type_to_string,
252253
allow_key_export_and_backup: allow_key_export_and_backup,
254+
namespace: namespace,
253255
opts: opts
254256
}
255257
end
@@ -259,6 +261,7 @@ defmodule Astarte.Pairing.FDO.OpenBaoTest do
259261
key_name: key_name,
260262
key_type: key_type,
261263
key_type_to_string: key_type_to_string,
264+
namespace: namespace,
262265
allow_key_export_and_backup: allow_key_export_and_backup,
263266
opts: opts
264267
} do
@@ -271,14 +274,16 @@ defmodule Astarte.Pairing.FDO.OpenBaoTest do
271274
"allow_plaintext_backup" => ^allow_key_export_and_backup
272275
} = key_data
273276

274-
assert {:ok, key_data} == OpenBao.get_key(key_name, opts)
277+
assert {:ok, %Key{name: ^key_name, namespace: ^namespace, alg: ^key_type}} =
278+
OpenBao.get_key(key_name, opts)
275279
end
276280

277281
@tag key_type: :es384
278282
test "of type EC384", %{
279283
key_name: key_name,
280284
key_type: key_type,
281285
key_type_to_string: key_type_to_string,
286+
namespace: namespace,
282287
allow_key_export_and_backup: allow_key_export_and_backup,
283288
opts: opts
284289
} do
@@ -291,14 +296,16 @@ defmodule Astarte.Pairing.FDO.OpenBaoTest do
291296
"allow_plaintext_backup" => ^allow_key_export_and_backup
292297
} = key_data
293298

294-
assert {:ok, key_data} == OpenBao.get_key(key_name, opts)
299+
assert {:ok, %Key{name: ^key_name, namespace: ^namespace, alg: ^key_type}} =
300+
OpenBao.get_key(key_name, opts)
295301
end
296302

297303
@tag key_type: :rs256
298304
test "of type RSA2048", %{
299305
key_name: key_name,
300306
key_type: key_type,
301307
key_type_to_string: key_type_to_string,
308+
namespace: namespace,
302309
allow_key_export_and_backup: allow_key_export_and_backup,
303310
opts: opts
304311
} do
@@ -311,14 +318,16 @@ defmodule Astarte.Pairing.FDO.OpenBaoTest do
311318
"allow_plaintext_backup" => ^allow_key_export_and_backup
312319
} = key_data
313320

314-
assert {:ok, key_data} == OpenBao.get_key(key_name, opts)
321+
assert {:ok, %Key{name: ^key_name, namespace: ^namespace, alg: ^key_type}} =
322+
OpenBao.get_key(key_name, opts)
315323
end
316324

317325
@tag key_type: :rs384
318326
test "of type RSA3072", %{
319327
key_name: key_name,
320328
key_type: key_type,
321329
key_type_to_string: key_type_to_string,
330+
namespace: namespace,
322331
allow_key_export_and_backup: allow_key_export_and_backup,
323332
opts: opts
324333
} do
@@ -331,7 +340,8 @@ defmodule Astarte.Pairing.FDO.OpenBaoTest do
331340
"allow_plaintext_backup" => ^allow_key_export_and_backup
332341
} = key_data
333342

334-
assert {:ok, key_data} == OpenBao.get_key(key_name, opts)
343+
assert {:ok, %Key{name: ^key_name, namespace: ^namespace, alg: ^key_type}} =
344+
OpenBao.get_key(key_name, opts)
335345
end
336346
end
337347

0 commit comments

Comments
 (0)