Skip to content

Commit e146b59

Browse files
mizzet1AliouneGaye21
authored andcommitted
fix(pairing): fix ownership_voucher_controller errors (#1904)
Signed-off-by: Riccardo Nalgi <riccardo.nalgi@secomind.com> Signed-off-by: Alioune Gaye <alioune.gaye@secomind.com>
1 parent d619fbc commit e146b59

File tree

16 files changed

+197
-188
lines changed

16 files changed

+197
-188
lines changed

apps/astarte_pairing/lib/astarte_pairing/queries.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@ defmodule Astarte.Pairing.Queries do
251251
consistency = Consistency.device_info(:write)
252252
opts = [prefix: keyspace, consistency: consistency]
253253

254-
%OwnershipVoucher{guid: guid, output_voucher: new_voucher}
254+
%OwnershipVoucher{guid: guid}
255+
|> Ecto.Changeset.change(output_voucher: new_voucher)
255256
|> Repo.update(opts)
256257
end
257258

apps/astarte_pairing/lib/astarte_pairing_web/controllers/owner_key_controller.ex

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ defmodule Astarte.PairingWeb.OwnerKeyController do
5555
}
5656
) do
5757
with {:ok, keys} <-
58-
Secrets.Core.get_keys_from_algorithm(realm_name, @supported_key_algorithms) do
58+
Secrets.Core.get_keys(realm_name, @supported_key_algorithms) do
5959
send_resp(conn, 200, Jason.encode!(keys))
6060
end
6161
end
@@ -64,7 +64,8 @@ defmodule Astarte.PairingWeb.OwnerKeyController do
6464
"realm_name" => realm_name,
6565
"key_algorithm" => key_algorithm
6666
}) do
67-
with {:ok, keys} <- Secrets.Core.get_keys_from_algorithm(realm_name, key_algorithm) do
67+
with {:ok, algorithm} <- Secrets.Core.string_to_key_type(key_algorithm),
68+
{:ok, keys} <- Secrets.Core.get_keys(realm_name, [algorithm]) do
6869
json(conn, %{data: keys})
6970
end
7071
end

apps/astarte_pairing/lib/astarte_pairing_web/controllers/ownership_voucher_controller.ex

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,45 +19,13 @@
1919
defmodule Astarte.PairingWeb.OwnershipVoucherController do
2020
use Astarte.PairingWeb, :controller
2121

22-
alias Astarte.FDO.Core.OwnershipVoucher.CreateRequest
2322
alias Astarte.FDO.OwnershipVoucher
2423
alias Astarte.FDO.OwnershipVoucher.LoadRequest
2524
alias Astarte.FDO.TO0
2625
alias Astarte.Secrets.Core, as: SecretsCore
2726

2827
action_fallback Astarte.PairingWeb.FallbackController
2928

