Skip to content

Commit afc0ab0

Browse files
committed
feat(pairing) add max payload size to session and save accordingly
Signed-off-by: Eddy Babetto <eddy.babetto@secomind.com>
1 parent 022298d commit afc0ab0

8 files changed

Lines changed: 85 additions & 8 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,7 @@ defmodule Astarte.Housekeeping.Realms.Queries do
575575
prove_dv_nonce blob,
576576
kex_suite_name ascii,
577577
cipher_suite_name int,
578+
max_service_info int,
578579
owner_random blob,
579580
secret blob,
580581
sevk blob,

apps/astarte_housekeeping/priv/migrations/realm/0010_create_device_session_table.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ CREATE TABLE :keyspace.to2_sessions (
77
prove_dv_nonce blob,
88
kex_suite_name ascii,
99
cipher_suite_name int,
10+
max_service_info int,
1011
owner_random blob,
1112
secret blob,
1213
sevk blob,

apps/astarte_pairing/lib/astarte_pairing/fdo/owner_onboarding/session.ex

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ defmodule Astarte.Pairing.FDO.OwnerOnboarding.Session do
4040
field :sevk, struct() | nil
4141
field :svk, struct() | nil
4242
field :sek, struct() | nil
43+
field :max_service_info, integer() | nil
4344
end
4445

4546
def new(realm_name, hello_device, ownership_voucher, owner_key) do
@@ -144,7 +145,8 @@ defmodule Astarte.Pairing.FDO.OwnerOnboarding.Session do
144145
secret: secret,
145146
sevk: sevk,
146147
svk: svk,
147-
sek: sek
148+
sek: sek,
149+
max_service_info: max_service_info
148150
} = database_session
149151

150152
session = %Session{
@@ -158,7 +160,8 @@ defmodule Astarte.Pairing.FDO.OwnerOnboarding.Session do
158160
secret: secret,
159161
sevk: SessionKey.from_db(sevk),
160162
svk: SessionKey.from_db(svk),
161-
sek: SessionKey.from_db(sek)
163+
sek: SessionKey.from_db(sek),
164+
max_service_info: max_service_info
162165
}
163166

164167
{:ok, session}

apps/astarte_pairing/lib/astarte_pairing/fdo/service_info.ex

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,23 @@
1919
defmodule Astarte.Pairing.FDO.ServiceInfo do
2020
alias Astarte.Pairing.FDO.OwnershipVoucher
2121
alias Astarte.Pairing.FDO.OwnerOnboarding.DeviceServiceInfoReady
22+
alias Astarte.Pairing.Queries
2223

2324
@owner_max_service_info 4096
2425

2526
def handle_msg_66(
27+
realm_name,
28+
session_key,
2629
%DeviceServiceInfoReady{
2730
replacement_hmac: replacement_hmac,
28-
max_owner_service_info_sz: _device_max_size
31+
max_owner_service_info_sz: device_max_size
2932
},
3033
%OwnershipVoucher{} = old_voucher
3134
) do
3235
with {:ok, _new_voucher} <-
33-
OwnershipVoucher.generate_replacement_voucher(old_voucher, replacement_hmac) do
34-
# TODO: Store `new_voucher` and `device_max_size` in the Session or DB.
36+
OwnershipVoucher.generate_replacement_voucher(old_voucher, replacement_hmac),
37+
:ok <- Queries.update_session_max_payload(realm_name, session_key, device_max_size) do
38+
# TODO: Store `new_voucher` into DB.
3539

3640
msg_67_payload = [@owner_max_service_info]
3741

@@ -43,13 +47,17 @@ defmodule Astarte.Pairing.FDO.ServiceInfo do
4347
end
4448

4549
def handle_msg_66(
50+
_,
51+
_,
4652
%DeviceServiceInfoReady{},
4753
_
4854
) do
4955
{:error, :invalid_device_voucher}
5056
end
5157

5258
def handle_msg_66(
59+
_,
60+
_,
5361
_,
5462
%OwnershipVoucher{}
5563
) do

apps/astarte_pairing/lib/astarte_pairing/queries.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,11 @@ defmodule Astarte.Pairing.Queries do
293293
end
294294
end
295295

296+
def update_session_max_payload(realm_name, session_key, size) do
297+
updates = [max_service_info: size]
298+
update_session(realm_name, session_key, updates)
299+
end
300+
296301
def add_session_secret(realm_name, session_key, secret) do
297302
updates = [secret: secret]
298303
update_session(realm_name, session_key, updates)

apps/astarte_pairing/test/astarte_pairing/fdo/service_info_test.ex

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,40 @@
1717
#
1818

1919
defmodule Astarte.Pairing.FDO.ServiceInfoTest do
20-
use ExUnit.Case
20+
use Astarte.Cases.Data, async: true
21+
use Astarte.Cases.Device
2122
doctest Astarte.Pairing.FDO.ServiceInfo
2223

