@@ -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
295309end
0 commit comments