30-
def create(conn, %{
31-
"data" => data,
32-
"realm_name" => realm_name
33-
}) do
34-
create = CreateRequest.changeset(%CreateRequest{}, data)
35-
36-
with {:ok, create} <- Ecto.Changeset.apply_action(create, :insert),
37-
%CreateRequest{
38-
decoded_ownership_voucher: decoded_ownership_voucher,
39-
cbor_ownership_voucher: cbor_ownership_voucher,
40-
private_key: private_key,
41-
extracted_private_key: extracted_private_key,
42-
device_guid: device_guid
43-
} = create,
44-
:ok <-
45-
OwnershipVoucher.save_voucher(
46-
realm_name,
47-
cbor_ownership_voucher,
48-
device_guid,
49-
private_key
50-
),
51-
:ok <-
52-
TO0.claim_ownership_voucher(
53-
realm_name,
54-
decoded_ownership_voucher,
55-
extracted_private_key
56-
) do
57-
send_resp(conn, 200, "")
58-
end
59-
end
60-
6129
@doc """
6230
Validates an FDO Ownership Voucher load request and register the OV in the database.
6331
@@ -72,8 +40,17 @@ defmodule Astarte.PairingWeb.OwnershipVoucherController do
7240
voucher_data: req.cbor_ownership_voucher,
7341
guid: req.device_guid,
7442
key_name: req.key_name,
75-
key_algorithm: req.key_algorithm
76-
}) do
43+
key_algorithm: req.key_algorithm,
44+
replacement_guid: req.replacement_guid,
45+
replacement_rendezvous_info: req.decoded_replacement_rendezvous_info,
46+
replacement_public_key: req.decoded_replacement_public_key
47+
}),
48+
:ok <-
49+
TO0.claim_ownership_voucher(
50+
realm_name,
51+
req.decoded_ownership_voucher,
52+
req.extracted_owner_key
53+
) do
7754
json(conn, %{
7855
data: %{
7956
public_key: req.extracted_owner_key.public_pem,
@@ -93,7 +70,7 @@ defmodule Astarte.PairingWeb.OwnershipVoucherController do
9370
with {:ok, pem} <- ensure_ownership_voucher_parameter(data),
9471
{:ok, voucher} <- OwnershipVoucher.decode_binary_voucher(pem),
9572
key_algorithm = OwnershipVoucher.key_algorithm(voucher),
96-
{:ok, keys_map} <- SecretsCore.get_keys_from_algorithm(realm_name, key_algorithm) do
73+
{:ok, keys_map} <- SecretsCore.get_keys(realm_name, key_algorithm) do
9774
json(conn, %{data: keys_map})
9875
end
9976
end

apps/astarte_pairing/test/astarte_pairing_web/controllers/owner_key_controller_test.exs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -206,19 +206,17 @@ defmodule Astarte.PairingWeb.Controllers.OwnerKeyControllerTest do
206206

207207
keys = Jason.decode!(keys)
208208

209-
assert keys == [
210-
%{
211-
"es256" => [
212-
"key_to_create",
213-
"key_to_create1",
214-
"key_to_create2",
215-
"key_to_create3"
216-
]
217-
},
218-
%{"es384" => []},
219-
%{"rs256" => []},
220-
%{"rs384" => []}
221-
]
209+
assert keys == %{
210+
"es256" => [
211+
"key_to_create",
212+
"key_to_create1",
213+
"key_to_create2",
214+
"key_to_create3"
215+
],
216+
"es384" => [],
217+
"rs256" => [],
218+
"rs384" => []
219+
}
222220
end
223221
end
224222

apps/astarte_pairing/test/astarte_pairing_web/controllers/ownership_voucher_controller_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ defmodule Astarte.PairingWeb.Controllers.OwnershipVoucherControllerTest do
174174
assert %{"es256" => [@sample_key_name, "another_key"]} = get_in(body, ["data"])
175175
end
176176

177-
test "returns 200 with an empty list when no keys are registered", context do
177+
test "returns 200 with an empty key list when no keys are registered", context do
178178
%{auth_conn: conn, path: path, realm_name: realm_name} = context
179179

180180
stub(Secrets, :create_namespace, fn ^realm_name, :es256 ->

apps/astarte_pairing/test/support/helpers/fdo.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ defmodule Astarte.Helpers.FDO do
2424
import StreamData
2525

2626
alias Astarte.DataAccess.FDO.OwnershipVoucher, as: DBOwnershipVoucher
27-
alias Astarte.FDO.Core.OwnershipVoucher.CreateRequest
2827
alias Astarte.DataAccess.Realms.Realm
2928
alias Astarte.DataAccess.Repo
3029
alias Astarte.FDO.Core.Hash
3130
alias Astarte.FDO.Core.OwnershipVoucher
31+
alias Astarte.FDO.Core.OwnershipVoucher.CreateRequest
3232
alias Astarte.FDO.Core.OwnershipVoucher.RendezvousInfo
3333
alias Astarte.FDO.Core.OwnershipVoucher.RendezvousInfo.RendezvousDirective
3434
alias Astarte.FDO.Core.OwnershipVoucher.RendezvousInfo.RendezvousInstr

apps/astarte_pairing/test/test_helper.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Mimic.copy(Astarte.FDO.OwnerOnboarding.DeviceAttestation)
2828
Mimic.copy(Astarte.FDO.OwnershipVoucher)
2929
Mimic.copy(Astarte.FDO.Rendezvous)
3030
Mimic.copy(Astarte.FDO.Rendezvous.Client)
31+
Mimic.copy(Astarte.FDO.TO0)
3132
Mimic.copy(Astarte.FDO.ServiceInfo)
3233
Mimic.copy(Astarte.Pairing.Config)
3334
Mimic.copy(Astarte.Pairing.Queries)

libs/astarte_data_access/lib/astarte_data_access/fdo/ownership_voucher.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ defmodule Astarte.DataAccess.FDO.OwnershipVoucher do
3838
field :key_name, :string
3939
field :key_algorithm, Ecto.Enum, values: [es256: 0, es384: 1, rs256: 10, rs384: 11]
4040
field :replacement_guid, :binary
41-
field :replacement_rv_info, CBOREncoded, using: RendezvousInfo
42-
field :replacement_pub_key, CBOREncoded, using: PublicKey
41+
field :replacement_rendezvous_info, CBOREncoded, using: RendezvousInfo
42+
field :replacement_public_key, CBOREncoded, using: PublicKey
4343
end
4444

4545
@doc false
@@ -51,8 +51,8 @@ defmodule Astarte.DataAccess.FDO.OwnershipVoucher do
5151
:guid,
5252
:key_algorithm,
5353
:replacement_guid,
54-
:replacement_rv_info,
55-
:replacement_pub_key
54+
:replacement_rendezvous_info,
55+
:replacement_public_key
5656
])
5757
|> validate_required([:key_name, :key_algorithm, :voucher_data, :guid])
5858
end

libs/astarte_fdo/lib/owner_onboarding.ex

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -134,20 +134,21 @@ defmodule Astarte.FDO.OwnerOnboarding do
134134
def prove_device(realm_name, body, session) do
135135
guid = session.guid
136136

137-
# TODO: credential reuse requires also Owner2Key and/or rv info to be changed
138-
# for credential reuse; so far, there is no API to do so, so it-s limited to the guid
139-
140137
with {:ok, ownership_voucher} <- OwnershipVoucher.fetch(realm_name, guid),
138+
{:ok, ov_entry} <- fetch_ov_entry(realm_name, guid),
141139
{:ok, owner_key} <- Secrets.get_key_for_guid(realm_name, guid),
142140
{:ok, owner_public_key} <- OwnershipVoucher.owner_public_key(ownership_voucher) do
143-
rendezvous_info = ownership_voucher.header.rendezvous_info
141+
next_guid = ov_entry.replacement_guid || guid
142+
143+
next_rv_info =
144+
ov_entry.replacement_rendezvous_info || ownership_voucher.header.rendezvous_info
144145

145-
# {:ok, private_key} = COSE.Keys.from_pem(private_key)
146+
next_owner_pub_key = ov_entry.replacement_public_key || owner_public_key
146147

147148
connection_credentials = %{
148-
guid: guid,
149-
rendezvous_info: rendezvous_info,
150-
owner_pub_key: owner_public_key,
149+
guid: next_guid,
150+
rendezvous_info: next_rv_info,
151+
owner_pub_key: next_owner_pub_key,
151152
owner_private_key: owner_key,
152153
device_info: "owned by astarte - realm #{realm_name}.#{Config.base_url_domain!()}"
153154
}
@@ -252,11 +253,13 @@ defmodule Astarte.FDO.OwnerOnboarding do
252253
end
253254

254255
defp maybe_replace_voucher(realm_name, to2_session) do
255-
if not OwnershipVoucher.credential_reuse?(to2_session) do
256-
with {:ok, old_voucher} <-
257-
OwnershipVoucher.fetch(realm_name, to2_session.guid),
256+
{:ok, ov_entry} = fetch_ov_entry(realm_name, to2_session.guid)
257+
258+
if not OwnershipVoucher.credential_reuse?(ov_entry) do
259+
with {:ok, old_voucher} <- OwnershipVoucher.fetch(realm_name, to2_session.guid),
260+
# Passiamo sia la ov_entry (per le chiavi) che to2_session (per l'HMAC)
258261
{:ok, new_voucher} <-
259-
OwnershipVoucher.generate_replacement_voucher(old_voucher, to2_session) do
262+
OwnershipVoucher.generate_replacement_voucher(old_voucher, ov_entry, to2_session) do
260263
cbor_voucher = CoreOwnershipVoucher.cbor_encode(new_voucher)
261264

262265
Queries.add_output_voucher(
@@ -292,4 +295,15 @@ defmodule Astarte.FDO.OwnerOnboarding do
292295
defp build_done2_message(setup_dv_nonce) do
293296
%Done2Payload{:nonce_to2_setup_dv => setup_dv_nonce} |> Done2Payload.encode()
294297
end
298+
299+
defp fetch_ov_entry(realm_name, guid) do
300+
keyspace = Astarte.DataAccess.Realms.Realm.keyspace_name(realm_name)
301+
302+
case Astarte.DataAccess.Repo.get(Astarte.DataAccess.FDO.OwnershipVoucher, guid,
303+
prefix: keyspace
304+
) do
305+
nil -> {:error, :not_found}
306+
entry -> {:ok, entry}
307+
end
308+
end
295309
end

libs/astarte_fdo/lib/owner_onboarding/session.ex

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ defmodule Astarte.FDO.Core.OwnerOnboarding.Session do
3434
alias Astarte.FDO.Core.OwnerOnboarding.Session
3535
alias Astarte.FDO.Core.OwnerOnboarding.SessionKey
3636
alias Astarte.FDO.Core.OwnerOnboarding.SignatureInfo
37-
alias Astarte.FDO.Core.OwnershipVoucher.RendezvousInfo
38-
alias Astarte.FDO.Core.PublicKey
3937
alias Astarte.FDO.OwnerOnboarding.SessionToken
4038
alias COSE.Messages.Encrypt0
4139

@@ -59,9 +57,6 @@ defmodule Astarte.FDO.Core.OwnerOnboarding.Session do
5957
field :device_service_info, map() | nil
6058
field :owner_service_info, [binary()] | nil
6159
field :last_chunk_sent, non_neg_integer() | nil
62-
field :replacement_guid, binary() | nil
63-
field :replacement_rv_info, RendezvousInfo.t() | nil
64-
field :replacement_pub_key, PublicKey.t() | nil
6560
field :replacement_hmac, Hash.t() | nil
6661
end
6762

@@ -294,9 +289,6 @@ defmodule Astarte.FDO.Core.OwnerOnboarding.Session do
294289
device_service_info: device_service_info,
295290
owner_service_info: owner_service_info,
296291
last_chunk_sent: last_chunk_sent,
297-
# replacement_guid: replacement_guid,
298-
# replacement_rv_info: replacement_rv_info,
299-
# replacement_pub_key: replacement_pub_key,
300292
replacement_hmac: replacement_hmac
301293
} = database_session
302294

@@ -319,9 +311,6 @@ defmodule Astarte.FDO.Core.OwnerOnboarding.Session do
319311
device_service_info: device_service_info,
320312
owner_service_info: owner_service_info,
321313
last_chunk_sent: last_chunk_sent,
322-
# replacement_guid: replacement_guid,
323-
# replacement_rv_info: replacement_rv_info,
324-
# replacement_pub_key: replacement_pub_key,
325314
replacement_hmac: replacement_hmac
326315
}
327316

0 commit comments

Comments
 (0)