2324
alias Astarte.Pairing.FDO.ServiceInfo
2425
alias Astarte.Pairing.FDO.OwnerOnboarding.DeviceServiceInfoReady
26+
alias Astarte.Pairing.FDO.OwnerOnboarding.HelloDevice
27+
alias Astarte.Pairing.FDO.OwnerOnboarding.SessionKey
2528
alias Astarte.Pairing.FDO.OwnershipVoucher
2629
alias COSE.Messages.Encrypt0
30+
alias Astarte.Pairing.FDO.OwnerOnboarding.Session
2731
alias COSE.Keys
32+
import Astarte.Helpers.FDO
2833

2934
@owner_max_service_info 4096
3035
@aes_256_gcm :aes_256_gcm
3136

37+
setup_all do
38+
hello_device = HelloDevice.generate()
39+
ownership_voucher = sample_ownership_voucher()
40+
owner_key = sample_extracted_private_key()
41+
device_key = COSE.Keys.ECC.generate(:es256)
42+
{:ok, device_random, xb} = SessionKey.new(hello_device.kex_name, device_key)
43+
44+
%{
45+
hello_device: hello_device,
46+
ownership_voucher: ownership_voucher,
47+
owner_key: owner_key,
48+
device_key: device_key,
49+
device_random: device_random,
50+
xb: xb
51+
}
52+
end
53+
3254
setup do
3355
header_list = [
3456
# prot_ver
@@ -60,13 +82,22 @@ defmodule Astarte.Pairing.FDO.ServiceInfoTest do
6082

6183
describe "handle_msg_66/4" do
6284
test "successfully processes Msg 66, creates new voucher, and returns Msg 67", %{
85+
realm: realm_name,
86+
hello_device: hello_device,
87+
owner_key: owner_key,
88+
ownership_voucher: ownership_voucher,
6389
old_voucher: old_voucher
6490
} do
91+
{:ok, session} =
92+
Session.new(realm_name, hello_device, ownership_voucher, owner_key)
93+
6594
new_hmac = :crypto.strong_rand_bytes(32)
6695
device_max_size = 2048
6796

6897
assert {:ok, result_msg_67} =
6998
ServiceInfo.handle_msg_66(
99+
realm_name,
100+
session.key,
70101
%DeviceServiceInfoReady{
71102
replacement_hmac: new_hmac,
72103
max_owner_service_info_sz: device_max_size
@@ -78,10 +109,19 @@ defmodule Astarte.Pairing.FDO.ServiceInfoTest do
78109
end
79110

80111
test "handles Credential Reuse (nil HMAC) correctly", %{
112+
realm: realm_name,
113+
hello_device: hello_device,
114+
owner_key: owner_key,
115+
ownership_voucher: ownership_voucher,
81116
old_voucher: old_voucher
82117
} do
118+
{:ok, session} =
119+
Session.new(realm_name, hello_device, ownership_voucher, owner_key)
120+
83121
assert {:ok, _result} =
84122
ServiceInfo.handle_msg_66(
123+
realm_name,
124+
session.key,
85125
%DeviceServiceInfoReady{
86126
replacement_hmac: nil,
87127
max_owner_service_info_sz: 2048
@@ -91,20 +131,37 @@ defmodule Astarte.Pairing.FDO.ServiceInfoTest do
91131
end
92132

93133
test "returns error if inner CBOR payload is malformed", %{
134+
realm: realm_name,
135+
hello_device: hello_device,
136+
owner_key: owner_key,
137+
ownership_voucher: ownership_voucher,
94138
old_voucher: old_voucher
95139
} do
140+
{:ok, session} =
141+
Session.new(realm_name, hello_device, ownership_voucher, owner_key)
142+
96143
malformed_payload = "not_a_valid_payload"
97144

98-
result = ServiceInfo.handle_msg_66(malformed_payload, old_voucher)
145+
result = ServiceInfo.handle_msg_66(realm_name, session.key, malformed_payload, old_voucher)
99146

100147
assert {:error, :invalid_payload} = result
101148
end
102149

103-
test "returns error if old voucher is invalid" do
150+
test "returns error if old voucher is invalid", %{
151+
realm: realm_name,
152+
hello_device: hello_device,
153+
owner_key: owner_key,
154+
ownership_voucher: ownership_voucher
155+
} do
104156
invalid_voucher = CBOR.encode("not a voucher")
105157

158+
{:ok, session} =
159+
Session.new(realm_name, hello_device, ownership_voucher, owner_key)
160+
106161
result =
107162
ServiceInfo.handle_msg_66(
163+
realm_name,
164+
session.key,
108165
%DeviceServiceInfoReady{
109166
replacement_hmac: :crypto.strong_rand_bytes(32),
110167
max_owner_service_info_sz: 1024

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ defmodule Astarte.Helpers.Database do
9494
prove_dv_nonce blob,
9595
kex_suite_name ascii,
9696
cipher_suite_name int,
97+
max_service_info int,
9798
owner_random blob,
9899
secret blob,
99100
sevk blob,

libs/astarte_data_access/lib/astarte_data_access/fdo/to2_session.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,6 @@ defmodule Astarte.DataAccess.FDO.TO2Session do
5252
field :sevk, :binary
5353
field :svk, :binary
5454
field :sek, :binary
55+
field :max_service_info, :integer
5556
end
5657
end

0 commit comments

Comments
 (0)