@@ -140,20 +140,19 @@ impl Metadata {
140
140
}
141
141
142
142
pub fn derive_from < W : Writeable , T : secp256k1:: Signing > (
143
- self , tlv_stream : W , secp_ctx : Option < & Secp256k1 < T > >
143
+ self , iv_bytes : & [ u8 ; IV_LEN ] , tlv_stream : W , secp_ctx : Option < & Secp256k1 < T > >
144
144
) -> ( Self , Option < Keypair > ) {
145
145
match self {
146
146
Metadata :: Bytes ( _) => ( self , None ) ,
147
147
Metadata :: RecipientData ( _) => { debug_assert ! ( false ) ; ( self , None ) } ,
148
148
Metadata :: PayerData ( _) => { debug_assert ! ( false ) ; ( self , None ) } ,
149
- Metadata :: Derived ( mut metadata_material) => {
150
- tlv_stream. write ( & mut metadata_material. hmac ) . unwrap ( ) ;
151
- ( Metadata :: Bytes ( metadata_material. derive_metadata ( ) ) , None )
149
+ Metadata :: Derived ( metadata_material) => {
150
+ ( Metadata :: Bytes ( metadata_material. derive_metadata ( iv_bytes, tlv_stream) ) , None )
152
151
} ,
153
- Metadata :: DerivedSigningPubkey ( mut metadata_material) => {
154
- tlv_stream. write ( & mut metadata_material. hmac ) . unwrap ( ) ;
152
+ Metadata :: DerivedSigningPubkey ( metadata_material) => {
155
153
let secp_ctx = secp_ctx. unwrap ( ) ;
156
- let ( metadata, keys) = metadata_material. derive_metadata_and_keys ( secp_ctx) ;
154
+ let ( metadata, keys) =
155
+ metadata_material. derive_metadata_and_keys ( iv_bytes, tlv_stream, secp_ctx) ;
157
156
( Metadata :: Bytes ( metadata) , Some ( keys) )
158
157
} ,
159
158
}
@@ -217,23 +216,24 @@ pub(super) struct MetadataMaterial {
217
216
}
218
217
219
218
impl MetadataMaterial {
220
- pub fn new (
221
- nonce : Nonce , expanded_key : & ExpandedKey , iv_bytes : & [ u8 ; IV_LEN ] ,
222
- payment_id : Option < PaymentId >
223
- ) -> Self {
219
+ pub fn new ( nonce : Nonce , expanded_key : & ExpandedKey , payment_id : Option < PaymentId > ) -> Self {
224
220
// Encrypt payment_id
225
221
let encrypted_payment_id = payment_id. map ( |payment_id| {
226
222
expanded_key. crypt_for_offer ( payment_id. 0 , nonce)
227
223
} ) ;
228
224
229
225
Self {
230
226
nonce,
231
- hmac : expanded_key. hmac_for_offer ( nonce , iv_bytes ) ,
227
+ hmac : expanded_key. hmac_for_offer ( ) ,
232
228
encrypted_payment_id,
233
229
}
234
230
}
235
231
236
- fn derive_metadata ( mut self ) -> Vec < u8 > {
232
+ fn derive_metadata < W : Writeable > ( mut self , iv_bytes : & [ u8 ; IV_LEN ] , tlv_stream : W ) -> Vec < u8 > {
233
+ self . hmac . input ( iv_bytes) ;
234
+ self . hmac . input ( & self . nonce . 0 ) ;
235
+ tlv_stream. write ( & mut self . hmac ) . unwrap ( ) ;
236
+
237
237
self . hmac . input ( DERIVED_METADATA_HMAC_INPUT ) ;
238
238
self . maybe_include_encrypted_payment_id ( ) ;
239
239
@@ -243,9 +243,13 @@ impl MetadataMaterial {
243
243
bytes
244
244
}
245
245
246
- fn derive_metadata_and_keys < T : secp256k1:: Signing > (
247
- mut self , secp_ctx : & Secp256k1 < T >
246
+ fn derive_metadata_and_keys < W : Writeable , T : secp256k1:: Signing > (
247
+ mut self , iv_bytes : & [ u8 ; IV_LEN ] , tlv_stream : W , secp_ctx : & Secp256k1 < T >
248
248
) -> ( Vec < u8 > , Keypair ) {
249
+ self . hmac . input ( iv_bytes) ;
250
+ self . hmac . input ( & self . nonce . 0 ) ;
251
+ tlv_stream. write ( & mut self . hmac ) . unwrap ( ) ;
252
+
249
253
self . hmac . input ( DERIVED_METADATA_AND_KEYS_HMAC_INPUT ) ;
250
254
self . maybe_include_encrypted_payment_id ( ) ;
251
255
@@ -271,9 +275,12 @@ impl MetadataMaterial {
271
275
272
276
pub ( super ) fn derive_keys ( nonce : Nonce , expanded_key : & ExpandedKey ) -> Keypair {
273
277
const IV_BYTES : & [ u8 ; IV_LEN ] = b"LDK Invoice ~~~~" ;
278
+ let mut hmac = expanded_key. hmac_for_offer ( ) ;
279
+ hmac. input ( IV_BYTES ) ;
280
+ hmac. input ( & nonce. 0 ) ;
281
+
274
282
let secp_ctx = Secp256k1 :: new ( ) ;
275
- let hmac = Hmac :: from_engine ( expanded_key. hmac_for_offer ( nonce, IV_BYTES ) ) ;
276
- let privkey = SecretKey :: from_slice ( hmac. as_byte_array ( ) ) . unwrap ( ) ;
283
+ let privkey = SecretKey :: from_slice ( Hmac :: from_engine ( hmac) . as_byte_array ( ) ) . unwrap ( ) ;
277
284
Keypair :: from_secret_key ( & secp_ctx, & privkey)
278
285
}
279
286
@@ -368,7 +375,9 @@ fn hmac_for_message<'a>(
368
375
Ok ( nonce) => nonce,
369
376
Err ( _) => return Err ( ( ) ) ,
370
377
} ;
371
- let mut hmac = expanded_key. hmac_for_offer ( nonce, iv_bytes) ;
378
+ let mut hmac = expanded_key. hmac_for_offer ( ) ;
379
+ hmac. input ( iv_bytes) ;
380
+ hmac. input ( & nonce. 0 ) ;
372
381
373
382
for record in tlv_stream {
374
383
hmac. input ( record. record_bytes ) ;
0 commit comments