Crypto-Utils
view release on metacpan or search on metacpan
t/15.opaque-sigma_i.t view on Meta::CPAN
'create_credential_response'
);
my $other_data_b =
encode_cbor( [ @{$cred_res_r}{qw/Z masking_nonce masked_response/} ] );
### b_send_msg2
my $b_send_msg2_r = b_send_msg2(
$group_name, $b_recv_msg1_r, $id_b,
"$Bin/opaque-b_s_priv.pem", $random_range, $point_compress_t,
$hash_name, $key_len, \&encode_cbor,
$mac_func, $sign_func, $enc_func,
$ctx, $other_data_b,
);
my ( $nb, $ek_key_b_r, $derive_key_b_r, $msg2 ) =
@{$b_send_msg2_r}{qw/nb y_r derive_key msg2/};
my ( $b_z, $b_ke, $b_km ) = @{$derive_key_b_r}{qw/z ke km/};
my ( $b_recv_na, $b_recv_ek_a_pub, $b_recv_ek_a_pub_pkey ) =
@{$b_recv_msg1_r}{qw/na gx gx_pkey/};
my ( $ek_b, $ek_b_priv, $ek_b_pub, $ek_b_pub_hex_compressed, $ek_b_pub_pkey,
$ek_b_priv_pkey )
= @{$ek_key_b_r}{qw/priv_key priv_bn pub_point pub_hex pub_pkey priv_pkey/};
### $id_b
### $other_data_b
### nb: BN_bn2hex($nb)
write_pubkey_to_pem( "$Bin/opaque-b_ek_pub.pem", $ek_b_pub_pkey );
### $ek_b_pub_hex_compressed
write_key_to_pem( "$Bin/opaque-b_ek_priv.pem", $ek_b_priv_pkey );
### ek_b_priv: BN_bn2hex($ek_b_priv)
### msg2: unpack("H*", $msg2)
# }
# a -> b { ENC{ A, SigA(MAC(0, nb, A, g^x)) }
my $a_recv_msg2_r =
a_recv_msg2( $group_name, $msg1_r, $msg2, $hash_name, $key_len, \&decode_cbor,
$dec_func, $ctx, );
my $a_recv_other_data_b = $a_recv_msg2_r->{other_data_b};
my $cred_res_arr = decode_cbor $a_recv_other_data_b;
my $a_recv_cred_res_r = {
Z => $cred_res_arr->[0],
masking_nonce => $cred_res_arr->[1],
masked_response => $cred_res_arr->[2]
};
my $unpack_func = sub {
my ($r) = @_;
my $s_pub = substr $r, 0, 33;
my $nonce = substr $r, 33, 32;
my $auth_tag = substr $r, 65, 32;
### r: unpack("H*", $r)
### s_pub: unpack("H*", $s_pub)
### nonce: unpack("H*", $nonce)
### auth_tag: unpack("H*", $auth_tag)
return [ $s_pub, $nonce, $auth_tag ];
};
my $recover_r = recover_credentials(
$cred_req_r, $a_recv_cred_res_r, $pwd,
$id_a, $a_recv_msg2_r->{id_b}, $Nseed,
$group_name, $finalize_info, $finalize_DST,
$hash_name, $expand_message_func, $mac_func,
$pwd_harden_func, $unpack_func
);
is(
$recover_r->{export_key},
pack( "H*",
'77869b0d11debf6fc88c1d192dde9546baf528b2f70c2aea89960fc2178586da' ),
'recover_credentials'
);
is(
BN_bn2hex( $recover_r->{c_priv} ),
'D1D280F712E4EBF3C881C686E13C281BC3A3FAB30A00411A350F4F8B7A1EA550',
'recover_credentials'
);
my $a_recover_a_s_priv_pkey =
gen_ec_key( $group_name, BN_bn2hex( $recover_r->{c_priv} ) );
write_key_to_pem( "$Bin/opaque-a_recover_c_s_priv.pem",
$a_recover_a_s_priv_pkey );
my $a_recover_b_s_pub_pkey =
gen_ec_pubkey( $group_name, unpack( "H*", $recover_r->{s_pub} ) );
write_pubkey_to_pem( "$Bin/opaque-a_recover_b_s_pub.pem",
$a_recover_b_s_pub_pkey );
my $a_verify_msg2 =
a_verify_msg2( $msg1_r, $a_recv_msg2_r, "$Bin/opaque-a_recover_b_s_pub.pem",
\&encode_cbor, $mac_func, $sig_verify_func, );
my $a_recv_ek_b_pub_pkey =
gen_ec_pubkey( $group_name, unpack( "H*", $a_recv_msg2_r->{gy} ) );
write_pubkey_to_pem( "$Bin/opaque-a_recv_b_ek_pub.pem", $a_recv_ek_b_pub_pkey );
my $a_send_msg3 = a_send_msg3(
$id_a,
"$Bin/opaque-a_recover_c_s_priv.pem",
$msg1_r,
$a_recv_msg2_r,
\&encode_cbor,
$mac_func,
$sign_func,
$enc_func,
);
### a_send_msg3: unpack("H*", $a_send_msg3)
# }
# b recv a { MAC(2, na, "ack")
my $msg3_verify_res = b_recv_msg3(
$b_recv_msg1_r, $b_send_msg2_r,
$a_send_msg3, "$Bin/opaque-b_recv_a_s_pub.pem",
\&encode_cbor, \&decode_cbor,
$mac_func, $sig_verify_func,
$dec_func,
);
### $msg3_verify_res
my $mac4 =
b_send_msg4( $b_recv_msg1_r, $b_send_msg2_r, \&encode_cbor, $mac_func );
### mac4: unpack("H*", $mac4)
# }
# a recv b {
my $res_msg4 =
a_recv_msg4( $mac4, $na, $a_recv_msg2_r, \&encode_cbor, $mac_func );
### $res_msg4
# }
# ks {
my $b_ks = derive_ks( $b_z, $b_recv_na, BN_bn2bin($nb), $hash_name, $key_len );
### b_ks: unpack("H*", $b_ks)
my $a_ks = derive_ks( $a_recv_msg2_r->{derive_key}{z},
BN_bn2bin($na), $a_recv_msg2_r->{nb}, $hash_name, $key_len );
( run in 0.815 second using v1.01-cache-2.11-cpan-f4a522933cf )