Skip to content

Commit a80ceb2

Browse files
committed
chore: forward port master
Signed-off-by: Francesco Noacco <francesco.noacco@secomind.com>
2 parents f11b412 + 2c49d2a commit a80ceb2

File tree

53 files changed

+2124
-1006
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+2124
-1006
lines changed

.github/workflows/astarte-end-to-end-test-workflow.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ jobs:
112112
- name: Checkout fdo e2e repo
113113
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
114114
with:
115-
repository: astarte-platform/astarte-device-fdo-rust
116-
ref: astarte-device-fdo-v1.0.0
115+
repository: noaccos/astarte-device-fdo-rust
116+
ref: push-mzlxtwylktkr
117117
- uses: ./.github/actions/install-deps
118118
- name: Install astartectl
119119
run: |

apps/astarte_housekeeping/lib/astarte_housekeeping/realms/queries.ex

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -625,9 +625,15 @@ defmodule Astarte.Housekeeping.Realms.Queries do
625625
defp create_ownership_vouchers_table(keyspace_name) do
626626
query = """
627627
CREATE TABLE #{keyspace_name}.ownership_vouchers (
628-
private_key blob,
629-
voucher_data blob,
630628
guid blob,
629+
voucher_data blob,
630+
output_voucher blob,
631+
replacement_guid blob,
632+
replacement_rendezvous_info blob,
633+
replacement_public_key blob,
634+
key_name varchar,
635+
key_algorithm int,
636+
user_id blob,
631637
PRIMARY KEY (guid)
632638
);
633639
"""
@@ -673,9 +679,6 @@ defmodule Astarte.Housekeeping.Realms.Queries do
673679
device_service_info map<tuple<text, text>, blob>,
674680
owner_service_info list<blob>,
675681
last_chunk_sent int,
676-
replacement_guid blob,
677-
replacement_rv_info blob,
678-
replacement_pub_key blob,
679682
replacement_hmac blob,
680683
PRIMARY KEY (guid)
681684
)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALTER TABLE :keyspace.to2_sessions
2+
DROP (replacement_guid, replacement_rv_info, replacement_pub_key)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALTER TABLE :keyspace.ownership_vouchers
2+
DROP private_key
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
ALTER TABLE :keyspace.ownership_vouchers
2+
ADD (
3+
replacement_guid blob,
4+
replacement_rendezvous_info blob,
5+
replacement_public_key blob,
6+
output_voucher blob,
7+
key_name varchar,
8+
key_algorithm int,
9+
user_id blob
10+
);

apps/astarte_pairing/lib/astarte_pairing/queries.ex

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ defmodule Astarte.Pairing.Queries do
207207
query =
208208
from o in OwnershipVoucher,
209209
prefix: ^keyspace_name,
210-
select: o.private_key
210+
select: o.key_name
211211

212212
consistency = Consistency.domain_model(:read)
213213

@@ -218,7 +218,7 @@ defmodule Astarte.Pairing.Queries do
218218
realm_name,
219219
guid,
220220
cbor_ownership_voucher,
221-
owner_private_key,
221+
key_name,
222222
ttl
223223
) do
224224
keyspace_name = Realm.keyspace_name(realm_name)
@@ -227,7 +227,7 @@ defmodule Astarte.Pairing.Queries do
227227

228228
%OwnershipVoucher{
229229
voucher_data: cbor_ownership_voucher,
230-
private_key: owner_private_key,
230+
key_name: key_name,
231231
guid: guid
232232
}
233233
|> Repo.insert(opts)
@@ -245,13 +245,15 @@ defmodule Astarte.Pairing.Queries do
245245
def replace_ownership_voucher(
246246
realm_name,
247247
guid,
248-
new_voucher,
249-
owner_private_key,
250-
ttl
248+
new_voucher
251249
) do
252-
with {:ok, _} <- delete_ownership_voucher(realm_name, guid) do
253-
create_ownership_voucher(realm_name, guid, new_voucher, owner_private_key, ttl)
254-
end
250+
keyspace = Realm.keyspace_name(realm_name)
251+
consistency = Consistency.device_info(:write)
252+
opts = [prefix: keyspace, consistency: consistency]
253+
254+
%OwnershipVoucher{guid: guid}
255+
|> Ecto.Changeset.change(output_voucher: new_voucher)
256+
|> Repo.update(opts)
255257
end
256258

257259
def store_session(realm_name, guid, session) do

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

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,26 +55,37 @@ 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
6262

