use
Crypt::PK::DSA
qw(dsa_encrypt dsa_decrypt dsa_sign_message dsa_verify_message dsa_sign_hash dsa_verify_hash)
;
{
my
$k
;
$k
= Crypt::PK::DSA->new(
't/data/cryptx_priv_dsa1.der'
);
ok(
$k
,
'load cryptx_priv_dsa1.der'
);
ok(
$k
->is_private,
'is_private cryptx_priv_dsa1.der'
);
is(
$k
->size, 256,
'size'
);
is(
uc
(
$k
->key2hash->{x}),
'6C801901AC74E2DC714D75A9F6969483CF0239D142AB7E3F329ED8D49E07'
,
'key2hash'
);
$k
= Crypt::PK::DSA->new(
't/data/cryptx_priv_dsa2.der'
);
ok(
$k
,
'load cryptx_priv_dsa2.der'
);
ok(
$k
->is_private,
'is_private cryptx_priv_dsa2.der'
);
$k
= Crypt::PK::DSA->new(
't/data/cryptx_pub_dsa1.der'
);
ok(
$k
,
'load cryptx_pub_dsa1.der'
);
ok(!
$k
->is_private,
'is_private cryptx_pub_dsa1.der'
);
$k
= Crypt::PK::DSA->new(
't/data/cryptx_pub_dsa2.der'
);
ok(
$k
,
'load cryptx_pub_dsa2.der'
);
ok(!
$k
->is_private,
'is_private cryptx_pub_dsa2.der'
);
$k
= Crypt::PK::DSA->new(
't/data/openssl_dsa1.der'
);
ok(
$k
,
'load openssl_dsa1.der'
);
ok(
$k
->is_private,
'is_private openssl_dsa1.der'
);
$k
= Crypt::PK::DSA->new(
't/data/openssl_dsa2.der'
);
ok(
$k
,
'load openssl_dsa2.der'
);
ok(
$k
->is_private,
'is_private openssl_dsa2.der'
);
$k
= Crypt::PK::DSA->new(
't/data/cryptx_priv_dsa1.pem'
);
ok(
$k
,
'load cryptx_priv_dsa1.pem'
);
ok(
$k
->is_private,
'is_private cryptx_priv_dsa1.pem'
);
$k
= Crypt::PK::DSA->new(
't/data/cryptx_priv_dsa2.pem'
);
ok(
$k
,
'load cryptx_priv_dsa2.pem'
);
ok(
$k
->is_private,
'is_private cryptx_priv_dsa2.pem'
);
$k
= Crypt::PK::DSA->new(
't/data/cryptx_pub_dsa1.pem'
);
ok(
$k
,
'load cryptx_pub_dsa1.pem'
);
ok(!
$k
->is_private,
'is_private cryptx_pub_dsa1.pem'
);
$k
= Crypt::PK::DSA->new(
't/data/cryptx_pub_dsa2.pem'
);
ok(
$k
,
'load cryptx_pub_dsa2.pem'
);
ok(!
$k
->is_private,
'is_private cryptx_pub_dsa2.pem'
);
$k
= Crypt::PK::DSA->new(
't/data/openssl_dsa1.pem'
);
ok(
$k
,
'load openssl_dsa1.pem'
);
ok(
$k
->is_private,
'is_private openssl_dsa1.pem'
);
$k
= Crypt::PK::DSA->new(
't/data/openssl_dsa2.pem'
);
ok(
$k
,
'load openssl_dsa2.pem'
);
ok(
$k
->is_private,
'is_private openssl_dsa2.pem'
);
}
{
my
$pr1
= Crypt::PK::DSA->new;
$pr1
->import_key(
't/data/cryptx_priv_dsa1.der'
);
my
$pu1
= Crypt::PK::DSA->new;
$pu1
->import_key(
't/data/cryptx_pub_dsa1.der'
);
my
$ct
=
$pu1
->encrypt(
"secret message"
);
my
$pt
=
$pr1
->decrypt(
$ct
);
ok(
length
$ct
> 200,
'encrypt '
.
length
(
$ct
));
is(
$pt
,
"secret message"
,
'decrypt'
);
my
$sig
=
$pr1
->sign_message(
"message"
);
ok(
length
$sig
> 60,
'sign_message '
.
length
(
$sig
));
ok(
$pu1
->verify_message(
$sig
,
"message"
),
'verify_message'
);
my
$hash
=
pack
(
"H*"
,
"04624fae618e9ad0c5e479f62e1420c71fff34dd"
);
$sig
=
$pr1
->sign_hash(
$hash
);
ok(
length
$sig
> 60,
'sign_hash '
.
length
(
$sig
));
ok(
$pu1
->verify_hash(
$sig
,
$hash
),
'verify_hash'
);
my
$pr2
= Crypt::PK::DSA->new;
$pr2
->import_key(
't/data/cryptx_priv_dsa2.der'
);
my
$pu2
= Crypt::PK::DSA->new;
$pu2
->import_key(
't/data/cryptx_pub_dsa2.der'
);
}
{
my
$k
= Crypt::PK::DSA->new;
$k
->generate_key(\
<<"MARKER");
-----BEGIN DSA PARAMETERS-----
MIICLAKCAQEA3dZSaDnP5LgH44CDYc2wfGLtq4rbBgtOVvLkvh4j29CTiOUDRC1H
ivkTdtGrI3DdrAFeKieFYDJ1RJFbru+8/RYE7YfaR5Y3OUI4Vdf26guMViLLVjSL
W43Td50ZZziLmmYzn3cliokShe9f5/mtuLJ0uJRq7QxgHj7bgmvJvORvi4QXSCOn
nmCOgEfhoU1Vj/PePjtjeZWbLyGFXHC7vpvqePrsFtbUlBzIr2mr7JuHB3rAl7A4
1VL6lexqONRa4rQuVxiX0vp3iit9Cx02EwrZODdlifssd9Kceu2UsvifjmCBPyv8
6nmmEOtxh/xduuOBtVWXeZHSwIDUQvSJFwIhAK/ZDSl9iNuZ/TRwqQ3JRU3MjXCU
/US6/LU1qqjQATk7AoIBACoqauphNZmUZYOilArBfYCMtUwS0FNG6wfUMWDMd46z
/hv7equa9b75sT1uHyiUVuPD2hRhR3xNYkKSX9Kx8NGKj/bGDyaEW+Ud852N6BTo
9vzZ4GjKVBGe44Wa8eynVgVE5/r0z6OfHkV7uOxlGEdYgIooUbIsY7w0DmaR2FVZ
AMjGMg+L6CpulfvdETYi9LQafY4jRkgGWTc9h/2RYGhQUti1PheY1AlDYpubO8am
ZBG6vMBaANLx6Pv+lle4ltVvDVhwTK5APyfN1vVdEvVmU1/6zHZEnuiDAT8XI1rH
S1+SGX11RIn6uPVL1c0RjgW8/JZ6EeM8NvLdBiYYBuI=
-----END DSA PARAMETERS-----
MARKER
ok(
$k
,
'generate_key PEM'
);
ok(
$k
->is_private,
'is_private'
);
ok(
$k
->export_key_pem(
'private'
),
'export_key_pem pri'
);
ok(
$k
->export_key_pem(
'public'
),
'export_key_pem pub'
);
ok(
$k
->export_key_der(
'private'
),
'export_key_der pri'
);
ok(
$k
->export_key_der(
'public'
),
'export_key_der pub'
);
}
{
my
$k
= Crypt::PK::DSA->new;
$k
->generate_key(\decode_b64(
<<"MARKER"));
MIICLAKCAQEA3dZSaDnP5LgH44CDYc2wfGLtq4rbBgtOVvLkvh4j29CTiOUDRC1H
ivkTdtGrI3DdrAFeKieFYDJ1RJFbru+8/RYE7YfaR5Y3OUI4Vdf26guMViLLVjSL
W43Td50ZZziLmmYzn3cliokShe9f5/mtuLJ0uJRq7QxgHj7bgmvJvORvi4QXSCOn
nmCOgEfhoU1Vj/PePjtjeZWbLyGFXHC7vpvqePrsFtbUlBzIr2mr7JuHB3rAl7A4
1VL6lexqONRa4rQuVxiX0vp3iit9Cx02EwrZODdlifssd9Kceu2UsvifjmCBPyv8
6nmmEOtxh/xduuOBtVWXeZHSwIDUQvSJFwIhAK/ZDSl9iNuZ/TRwqQ3JRU3MjXCU
/US6/LU1qqjQATk7AoIBACoqauphNZmUZYOilArBfYCMtUwS0FNG6wfUMWDMd46z
/hv7equa9b75sT1uHyiUVuPD2hRhR3xNYkKSX9Kx8NGKj/bGDyaEW+Ud852N6BTo
9vzZ4GjKVBGe44Wa8eynVgVE5/r0z6OfHkV7uOxlGEdYgIooUbIsY7w0DmaR2FVZ
AMjGMg+L6CpulfvdETYi9LQafY4jRkgGWTc9h/2RYGhQUti1PheY1AlDYpubO8am
ZBG6vMBaANLx6Pv+lle4ltVvDVhwTK5APyfN1vVdEvVmU1/6zHZEnuiDAT8XI1rH
S1+SGX11RIn6uPVL1c0RjgW8/JZ6EeM8NvLdBiYYBuI=
MARKER
ok(
$k
,
'generate_key DER'
);
ok(
$k
->is_private,
'is_private'
);
ok(
$k
->export_key_pem(
'private'
),
'export_key_pem pri'
);
ok(
$k
->export_key_pem(
'public'
),
'export_key_pem pub'
);
ok(
$k
->export_key_der(
'private'
),
'export_key_der pri'
);
ok(
$k
->export_key_der(
'public'
),
'export_key_der pub'
);
}
{
my
$k
= Crypt::PK::DSA->new;
$k
->generate_key({
p
=>
"A5903F7DF15D5C0769797820"
.
"6CFEED0113CD1C15298198E9"
.
"1F2231135A7BC42568BE8F8D"
.
"357B7EE9AD4E99F9F628EA2C"
.
"9294425FA1C7732253D478CD"
.
"1E242FA81B12C2A9ADB46D14"
.
"AC83875A2D8BF6A1DCF57EC6"
.
"4668DB3751358EB4F5A620A9"
.
"0F28C3D5F62DC1E85E3CC724"
.
"A12018B038FFA4B917AABC66"
.
"543BDD11784134CB"
,
q =>
"B3CA2D8B0823160915E6B73E"
.
"DD3B0015DFE1E897"
,
g
=>
"5C9F25D69C86E8002BE04F56"
.
"90230BD008A816E7C8E9A96E"
.
"C0DBC630C62A8B42E41C8504"
.
"E682F52C02CDA74740CFA1A4"
.
"A608B8D827C5762EB69FED68"
.
"3D17DBC9050C16DEB9EC5A3E"
.
"02DF7B0E338AFFC01F878352"
.
"A2C82FB458F95DD60A7E23FE"
.
"322173F34F98452B0D16DCE2"
.
"23B15840F82B6AFCDFC6D848"
.
"9C5859DA0E4BE8B9"
,
});
ok(
$k
,
'generate_key HASH'
);
ok(
$k
->is_private,
'is_private'
);
ok(
$k
->export_key_pem(
'private'
),
'export_key_pem pri'
);
ok(
$k
->export_key_pem(
'public'
),
'export_key_pem pub'
);
ok(
$k
->export_key_der(
'private'
),
'export_key_der pri'
);
ok(
$k
->export_key_der(
'public'
),
'export_key_der pub'
);
}
{
my
$k
= Crypt::PK::DSA->new;
$k
->generate_key(20, 128);
ok(
$k
,
'generate_key size'
);
ok(
$k
->is_private,
'is_private'
);
ok(
$k
->export_key_pem(
'private'
),
'export_key_pem pri'
);
ok(
$k
->export_key_pem(
'public'
),
'export_key_pem pub'
);
ok(
$k
->export_key_der(
'private'
),
'export_key_der pri'
);
ok(
$k
->export_key_der(
'public'
),
'export_key_der pub'
);
}
{
my
$ct
= dsa_encrypt(
't/data/cryptx_pub_dsa1.der'
,
'test string'
);
ok(
$ct
,
'dsa_encrypt'
);
my
$pt
= dsa_decrypt(
't/data/cryptx_priv_dsa1.der'
,
$ct
);
ok(
$pt
,
'dsa_decrypt'
);
my
$sig
= dsa_sign_message(
't/data/cryptx_priv_dsa1.der'
,
'test string'
);
ok(
$sig
,
'dsa_sign_message'
);
ok(dsa_verify_message(
't/data/cryptx_pub_dsa1.der'
,
$sig
,
'test string'
),
'dsa_verify_message'
);
my
$hash
=
pack
(
"H*"
,
"04624fae618e9ad0c5e479f62e1420c71fff34dd"
);
$sig
= dsa_sign_hash(
't/data/cryptx_priv_dsa1.der'
,
$hash
);
ok(
$sig
,
'dsa_sign_hash'
);
ok(dsa_verify_hash(
't/data/cryptx_pub_dsa1.der'
,
$sig
,
$hash
),
'dsa_verify_hash'
);
}