1
1
use super :: shared:: * ;
2
+ use crate :: ZeroTouchError ;
2
3
use lakers_shared:: { Crypto as CryptoTrait , * } ;
3
4
4
5
#[ derive( Debug ) ]
@@ -67,16 +68,19 @@ impl ZeroTouchDeviceWaitEAD2 {
67
68
crypto : & mut Crypto ,
68
69
ead_2 : EADItem ,
69
70
cred_v : & [ u8 ] ,
70
- ) -> Result < ZeroTouchDeviceDone , ( ) > {
71
- if ead_2. label != EAD_ZEROCONF_LABEL || ead_2 . value . is_none ( ) {
72
- return Err ( ( ) ) ;
71
+ ) -> Result < ZeroTouchDeviceDone , ZeroTouchError > {
72
+ if ead_2. label != EAD_ZEROCONF_LABEL {
73
+ return Err ( ZeroTouchError :: InvalidEADLabel ) ;
73
74
}
75
+ let Some ( ead_2_value_buffer) = ead_2. value else {
76
+ return Err ( ZeroTouchError :: EmptyEADValue ) ;
77
+ } ;
74
78
let mut ead_2_value: BytesEncodedVoucher = Default :: default ( ) ;
75
- ead_2_value[ ..] . copy_from_slice ( & ead_2 . value . unwrap ( ) . content [ ..ENCODED_VOUCHER_LEN ] ) ;
79
+ ead_2_value[ ..] . copy_from_slice ( & ead_2_value_buffer . content [ ..ENCODED_VOUCHER_LEN ] ) ;
76
80
77
81
match verify_voucher ( crypto, & ead_2_value, & self . h_message_1 , cred_v, & self . prk ) {
78
82
Ok ( voucher) => Ok ( ZeroTouchDeviceDone { voucher } ) ,
79
- Err ( _ ) => Err ( ( ) ) ,
83
+ Err ( error ) => Err ( error ) ,
80
84
}
81
85
}
82
86
}
@@ -128,6 +132,23 @@ fn encode_ead_1_value(
128
132
output
129
133
}
130
134
135
+ pub ( crate ) fn verify_voucher < Crypto : CryptoTrait > (
136
+ crypto : & mut Crypto ,
137
+ received_voucher : & BytesEncodedVoucher ,
138
+ h_message_1 : & BytesHashLen ,
139
+ cred_v : & [ u8 ] ,
140
+ prk : & BytesHashLen ,
141
+ ) -> Result < BytesMac , ZeroTouchError > {
142
+ let prepared_voucher = & prepare_voucher ( crypto, h_message_1, cred_v, prk) ;
143
+ if received_voucher == prepared_voucher {
144
+ let mut voucher_mac: BytesMac = Default :: default ( ) ;
145
+ voucher_mac[ ..MAC_LENGTH ] . copy_from_slice ( & prepared_voucher[ 1 ..1 + MAC_LENGTH ] ) ;
146
+ return Ok ( voucher_mac) ;
147
+ } else {
148
+ return Err ( ZeroTouchError :: VoucherVerificationFailed ) ;
149
+ }
150
+ }
151
+
131
152
#[ cfg( test) ]
132
153
mod test_device {
133
154
use super :: * ;
@@ -166,7 +187,7 @@ mod test_device {
166
187
167
188
#[ test]
168
189
fn test_verify_voucher ( ) {
169
- let voucher_tv = VOUCHER_TV . try_into ( ) . unwrap ( ) ;
190
+ let mut voucher_tv = VOUCHER_TV . try_into ( ) . unwrap ( ) ;
170
191
let h_message_1_tv = H_MESSAGE_1_TV . try_into ( ) . unwrap ( ) ;
171
192
let prk_tv = PRK_TV . try_into ( ) . unwrap ( ) ;
172
193
let voucher_mac_tv: BytesMac = VOUCHER_MAC_TV . try_into ( ) . unwrap ( ) ;
@@ -180,6 +201,16 @@ mod test_device {
180
201
) ;
181
202
assert ! ( res. is_ok( ) ) ;
182
203
assert_eq ! ( res. unwrap( ) , voucher_mac_tv) ;
204
+
205
+ voucher_tv[ 0 ] ^= 0x01 ; // change a byte to make the voucher invalid
206
+ let res = verify_voucher (
207
+ & mut default_crypto ( ) ,
208
+ & voucher_tv,
209
+ & h_message_1_tv,
210
+ & CRED_V_TV ,
211
+ & prk_tv,
212
+ ) ;
213
+ assert_eq ! ( res, Err ( ZeroTouchError :: VoucherVerificationFailed ) ) ;
183
214
}
184
215
185
216
#[ test]
0 commit comments