63+
def get_keys_for_algorithm(conn, %{
64+
"realm_name" => realm_name,
65+
"key_algorithm" => key_algorithm
66+
}) do
67+
with {:ok, algorithm} <- Secrets.Core.string_to_key_type(key_algorithm),
68+
{:ok, keys} <- Secrets.Core.get_keys(realm_name, [algorithm]) do
69+
json(conn, %{data: keys})
70+
end
71+
end
72+
6373
def get_key(conn, %{
6474
"realm_name" => realm_name,
6575
"key_algorithm" => key_algorithm,
6676
"key_name" => key_name
6777
}) do
68-
with {:ok, algorithm_atom} <- Secrets.Core.string_to_key_type(key_algorithm) do
69-
case Secrets.Core.find_key(realm_name, algorithm_atom, key_name) do
70-
{:ok, key} ->
71-
json(conn, %{data: %{key_name: key.name, public_key: key.public_pem}})
78+
with {:ok, algorithm_atom} <- Secrets.Core.string_to_key_type(key_algorithm),
79+
{:ok, key} <- Secrets.Core.find_key(realm_name, key_name, algorithm_atom) do
80+
json(conn, %{data: %{key_name: key.name, public_key: key.public_pem}})
81+
else
82+
:error ->
83+
{:error, :unprocessable_key}
7284

73-
:not_found ->
74-
conn
75-
|> put_status(:not_found)
76-
|> json(%{errors: %{detail: "Key not found"}})
77-
end
85+
:not_found ->
86+
conn
87+
|> put_status(:not_found)
88+
|> json(%{errors: %{detail: "Key not found"}})
7889
end
7990
end
8091
end

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

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

22-
alias Astarte.DataAccess.FDO.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 """
62-
Validates an FDO Ownership Voucher load request.
30+
Validates an FDO Ownership Voucher load request and register the OV in the database.
6331
6432
Returns `200 OK` with the owner public key PEM on success.
6533
"""
6634
def register(conn, %{"data" => data, "realm_name" => realm_name}) do
6735
with {:ok, req} <-
6836
LoadRequest.changeset(%LoadRequest{}, Map.put(data, "realm_name", realm_name))
69-
|> Ecto.Changeset.apply_action(:insert) do
37+
|> Ecto.Changeset.apply_action(:insert),
38+
:ok <-
39+
OwnershipVoucher.save_voucher(realm_name, %{
40+
voucher_data: req.cbor_ownership_voucher,
41+
guid: req.device_guid,
42+
key_name: req.key_name,
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
7054
json(conn, %{
7155
data: %{
7256
public_key: req.extracted_owner_key.public_pem,
@@ -86,7 +70,7 @@ defmodule Astarte.PairingWeb.OwnershipVoucherController do
8670
with {:ok, pem} <- ensure_ownership_voucher_parameter(data),
8771
{:ok, voucher} <- OwnershipVoucher.decode_binary_voucher(pem),
8872
key_algorithm = OwnershipVoucher.key_algorithm(voucher),
89-
{: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
9074
json(conn, %{data: keys_map})
9175
end
9276
end

apps/astarte_pairing/lib/astarte_pairing_web/router.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ defmodule Astarte.PairingWeb.Router do
104104

105105
post "/owner_keys", OwnerKeyController, :create_or_upload_key
106106
get "/owner_keys", OwnerKeyController, :list_keys
107+
get "/owner_keys/:key_algorithm", OwnerKeyController, :get_keys_for_algorithm
107108
get "/owner_keys/:key_algorithm/:key_name", OwnerKeyController, :get_key
108109
post "/owner_keys_for_voucher", OwnershipVoucherController, :owner_keys_for_voucher
109110
post "/ownership_vouchers", OwnershipVoucherController, :register

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,8 @@ defmodule Astarte.PairingWeb.FDOOnboardingControllerTest do
156156
conn: conn,
157157
create_path: path,
158158
message_id: id,
159-
session: session,
160-
realm_name: realm,
161-
owner_key_pem: owner_key_pem,
162-
cbor_ownership_voucher: cbor_ownership_voucher
159+
session: session
163160
} do
164-
insert_voucher(realm, owner_key_pem, cbor_ownership_voucher, session.guid)
165-
166161
request_body = Session.encrypt_and_sign(session, CBOR.encode(%{prove: "device"}))
167162
conn = post(conn, path, request_body)
168163
assert {100, id} == assert_cbor_error(conn)

0 commit comments

Comments
 (0)