plan
tests
=> 1298;
if
(1) {
my
$tests
= CryptX::_decode_json read_rawfile
't/wycheproof/aes_gcm_test.json'
;
for
my
$g
(@{
$tests
->{testGroups}}) {
my
$type
=
$g
->{type};
for
my
$t
(@{
$g
->{tests}}) {
my
$tcId
=
$t
->{tcId};
my
$comment
=
$t
->{comment};
my
$result
=
$t
->{result};
my
$aad
=
pack
"H*"
,
$t
->{aad};
my
$ct
=
pack
"H*"
,
$t
->{ct};
my
$iv
=
pack
"H*"
,
$t
->{iv};
my
$key
=
pack
"H*"
,
$t
->{key};
my
$msg
=
pack
"H*"
,
$t
->{msg};
my
$tag
=
pack
"H*"
,
$t
->{tag};
my
(
$ct2
,
$tag2
) =
eval
{ gcm_encrypt_authenticate(
'AES'
,
$key
,
$iv
,
$aad
,
$msg
) };
my
$pt2
=
eval
{ gcm_decrypt_verify(
'AES'
,
$key
,
$iv
,
$aad
,
$ct
,
$tag
) };
my
$testname
=
"type=$type tcId=$tcId comment='$comment' expected-result=$result"
;
if
(
$result
eq
'valid'
) {
is(
unpack
(
"H*"
,
$ct2
),
$t
->{ct},
"$testname CT-v"
);
is(
unpack
(
"H*"
,
$tag2
),
$t
->{tag},
"$testname TAG-v"
);
is(
unpack
(
"H*"
,
$pt2
),
$t
->{msg},
"$testname PT-v"
);
}
elsif
(
$result
eq
'invalid'
) {
is(
$pt2
,
undef
,
"$testname PT-i"
);
}
else
{
ok(0,
"UNEXPECTED result=$result"
);
}
}
}
}
if
(1) {
my
$tests
= CryptX::_decode_json read_rawfile
't/wycheproof/rsa_signature_test.json'
;
for
my
$g
(@{
$tests
->{testGroups}}) {
my
$type
=
$g
->{type};
my
$keyDer
=
pack
"H*"
,
$g
->{keyDer};
my
$keyPem
=
$g
->{keyPem};
my
$sha
=
$g
->{sha};
$sha
=~ s/-//g;
ok(Crypt::PK::RSA->new( \
$keyDer
),
"Crypt::PK::RSA->new + DER type: $type/$sha"
);
ok(Crypt::PK::RSA->new( \
$keyPem
),
"Crypt::PK::RSA->new + PEM type: $type/$sha"
);
for
my
$t
(@{
$g
->{tests}}) {
my
$tcId
=
$t
->{tcId};
my
$comment
=
$t
->{comment};
my
$result
=
$t
->{result};
my
$message
=
pack
"H*"
,
$t
->{message};
my
$sig
=
pack
"H*"
,
$t
->{sig};
my
$testname
=
"type=$type/$sha tcId=$tcId comment='$comment' expected-result=$result"
;
my
$pk
= Crypt::PK::RSA->new( \
$keyPem
);
my
$valid
=
$pk
->verify_message(
$sig
,
$message
,
$sha
,
"v1.5"
);
if
(
$result
eq
'valid'
||
$result
eq
'acceptable'
) {
ok(
$valid
,
$testname
);
}
elsif
(
$result
eq
'invalid'
) {
ok(!
$valid
,
$testname
);
}
else
{
ok(0,
"UNEXPECTED result=$result"
);
}
}
}
}
if
(1) {
my
$tests
= CryptX::_decode_json read_rawfile
't/wycheproof/dsa_test.json'
;
for
my
$g
(@{
$tests
->{testGroups}}) {
my
$type
=
$g
->{type};
my
$keyDer
=
pack
"H*"
,
$g
->{keyDer};
my
$keyPem
=
$g
->{keyPem};
my
$sha
=
$g
->{sha};
$sha
=~ s/-//g;
ok(Crypt::PK::DSA->new( \
$keyDer
),
"Crypt::PK::DSA->new + DER type=$type/$sha"
);
ok(Crypt::PK::DSA->new( \
$keyPem
),
"Crypt::PK::DSA->new + PEM type=$type/$sha"
);
for
my
$t
(@{
$g
->{tests}}) {
my
$tcId
=
$t
->{tcId};
my
$comment
=
$t
->{comment};
my
$result
=
$t
->{result};
my
$message
=
pack
"H*"
,
$t
->{message};
my
$sig
=
pack
"H*"
,
$t
->{sig};
next
if
$tcId
==12 &&
$result
eq
'acceptable'
&&
$comment
eq
"Legacy:ASN encoding of s misses leading 0"
;
next
if
$tcId
==13 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:long form encoding of length"
;
next
if
$tcId
==14 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:long form encoding of length"
;
next
if
$tcId
==15 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:long form encoding of length"
;
next
if
$tcId
==16 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:length contains leading 0"
;
next
if
$tcId
==17 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:length contains leading 0"
;
next
if
$tcId
==18 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:length contains leading 0"
;
next
if
$tcId
==19 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:indefinite length"
;
next
if
$tcId
==20 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:prepending 0's to integer"
;
next
if
$tcId
==21 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:prepending 0's to integer"
;
my
$testname
=
"type=$type/$sha tcId=$tcId comment='$comment' expected-result=$result"
;
my
$pk
= Crypt::PK::DSA->new( \
$keyPem
);
my
$hash
= digest_data(
$sha
,
$message
);
my
$valid_h
=
$pk
->verify_hash(
$sig
,
$hash
);
my
$valid
=
$pk
->verify_message(
$sig
,
$message
,
$sha
);
if
(
$result
eq
'valid'
||
$result
eq
'acceptable'
) {
ok(
$valid
,
$testname
);
}
elsif
(
$result
eq
'invalid'
) {
ok(!
$valid
,
$testname
);
}
else
{
ok(0,
"UNEXPECTED result=$result"
);
}
}
}
}
if
(1) {
my
$tests
= CryptX::_decode_json read_rawfile
't/wycheproof/ecdsa_test.json'
;
for
my
$g
(@{
$tests
->{testGroups}}) {
my
$type
=
$g
->{type};
my
$keyDer
=
pack
"H*"
,
$g
->{keyDer};
my
$keyPem
=
$g
->{keyPem};
my
$sha
=
$g
->{sha};
$sha
=~ s/-//g;
ok(Crypt::PK::ECC->new( \
$keyDer
),
"Crypt::PK::ECC->new + DER type=$type/$sha"
);
ok(Crypt::PK::ECC->new( \
$keyPem
),
"Crypt::PK::ECC->new + PEM type=$type/$sha"
);
for
my
$t
(@{
$g
->{tests}}) {
my
$tcId
=
$t
->{tcId};
my
$comment
=
$t
->{comment};
my
$result
=
$t
->{result};
my
$message
=
pack
"H*"
,
$t
->{message};
my
$sig
=
pack
"H*"
,
$t
->{sig};
next
if
$tcId
==9 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:long form encoding of length"
;
next
if
$tcId
==10 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:long form encoding of length"
;
next
if
$tcId
==12 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:length contains leading 0"
;
next
if
$tcId
==13 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:length contains leading 0"
;
next
if
$tcId
==14 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:indefinite length"
;
next
if
$tcId
==15 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:prepending 0's to integer"
;
next
if
$tcId
==16 &&
$result
eq
'acceptable'
&&
$comment
eq
"BER:prepending 0's to integer"
;
my
$testname
=
"type=$type/$sha tcId=$tcId comment='$comment' expected-result=$result"
;
my
$pk
= Crypt::PK::ECC->new( \
$keyPem
);
my
$valid
=
$pk
->verify_message(
$sig
,
$message
,
$sha
);
if
(
$result
eq
'valid'
||
$result
eq
'acceptable'
) {
ok(
$valid
,
"$testname verify_message=$valid"
);
}
elsif
(
$result
eq
'invalid'
) {
ok(!
$valid
,
"$testname verify_message=$valid"
);
}
else
{
ok(0,
"UNEXPECTED result=$result"
);
}
}
}
}
if
(1) {
my
$tests
= CryptX::_decode_json read_rawfile
't/wycheproof/ecdsa_webcrypto_test.json'
;
for
my
$g
(@{
$tests
->{testGroups}}) {
my
$type
=
$g
->{type};
my
$keyDer
=
pack
"H*"
,
$g
->{keyDer};
my
$keyPem
=
$g
->{keyPem};
my
$sha
=
$g
->{sha};
my
$jwk
=
$g
->{jwk};
$sha
=~ s/-//g;
ok(Crypt::PK::ECC->new( \
$keyDer
),
"Crypt::PK::ECC->new + DER type=$type/$sha"
);
ok(Crypt::PK::ECC->new( \
$keyPem
),
"Crypt::PK::ECC->new + PEM type=$type/$sha"
);
ok(Crypt::PK::ECC->new(
$jwk
),
"Crypt::PK::ECC->new + JWK type=$type/$sha"
);
for
my
$t
(@{
$g
->{tests}}) {
my
$tcId
=
$t
->{tcId};
my
$comment
=
$t
->{comment};
my
$result
=
$t
->{result};
my
$message
=
pack
"H*"
,
$t
->{message};
my
$sig
=
pack
"H*"
,
$t
->{sig};
my
$testname
=
"type=$type/$sha tcId=$tcId comment='$comment' expected-result=$result"
;
my
$pk
= Crypt::PK::ECC->new( \
$keyPem
);
my
$valid
=
$pk
->verify_message_rfc7518(
$sig
,
$message
,
$sha
);
if
(
$result
eq
'valid'
||
$result
eq
'acceptable'
) {
ok(
$valid
,
"$testname verify_message=$valid"
);
}
elsif
(
$result
eq
'invalid'
) {
ok(!
$valid
,
"$testname verify_message=$valid"
);
}
else
{
ok(0,
"UNEXPECTED result=$result"
);
}
}
}
}
if
(1) {
my
$tests
= CryptX::_decode_json read_rawfile
't/wycheproof/ecdh_webcrypto_test.json'
;
for
my
$g
(@{
$tests
->{testGroups}}) {
my
$type
=
$g
->{type};
for
my
$t
(@{
$g
->{tests}}) {
my
$tcId
=
$t
->{tcId};
my
$comment
=
$t
->{comment};
my
$name
=
$t
->{name};
my
$result
=
$t
->{result};
my
$shared
=
pack
"H*"
,
$t
->{shared};
my
$testname
=
"type=$type/$name tcId=$tcId comment='$comment' expected-result=$result"
;
my
$pub
= Crypt::PK::ECC->new(
$t
->{public} );
my
$pri
= Crypt::PK::ECC->new(
$t
->{private} );
my
$shared_hex
=
unpack
"H*"
,
$pri
->shared_secret(
$pub
);
if
(
$result
eq
'valid'
||
$result
eq
'acceptable'
) {
is(
$shared_hex
,
$t
->{shared},
$testname
);
}
elsif
(
$result
eq
'invalid'
) {
isnt(
$shared_hex
,
$t
->{shared},
$testname
);
}
else
{
ok(0,
"UNEXPECTED result=$result"
);
}
}
}
}