@@ -965,34 +965,46 @@ where
965
965
}
966
966
let mut res: Option < FailureLearnings > = None ;
967
967
let mut htlc_msat = * first_hop_htlc_msat;
968
- let mut error_code_ret = None ;
969
- let mut error_packet_ret = None ;
968
+ let mut _error_code_ret = None ;
969
+ let mut _error_packet_ret = None ;
970
970
let mut is_from_final_node = false ;
971
971
972
972
const BADONION : u16 = 0x8000 ;
973
973
const PERM : u16 = 0x4000 ;
974
974
const NODE : u16 = 0x2000 ;
975
975
const UPDATE : u16 = 0x1000 ;
976
976
977
+ let mut onion_keys = Vec :: with_capacity ( path. hops . len ( ) ) ;
978
+ construct_onion_keys_generic_callback (
979
+ secp_ctx,
980
+ & path. hops ,
981
+ path. blinded_tail . as_ref ( ) ,
982
+ session_priv,
983
+ |shared_secret, _, _, route_hop_option : Option < & RouteHop > , _| {
984
+ onion_keys. push ( ( route_hop_option. cloned ( ) , shared_secret) )
985
+ } ,
986
+ )
987
+ . expect ( "Route we used spontaneously grew invalid keys in the middle of it?" ) ;
988
+
977
989
// Handle packed channel/node updates for passing back for the route handler
978
- let callback = |shared_secret , _ , _ , route_hop_opt : Option < & RouteHop > , route_hop_idx| {
990
+ for ( route_hop_idx , ( route_hop_option , shared_secret ) ) in onion_keys . into_iter ( ) . enumerate ( ) {
979
991
if res. is_some ( ) {
980
- return ;
992
+ break ;
981
993
}
982
994
983
- let route_hop = match route_hop_opt {
995
+ let route_hop = match route_hop_option . as_ref ( ) {
984
996
Some ( hop) => hop,
985
997
None => {
986
998
// Got an error from within a blinded route.
987
- error_code_ret = Some ( BADONION | PERM | 24 ) ; // invalid_onion_blinding
988
- error_packet_ret = Some ( vec ! [ 0 ; 32 ] ) ;
999
+ _error_code_ret = Some ( BADONION | PERM | 24 ) ; // invalid_onion_blinding
1000
+ _error_packet_ret = Some ( vec ! [ 0 ; 32 ] ) ;
989
1001
res = Some ( FailureLearnings {
990
1002
network_update : None ,
991
1003
short_channel_id : None ,
992
1004
payment_failed_permanently : false ,
993
1005
failed_within_blinded_path : true ,
994
1006
} ) ;
995
- return ;
1007
+ break ;
996
1008
} ,
997
1009
} ;
998
1010
@@ -1010,8 +1022,8 @@ where
1010
1022
// The failing hop is within a multi-hop blinded path.
1011
1023
#[ cfg( not( test) ) ]
1012
1024
{
1013
- error_code_ret = Some ( BADONION | PERM | 24 ) ; // invalid_onion_blinding
1014
- error_packet_ret = Some ( vec ! [ 0 ; 32 ] ) ;
1025
+ _error_code_ret = Some ( BADONION | PERM | 24 ) ; // invalid_onion_blinding
1026
+ _error_packet_ret = Some ( vec ! [ 0 ; 32 ] ) ;
1015
1027
}
1016
1028
#[ cfg( test) ]
1017
1029
{
@@ -1022,10 +1034,10 @@ where
1022
1034
& encrypted_packet,
1023
1035
) )
1024
1036
. unwrap ( ) ;
1025
- error_code_ret = Some ( u16:: from_be_bytes (
1037
+ _error_code_ret = Some ( u16:: from_be_bytes (
1026
1038
err_packet. failuremsg . get ( 0 ..2 ) . unwrap ( ) . try_into ( ) . unwrap ( ) ,
1027
1039
) ) ;
1028
- error_packet_ret = Some ( err_packet. failuremsg [ 2 ..] . to_vec ( ) ) ;
1040
+ _error_packet_ret = Some ( err_packet. failuremsg [ 2 ..] . to_vec ( ) ) ;
1029
1041
}
1030
1042
1031
1043
res = Some ( FailureLearnings {
@@ -1034,7 +1046,7 @@ where
1034
1046
payment_failed_permanently : false ,
1035
1047
failed_within_blinded_path : true ,
1036
1048
} ) ;
1037
- return ;
1049
+ break ;
1038
1050
} ,
1039
1051
}
1040
1052
} ;
@@ -1049,7 +1061,7 @@ where
1049
1061
hmac. input ( & encrypted_packet[ 32 ..] ) ;
1050
1062
1051
1063
if !fixed_time_eq ( & Hmac :: from_engine ( hmac) . to_byte_array ( ) , & encrypted_packet[ ..32 ] ) {
1052
- return ;
1064
+ continue ;
1053
1065
}
1054
1066
1055
1067
let err_packet =
@@ -1069,7 +1081,7 @@ where
1069
1081
payment_failed_permanently : is_from_final_node,
1070
1082
failed_within_blinded_path : false ,
1071
1083
} ) ;
1072
- return ;
1084
+ break ;
1073
1085
} ,
1074
1086
} ;
1075
1087
@@ -1091,13 +1103,13 @@ where
1091
1103
payment_failed_permanently : is_from_final_node,
1092
1104
failed_within_blinded_path : false ,
1093
1105
} ) ;
1094
- return ;
1106
+ break ;
1095
1107
} ,
1096
1108
} ;
1097
1109
1098
1110
let error_code = u16:: from_be_bytes ( error_code_slice. try_into ( ) . expect ( "len is 2" ) ) ;
1099
- error_code_ret = Some ( error_code) ;
1100
- error_packet_ret = Some ( err_packet. failuremsg [ 2 ..] . to_vec ( ) ) ;
1111
+ _error_code_ret = Some ( error_code) ;
1112
+ _error_packet_ret = Some ( err_packet. failuremsg [ 2 ..] . to_vec ( ) ) ;
1101
1113
1102
1114
let ( debug_field, debug_field_size) = errors:: get_onion_debug_field ( error_code) ;
1103
1115
@@ -1208,16 +1220,7 @@ where
1208
1220
description
1209
1221
) ;
1210
1222
}
1211
- } ;
1212
-
1213
- construct_onion_keys_generic_callback (
1214
- secp_ctx,
1215
- & path. hops ,
1216
- path. blinded_tail . as_ref ( ) ,
1217
- session_priv,
1218
- callback,
1219
- )
1220
- . expect ( "Route we used spontaneously grew invalid keys in the middle of it?" ) ;
1223
+ }
1221
1224
1222
1225
if let Some ( FailureLearnings {
1223
1226
network_update,
@@ -1232,9 +1235,9 @@ where
1232
1235
payment_failed_permanently,
1233
1236
failed_within_blinded_path,
1234
1237
#[ cfg( any( test, feature = "_test_utils" ) ) ]
1235
- onion_error_code : error_code_ret ,
1238
+ onion_error_code : _error_code_ret ,
1236
1239
#[ cfg( any( test, feature = "_test_utils" ) ) ]
1237
- onion_error_data : error_packet_ret ,
1240
+ onion_error_data : _error_packet_ret ,
1238
1241
}
1239
1242
} else {
1240
1243
// only not set either packet unparseable or hmac does not match with any
0 commit comments