v0.021_4
Karel Miko
8 years ago
0 | 0 | Changes for CryptX |
1 | 1 | |
2 | 2 | TODO: |
3 | - idea: rand_helper commit 0547bb02 | |
4 | - idea: mp_prime_lucas | |
3 | - [MUST] update documentation: ECC+RSA+DSA | |
4 | - add support for PKCS#8 encrypted RSA+ECC private keys "-----BEGIN ENCRYPTED PRIVATE KEY-----" | |
5 | 5 | - disable LTC_FAST for gcc 3 |
6 | 6 | - add CCM interface for new-add-add-done mode |
7 | - add SHA3 | |
8 | 7 | - switch yarrow > fortuna for Crypt::PK::* |
9 | 8 | - RSA|DSA|ECC: verify_key($level) (basic check + extented primality test) |
10 | - better primality testing: http://questhub.io/realm/perl/quest/519032ee1088c76505000035 | |
9 | - better primality testing: http://questhub.io/realm/perl/quest/519032ee1088c76505000035 (idea: mp_prime_lucas) | |
11 | 10 | - DSA: generate_key($p, $q, $g), generate_key(\$dsa_params_der), generate_key($dsa_params_file) |
12 | 11 | - DH: generate_key($base, $prime), generate_key(\$dh_params_der), generate_key($dh_params_file) |
13 | 12 | - DH: key2hash should dump $base and $prime as well (perhasp add base, prime to dh_key struct) |
14 | - investigate - "libtom-src/bn_mp_invmod.c", line 37: warning: statement not reached | |
15 | - investigate - solaris crash: | |
16 | - http://ppm4.activestate.com/sun4-solaris/5.14/1400/M/MI/MIK/CryptX-0.017.d/log-20130924T103600.txt | |
17 | - t/pk_rsa.t crashes after: ok 32 - verify_hash | |
18 | - t/pk_dsa.t crashes after: ok 28 - decrypt | |
19 | 13 | - XS croaks should report the "real caller" (Crypt::Mac::*, Crypt::Mode::*, ...) |
20 | 14 | |
21 | 0.021_3 2015/04/17 | |
15 | 0.021_4 2015/05/06 | |
16 | - new: Crypt::PK::ECC+RSA supports importing PKCS8 PEM/DER private keys (unencrypted only) | |
17 | - new: Crypt::PK::ECC+RSA supports importing and exporting JWK keys | |
18 | - new: Crypt::PK::ECC+RSA+DSA supports importing public keys in SSH format | |
19 | - new: Crypt::PK::ECC+RSA+DSA supports importing keys from a hash exported via key2hash | |
20 | - new: Crypt::PK::ECC supports importing PEM/DER keys without explicit curve parameters (with just curve oid) | |
22 | 21 | - new: SHA512_224 + SHA512_256 |
23 | - new: Crypt::PK::ECC now supports loading keys without explicit curve parameters (with just curve oid) | |
24 | 22 | - libtomcrypt updated to the latest develop branch, commit aeaa6d4a51 Apr 17 08:59:35 2015 +0200 |
25 | 23 | - libtommath updated to the latest develop branch, commit 0fd5e6c17f Dec 11 14:59:35 2014 +0100 |
26 | 24 | - documentation fixes |
0 | NAME | |
1 | CryptX - Crypto toolkit (self-contained no external libraries needed) | |
2 | ||
3 | DESCRIPTION | |
4 | Cryptography in CryptX is based on | |
5 | <https://github.com/libtom/libtomcrypt> | |
6 | ||
7 | Currently available modules: | |
8 | ||
9 | * Ciphers - see Crypt::Cipher and related modules | |
10 | ||
11 | Crypt::Cipher::AES, Crypt::Cipher::Anubis, Crypt::Cipher::Blowfish, | |
12 | Crypt::Cipher::Camellia, Crypt::Cipher::CAST5, Crypt::Cipher::DES, | |
13 | Crypt::Cipher::DES_EDE, Crypt::Cipher::KASUMI, | |
14 | Crypt::Cipher::Khazad, Crypt::Cipher::MULTI2, | |
15 | Crypt::Cipher::Noekeon, Crypt::Cipher::RC2, Crypt::Cipher::RC5, | |
16 | Crypt::Cipher::RC6, Crypt::Cipher::SAFERP, | |
17 | Crypt::Cipher::SAFER_K128, Crypt::Cipher::SAFER_K64, | |
18 | Crypt::Cipher::SAFER_SK128, Crypt::Cipher::SAFER_SK64, | |
19 | Crypt::Cipher::SEED, Crypt::Cipher::Skipjack, | |
20 | Crypt::Cipher::Twofish, Crypt::Cipher::XTEA | |
21 | ||
22 | * Block cipher modes | |
23 | ||
24 | Crypt::Mode::CBC, Crypt::Mode::CFB, Crypt::Mode::CTR, | |
25 | Crypt::Mode::ECB, Crypt::Mode::OFB | |
26 | ||
27 | * Authenticated encryption modes | |
28 | ||
29 | Crypt::AuthEnc::CCM, Crypt::AuthEnc::EAX, Crypt::AuthEnc::GCM, | |
30 | Crypt::AuthEnc::OCB | |
31 | ||
32 | * Hash Functions - see Crypt::Digest and related modules | |
33 | ||
34 | Crypt::Digest::CHAES, Crypt::Digest::MD2, Crypt::Digest::MD4, | |
35 | Crypt::Digest::MD5, Crypt::Digest::RIPEMD128, | |
36 | Crypt::Digest::RIPEMD160, Crypt::Digest::RIPEMD256, | |
37 | Crypt::Digest::RIPEMD320, Crypt::Digest::SHA1, | |
38 | Crypt::Digest::SHA224, Crypt::Digest::SHA256, Crypt::Digest::SHA384, | |
39 | Crypt::Digest::SHA512, Crypt::Digest::SHA512_224, | |
40 | Crypt::Digest::SHA512_256, Crypt::Digest::Tiger192, | |
41 | Crypt::Digest::Whirlpool | |
42 | ||
43 | * Message Authentication Codes | |
44 | ||
45 | Crypt::Mac::F9, Crypt::Mac::HMAC, Crypt::Mac::OMAC, | |
46 | Crypt::Mac::Pelican, Crypt::Mac::PMAC, Crypt::Mac::XCBC | |
47 | ||
48 | * Public key cryptography | |
49 | ||
50 | Crypt::PK::RSA, Crypt::PK::DSA, Crypt::PK::ECC, Crypt::PK::DH | |
51 | ||
52 | * Cryptographically secure random number generators | |
53 | ||
54 | Crypt::PRNG, Crypt::PRNG::Fortuna, Crypt::PRNG::Yarrow, | |
55 | Crypt::PRNG::RC4, Crypt::PRNG::Sober128 | |
56 | ||
57 | * Key derivation functions - PBKDF1, PBKFD2 and HKDF | |
58 | ||
59 | Crypt::KeyDerivation | |
60 | ||
61 | LICENSE | |
62 | This program is free software; you can redistribute it and/or modify it | |
63 | under the same terms as Perl itself. | |
64 | ||
65 | COPYRIGHT | |
66 | Copyright (c) 2013 DCIT, a.s. <http://www.dcit.cz> / Karel Miko | |
67 | ||
0 | NAME | |
1 | CryptX - Crypto toolkit (self-contained no external libraries needed) | |
2 | ||
3 | DESCRIPTION | |
4 | Cryptography in CryptX is based on | |
5 | <https://github.com/libtom/libtomcrypt> | |
6 | ||
7 | Currently available modules: | |
8 | ||
9 | * Ciphers - see Crypt::Cipher and related modules | |
10 | ||
11 | Crypt::Cipher::AES, Crypt::Cipher::Anubis, Crypt::Cipher::Blowfish, | |
12 | Crypt::Cipher::Camellia, Crypt::Cipher::CAST5, Crypt::Cipher::DES, | |
13 | Crypt::Cipher::DES_EDE, Crypt::Cipher::KASUMI, | |
14 | Crypt::Cipher::Khazad, Crypt::Cipher::MULTI2, | |
15 | Crypt::Cipher::Noekeon, Crypt::Cipher::RC2, Crypt::Cipher::RC5, | |
16 | Crypt::Cipher::RC6, Crypt::Cipher::SAFERP, | |
17 | Crypt::Cipher::SAFER_K128, Crypt::Cipher::SAFER_K64, | |
18 | Crypt::Cipher::SAFER_SK128, Crypt::Cipher::SAFER_SK64, | |
19 | Crypt::Cipher::SEED, Crypt::Cipher::Skipjack, | |
20 | Crypt::Cipher::Twofish, Crypt::Cipher::XTEA | |
21 | ||
22 | * Block cipher modes | |
23 | ||
24 | Crypt::Mode::CBC, Crypt::Mode::CFB, Crypt::Mode::CTR, | |
25 | Crypt::Mode::ECB, Crypt::Mode::OFB | |
26 | ||
27 | * Authenticated encryption modes | |
28 | ||
29 | Crypt::AuthEnc::CCM, Crypt::AuthEnc::EAX, Crypt::AuthEnc::GCM, | |
30 | Crypt::AuthEnc::OCB | |
31 | ||
32 | * Hash Functions - see Crypt::Digest and related modules | |
33 | ||
34 | Crypt::Digest::CHAES, Crypt::Digest::MD2, Crypt::Digest::MD4, | |
35 | Crypt::Digest::MD5, Crypt::Digest::RIPEMD128, | |
36 | Crypt::Digest::RIPEMD160, Crypt::Digest::RIPEMD256, | |
37 | Crypt::Digest::RIPEMD320, Crypt::Digest::SHA1, | |
38 | Crypt::Digest::SHA224, Crypt::Digest::SHA256, Crypt::Digest::SHA384, | |
39 | Crypt::Digest::SHA512, Crypt::Digest::SHA512_224, | |
40 | Crypt::Digest::SHA512_256, Crypt::Digest::Tiger192, | |
41 | Crypt::Digest::Whirlpool | |
42 | ||
43 | * Message Authentication Codes | |
44 | ||
45 | Crypt::Mac::F9, Crypt::Mac::HMAC, Crypt::Mac::OMAC, | |
46 | Crypt::Mac::Pelican, Crypt::Mac::PMAC, Crypt::Mac::XCBC | |
47 | ||
48 | * Public key cryptography | |
49 | ||
50 | Crypt::PK::RSA, Crypt::PK::DSA, Crypt::PK::ECC, Crypt::PK::DH | |
51 | ||
52 | * Cryptographically secure random number generators | |
53 | ||
54 | Crypt::PRNG, Crypt::PRNG::Fortuna, Crypt::PRNG::Yarrow, | |
55 | Crypt::PRNG::RC4, Crypt::PRNG::Sober128 | |
56 | ||
57 | * Key derivation functions - PBKDF1, PBKFD2 and HKDF | |
58 | ||
59 | Crypt::KeyDerivation | |
60 | ||
61 | LICENSE | |
62 | This program is free software; you can redistribute it and/or modify it | |
63 | under the same terms as Perl itself. | |
64 | ||
65 | COPYRIGHT | |
66 | Copyright (c) 2013 DCIT, a.s. <http://www.dcit.cz> / Karel Miko | |
67 |
24 | 24 | my ($self, $type, $password, $cipher) = @_; |
25 | 25 | my $key = $self->export_key_der($type||''); |
26 | 26 | return unless $key; |
27 | return Crypt::PK::_asn1_to_pem($key, "DSA PRIVATE KEY", $password, $cipher) if $type eq 'private'; | |
27 | return Crypt::PK::_asn1_to_pem($key, "DSA PRIVATE KEY", $password, $cipher) if $type eq 'private'; | |
28 | 28 | return Crypt::PK::_asn1_to_pem($key, "DSA PUBLIC KEY") if $type eq 'public'; |
29 | 29 | return Crypt::PK::_asn1_to_pem($key, "PUBLIC KEY") if $type eq 'public_x509'; |
30 | 30 | } |
32 | 32 | sub import_key { |
33 | 33 | my ($self, $key, $password) = @_; |
34 | 34 | croak "FATAL: undefined key" unless $key; |
35 | ||
36 | # special case | |
37 | if (ref($key) eq 'HASH') { | |
38 | if ($key->{p} && $key->{q} && $key->{g} && $key->{y}) { | |
39 | # hash exported via key2hash | |
40 | return $self->_import_hex($key->{p}, $key->{q}, $key->{g}, $key->{x}, $key->{y}); | |
41 | } | |
42 | } | |
43 | ||
35 | 44 | my $data; |
36 | 45 | if (ref($key) eq 'SCALAR') { |
37 | 46 | $data = $$key; |
42 | 51 | else { |
43 | 52 | croak "FATAL: non-existing file '$key'"; |
44 | 53 | } |
45 | if ($data && $data =~ /-----BEGIN (DSA PRIVATE|DSA PUBLIC|PRIVATE|PUBLIC) KEY-----(.*?)-----END/sg) { | |
46 | $data = Crypt::PK::_pem_to_asn1($data, $password); | |
47 | } | |
48 | croak "FATAL: invalid key format" unless $data; | |
49 | return $self->_import($data); | |
54 | croak "FATAL: invalid key data" unless $data; | |
55 | ||
56 | if ($data =~ /-----BEGIN (DSA PRIVATE|DSA PUBLIC|PRIVATE|PUBLIC) KEY-----(.*?)-----END/sg) { | |
57 | $data = Crypt::PK::_pem_to_binary($data, $password); | |
58 | return $self->_import($data); | |
59 | } | |
60 | elsif ($data =~ /---- BEGIN SSH2 PUBLIC KEY ----(.*?)---- END SSH2 PUBLIC KEY ----/sg) { | |
61 | $data = Crypt::PK::_pem_to_binary($data); | |
62 | my ($typ, $p, $q, $g, $y) = Crypt::PK::_ssh_parse($data); | |
63 | return $self->_import_hex($p, $q, $g, undef, $y) if $typ && $p && $q && $g && $y && $typ eq 'ssh-dss'; | |
64 | } | |
65 | elsif ($data =~ /ssh-dss\s+(\S+)/) { | |
66 | $data = decode_base64($1); | |
67 | my ($typ, $p, $q, $g, $y) = Crypt::PK::_ssh_parse($data); | |
68 | return $self->_import_hex($p, $q, $g, undef, $y) if $typ && $p && $q && $g && $y && $typ eq 'ssh-dss'; | |
69 | } | |
70 | else { | |
71 | return $self->_import($data); | |
72 | } | |
73 | croak "FATAL: invalid or unsupported DSA key format"; | |
50 | 74 | } |
51 | 75 | |
52 | 76 | sub encrypt { |
472 | 496 | openssl dsa -in dsakey.priv.pem -text |
473 | 497 | openssl dsa -in dsakey-passwd.priv.pem -text -inform pem -passin pass:secret |
474 | 498 | openssl dsa -in dsakey.pub.der -pubin -text -inform der |
475 | openssl dsa -in dsakey.pub.pem -pubin -text | |
499 | openssl dsa -in dsakey.pub.pem -pubin -text | |
476 | 500 | |
477 | 501 | =head2 Keys generated by OpenSSL |
478 | 502 |
11 | 11 | use Crypt::PK; |
12 | 12 | use Crypt::Digest 'digest_data'; |
13 | 13 | use Carp; |
14 | use MIME::Base64 qw(encode_base64 decode_base64); | |
14 | use MIME::Base64 qw(encode_base64 decode_base64 encode_base64url decode_base64url); | |
15 | use JSON qw(encode_json decode_json); | |
15 | 16 | |
16 | 17 | our %curve = ( |
17 | 18 | ### http://www.ecc-brainpool.org/download/Domain-parameters.pdf (v1.0 19.10.2005) |
360 | 361 | }, |
361 | 362 | ); |
362 | 363 | |
364 | my %jwkcrv = ( | |
365 | 'P-192' => 'secp192r1', | |
366 | 'P-224' => 'secp224r1', | |
367 | 'P-256' => 'secp256r1', | |
368 | 'P-384' => 'secp384r1', | |
369 | 'P-521' => 'secp521r1', | |
370 | ); | |
371 | ||
372 | sub _import_hex { | |
373 | my ($self, $x, $y, $k, $crv) = @_; | |
374 | my $p = $curve{$crv}{prime}; | |
375 | croak "FATAL: invalid or unknown curve" if !$p; | |
376 | $p =~ s/^0+//; | |
377 | my $hex_size = length($p) % 2 ? length($p) + 1 : length($p); | |
378 | if ($k) { | |
379 | $k =~ /^0+/; | |
380 | croak "FATAL: too long private key (k)" if length($k) > $hex_size; | |
381 | my $priv_hex = "0" x ($hex_size - length($k)) . $k; | |
382 | return $self->import_key_raw(pack("H*", $priv_hex), $crv); | |
383 | } | |
384 | elsif ($x && $y) { | |
385 | $x =~ /^0+/; | |
386 | $y =~ /^0+/; | |
387 | croak "FATAL: too long public key (x)" if length($x) > $hex_size; | |
388 | croak "FATAL: too long public key (y)" if length($y) > $hex_size; | |
389 | my $pub_hex = "04" . ("0" x ($hex_size - length($x))) . $x . ("0" x ($hex_size - length($y))) . $y; | |
390 | return $self->import_key_raw(pack("H*", $pub_hex), $crv); | |
391 | } | |
392 | } | |
393 | ||
394 | sub _curve_name_lookup { | |
395 | my ($self, $key) = @_; | |
396 | ||
397 | return $key->{curve_name} if $key->{curve_name} && exists $curve{$key->{curve_name}}; | |
398 | ||
399 | my $A = $key->{curve_A} or return; | |
400 | my $B = $key->{curve_B} or return; | |
401 | my $Gx = $key->{curve_Gx} or return; | |
402 | my $Gy = $key->{curve_Gy} or return; | |
403 | my $order = $key->{curve_order} or return; | |
404 | my $prime = $key->{curve_prime} or return; | |
405 | my $cofactor = $key->{curve_cofactor} or return; | |
406 | $A =~ s/^0+//; | |
407 | $B =~ s/^0+//; | |
408 | $Gx =~ s/^0+//; | |
409 | $Gy =~ s/^0+//; | |
410 | $order =~ s/^0+//; | |
411 | $prime =~ s/^0+//; | |
412 | ||
413 | for my $k (sort keys %curve) { | |
414 | (my $c_A = $curve{$k}{A} ) =~ s/^0+//; | |
415 | (my $c_B = $curve{$k}{B} ) =~ s/^0+//; | |
416 | (my $c_Gx = $curve{$k}{Gx} ) =~ s/^0+//; | |
417 | (my $c_Gy = $curve{$k}{Gy} ) =~ s/^0+//; | |
418 | (my $c_order = $curve{$k}{order} ) =~ s/^0+//; | |
419 | (my $c_prime = $curve{$k}{prime} ) =~ s/^0+//; | |
420 | my $c_cofactor = $curve{$k}{cofactor}; | |
421 | return $k if $A eq $c_A && $B eq $c_B && $Gx eq $c_Gx && $Gy eq $c_Gy && | |
422 | $order eq $c_order && $prime eq $c_prime && $cofactor == $c_cofactor; | |
423 | } | |
424 | } | |
425 | ||
363 | 426 | sub new { |
364 | 427 | my ($class, $f, $p) = @_; |
365 | 428 | my $self = _new(); |
371 | 434 | my ($self, $type, $password, $cipher) = @_; |
372 | 435 | my $key = $self->export_key_der($type||''); |
373 | 436 | return unless $key; |
374 | return Crypt::PK::_asn1_to_pem($key, "EC PRIVATE KEY", $password, $cipher) if $type eq 'private'; | |
437 | return Crypt::PK::_asn1_to_pem($key, "EC PRIVATE KEY", $password, $cipher) if $type eq 'private'; | |
375 | 438 | return Crypt::PK::_asn1_to_pem($key, "PUBLIC KEY") if $type eq 'public' || $type eq 'public_compressed'; |
439 | } | |
440 | ||
441 | sub export_key_jwk { | |
442 | my ($self, $type) = @_; | |
443 | my $kh = $self->key2hash; | |
444 | my $curve = $self->_curve_name_lookup($kh); | |
445 | $curve = 'P-192' if $curve =~ /(secp192r1|nistp192|prime192v1)/; | |
446 | $curve = 'P-224' if $curve =~ /(secp224r1|nistp224)/; | |
447 | $curve = 'P-256' if $curve =~ /(secp256r1|nistp256|prime256v1)/; | |
448 | $curve = 'P-384' if $curve =~ /(secp384r1|nistp384)/; | |
449 | $curve = 'P-521' if $curve =~ /(secp521r1|nistp521)/; | |
450 | if ($type eq 'private') { | |
451 | return unless $kh->{pub_x} && $kh->{pub_y} && $kh->{k}; | |
452 | for (qw/pub_x pub_y k/) { | |
453 | $kh->{$_} = "0$kh->{$_}" if length($kh->{$_}) % 2; | |
454 | } | |
455 | # NOTE: x + y are not necessary in privkey | |
456 | # but they are used in https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#appendix-A.2 | |
457 | return sprintf '{"kty":"EC","crv":"%s","x":"%s","y":"%s","d":"%s"}', | |
458 | $curve, | |
459 | encode_base64url(pack("H*", $kh->{pub_x})), | |
460 | encode_base64url(pack("H*", $kh->{pub_y})), | |
461 | encode_base64url(pack("H*", $kh->{k})); | |
462 | } | |
463 | elsif ($type eq 'public') { | |
464 | return unless $kh->{pub_x} && $kh->{pub_y}; | |
465 | for (qw/pub_x pub_y/) { | |
466 | $kh->{$_} = "0$kh->{$_}" if length($kh->{$_}) % 2; | |
467 | } | |
468 | return sprintf '{"kty":"EC","crv":"%s","x":"%s","y":"%s"}', | |
469 | $curve, | |
470 | encode_base64url(pack("H*", $kh->{pub_x})), | |
471 | encode_base64url(pack("H*", $kh->{pub_y})); | |
472 | } | |
376 | 473 | } |
377 | 474 | |
378 | 475 | sub import_key { |
379 | 476 | my ($self, $key, $password) = @_; |
380 | 477 | croak "FATAL: undefined key" unless $key; |
478 | ||
479 | # special case | |
480 | if (ref($key) eq 'HASH') { | |
481 | if (($key->{pub_x} && $key->{pub_y}) || $key->{k}) { | |
482 | # hash exported via key2hash | |
483 | my $curve = $self->_curve_name_lookup($key); | |
484 | croak "FATAL: invalid or unknown curve" if !$curve; | |
485 | return $self->_import_hex($key->{pub_x}, $key->{pub_y}, $key->{k}, $curve); | |
486 | } | |
487 | if ($key->{crv} && $key->{kty} && $key->{kty} eq "EC" && ($key->{d} || ($key->{x} && $key->{y}))) { | |
488 | # hash with items corresponding to JSON Web Key (JWK) | |
489 | for (qw/x y d/) { | |
490 | $key->{$_} = eval { unpack("H*", decode_base64url($key->{$_})) } if exists $key->{$_}; | |
491 | } | |
492 | if (my $curve = $jwkcrv{$key->{crv}}) { | |
493 | return $self->_import_hex($key->{x}, $key->{y}, $key->{d}, $curve); | |
494 | } | |
495 | } | |
496 | } | |
497 | ||
381 | 498 | my $data; |
382 | 499 | if (ref($key) eq 'SCALAR') { |
383 | 500 | $data = $$key; |
388 | 505 | else { |
389 | 506 | croak "FATAL: non-existing file '$key'"; |
390 | 507 | } |
391 | if ($data && $data =~ /-----BEGIN (EC PRIVATE|EC PUBLIC|PRIVATE|PUBLIC) KEY-----(.*?)-----END/sg) { | |
392 | $data = Crypt::PK::_pem_to_asn1($data, $password); | |
393 | } | |
394 | croak "FATAL: invalid key format" unless $data; | |
395 | return $self->_import($data); | |
508 | croak "FATAL: invalid key data" unless $data; | |
509 | ||
510 | if ($data =~ /-----BEGIN (EC PRIVATE|EC PUBLIC|PUBLIC) KEY-----(.*?)-----END/sg) { | |
511 | $data = Crypt::PK::_pem_to_binary($data, $password); | |
512 | return $self->_import($data); | |
513 | } | |
514 | elsif ($data =~ /-----BEGIN PRIVATE KEY-----(.*?)-----END/sg) { | |
515 | $data = Crypt::PK::_pem_to_binary($data, $password); | |
516 | return $self->_import_pkcs8($data); | |
517 | } | |
518 | elsif ($data =~ /-----BEGIN ENCRYPTED PRIVATE KEY-----(.*?)-----END/sg) { | |
519 | # XXX-TODO: pkcs#8 encrypted private key | |
520 | croak "FATAL: encrypted pkcs8 EC private keys are not supported"; | |
521 | } | |
522 | elsif ($data =~ /^\s*(\{.*?\})\s*$/sg) { | |
523 | # JSON Web Key (JWK) - http://tools.ietf.org/html/draft-ietf-jose-json-web-key | |
524 | my $json = $1; | |
525 | my $h = eval { decode_json($json) }; | |
526 | if ($h && $h->{kty} eq "EC") { | |
527 | for (qw/x y d/) { | |
528 | $h->{$_} = eval { unpack("H*", decode_base64url($h->{$_})) } if exists $h->{$_}; | |
529 | } | |
530 | if (my $curve = $jwkcrv{$h->{crv}}) { | |
531 | return $self->_import_hex($h->{x}, $h->{y}, $h->{d}, $curve); | |
532 | } | |
533 | } | |
534 | } | |
535 | elsif ($data =~ /---- BEGIN SSH2 PUBLIC KEY ----(.*?)---- END SSH2 PUBLIC KEY ----/sg) { | |
536 | $data = Crypt::PK::_pem_to_binary($data); | |
537 | my ($typ, $xxx, $pubkey) = Crypt::PK::_ssh_parse($data); | |
538 | return $self->import_key_raw($pubkey, $2) if $pubkey && $typ =~ /^ecdsa-(.+?)-(.*)$/; | |
539 | } | |
540 | elsif ($data =~ /(ecdsa-\S+)\s+(\S+)/) { | |
541 | $data = decode_base64($2); | |
542 | my ($typ, $xxx, $pubkey) = Crypt::PK::_ssh_parse($data); | |
543 | return $self->import_key_raw($pubkey, $2) if $pubkey && $typ =~ /^ecdsa-(.+?)-(.*)$/; | |
544 | } | |
545 | else { | |
546 | my $rv = eval { $self->_import($data) } || eval { $self->_import_pkcs8($data) }; | |
547 | return $rv if $rv; | |
548 | } | |
549 | croak "FATAL: invalid or unsupported EC key format"; | |
396 | 550 | } |
397 | 551 | |
398 | 552 | sub encrypt { |
910 | 1064 | openssl ec -in eckey.priv.pem -text |
911 | 1065 | openssl ec -in eckey-passwd.priv.pem -text -inform pem -passin pass:secret |
912 | 1066 | openssl ec -in eckey.pub.der -pubin -text -inform der |
913 | openssl ec -in eckey.pub.pem -pubin -text | |
1067 | openssl ec -in eckey.pub.pem -pubin -text | |
914 | 1068 | |
915 | 1069 | =head2 Keys generated by OpenSSL |
916 | 1070 |
11 | 11 | use Crypt::PK; |
12 | 12 | use Crypt::Digest 'digest_data'; |
13 | 13 | use Carp; |
14 | use MIME::Base64 qw(encode_base64 decode_base64); | |
14 | use MIME::Base64 qw(encode_base64 decode_base64 encode_base64url decode_base64url); | |
15 | use JSON qw(encode_json decode_json); | |
15 | 16 | |
16 | 17 | sub new { |
17 | 18 | my ($class, $f, $p) = @_; |
25 | 26 | my $key = $self->export_key_der($type||''); |
26 | 27 | return unless $key; |
27 | 28 | |
28 | # PKCS#1 RSAPrivateKey** (PEM header: BEGIN RSA PRIVATE KEY) | |
29 | # PKCS#8 PrivateKeyInfo* (PEM header: BEGIN PRIVATE KEY) | |
29 | # PKCS#1 RSAPrivateKey** (PEM header: BEGIN RSA PRIVATE KEY) | |
30 | # PKCS#8 PrivateKeyInfo* (PEM header: BEGIN PRIVATE KEY) | |
30 | 31 | # PKCS#8 EncryptedPrivateKeyInfo** (PEM header: BEGIN ENCRYPTED PRIVATE KEY) |
31 | 32 | return Crypt::PK::_asn1_to_pem($key, "RSA PRIVATE KEY", $password, $cipher) if $type eq 'private'; |
32 | 33 | |
33 | 34 | # PKCS#1 RSAPublicKey* (PEM header: BEGIN RSA PUBLIC KEY) |
34 | 35 | return Crypt::PK::_asn1_to_pem($key, "RSA PUBLIC KEY") if $type eq 'public'; |
35 | 36 | # X.509 SubjectPublicKeyInfo** (PEM header: BEGIN PUBLIC KEY) |
36 | return Crypt::PK::_asn1_to_pem($key, "PUBLIC KEY") if $type eq 'public_x509'; | |
37 | return Crypt::PK::_asn1_to_pem($key, "PUBLIC KEY") if $type eq 'public_x509'; | |
38 | } | |
39 | ||
40 | sub export_key_jwk { | |
41 | my ($self, $type) = @_; | |
42 | my $kh = $self->key2hash; | |
43 | if ($type eq 'private') { | |
44 | return unless $kh->{N} && $kh->{e} && $kh->{d} && $kh->{p} && $kh->{q} && $kh->{dP} && $kh->{dQ} && $kh->{qP}; | |
45 | for (qw/N e d p q dP dQ qP/) { | |
46 | $kh->{$_} = "0$kh->{$_}" if length($kh->{$_}) % 2; | |
47 | } | |
48 | return sprintf '{"kty":"RSA","n":"%s","e":"%s","d":"%s","p":"%s","q":"%s","dp":"%s","dq":"%s","qi":"%s"}', | |
49 | encode_base64url(pack("H*", $kh->{N})), | |
50 | encode_base64url(pack("H*", $kh->{e})), | |
51 | encode_base64url(pack("H*", $kh->{d})), | |
52 | encode_base64url(pack("H*", $kh->{p})), | |
53 | encode_base64url(pack("H*", $kh->{q})), | |
54 | encode_base64url(pack("H*", $kh->{dP})), | |
55 | encode_base64url(pack("H*", $kh->{dQ})), | |
56 | encode_base64url(pack("H*", $kh->{qP})); | |
57 | } | |
58 | elsif ($type eq 'public') { | |
59 | return unless $kh->{N} && $kh->{e}; | |
60 | for (qw/N e/) { | |
61 | $kh->{$_} = "0$kh->{$_}" if length($kh->{$_}) % 2; | |
62 | } | |
63 | return sprintf '{"kty":"RSA","n":"%s","e":"%s"}', | |
64 | encode_base64url(pack("H*", $kh->{N})), | |
65 | encode_base64url(pack("H*", $kh->{e})); | |
66 | } | |
37 | 67 | } |
38 | 68 | |
39 | 69 | sub import_key { |
40 | 70 | my ($self, $key, $password) = @_; |
41 | 71 | croak "FATAL: undefined key" unless $key; |
72 | ||
73 | # special case | |
74 | if (ref($key) eq 'HASH') { | |
75 | if ($key->{N} && $key->{e}) { | |
76 | # hash exported via key2hash | |
77 | return $self->_import_hex($key->{N}, $key->{e}, $key->{d}, $key->{p}, $key->{q}, $key->{dP}, $key->{dQ}, $key->{qP}); | |
78 | } | |
79 | if ($key->{n} && $key->{e} && $key->{kty} && $key->{kty} eq "RSA") { | |
80 | # hash with items corresponding to JSON Web Key (JWK) | |
81 | for (qw/n e d p q dp dq qi/) { | |
82 | $key->{$_} = eval { unpack("H*", decode_base64url($key->{$_})) } if exists $key->{$_}; | |
83 | } | |
84 | return $self->_import_hex($key->{n}, $key->{e}, $key->{d}, $key->{p}, $key->{q}, $key->{dp}, $key->{dq}, $key->{qi}); | |
85 | } | |
86 | } | |
87 | ||
42 | 88 | my $data; |
43 | 89 | if (ref($key) eq 'SCALAR') { |
44 | 90 | $data = $$key; |
49 | 95 | else { |
50 | 96 | croak "FATAL: non-existing file '$key'"; |
51 | 97 | } |
52 | if ($data && $data =~ /-----BEGIN (RSA PRIVATE|RSA PUBLIC|PRIVATE|PUBLIC|ENCRYPTED PRIVATE) KEY-----(.*?)-----END/sg) { | |
53 | $data = Crypt::PK::_pem_to_asn1($data, $password); | |
54 | } | |
55 | croak "FATAL: invalid key format" unless $data; | |
56 | return $self->_import($data); | |
98 | croak "FATAL: invalid key data" unless $data; | |
99 | ||
100 | if ($data =~ /-----BEGIN (RSA PRIVATE|RSA PUBLIC|PUBLIC) KEY-----(.*?)-----END/sg) { | |
101 | # PKCS#1 RSAPublicKey (PEM header: BEGIN RSA PUBLIC KEY) | |
102 | # PKCS#1 RSAPrivateKey (PEM header: BEGIN RSA PRIVATE KEY) | |
103 | # X.509 SubjectPublicKeyInfo (PEM header: BEGIN PUBLIC KEY) | |
104 | $data = Crypt::PK::_pem_to_binary($data, $password); | |
105 | return $self->_import($data) if $data; | |
106 | } | |
107 | elsif ($data =~ /-----BEGIN PRIVATE KEY-----(.*?)-----END/sg) { | |
108 | # PKCS#8 PrivateKeyInfo (PEM header: BEGIN PRIVATE KEY) | |
109 | $data = Crypt::PK::_pem_to_binary($data, $password); | |
110 | return $self->_import_pkcs8($data) if $data; | |
111 | } | |
112 | elsif ($data =~ /-----BEGIN ENCRYPTED PRIVATE KEY-----(.*?)-----END/sg) { | |
113 | # XXX-TODO: PKCS#8 EncryptedPrivateKeyInfo (PEM header: BEGIN ENCRYPTED PRIVATE KEY) | |
114 | croak "FATAL: encrypted pkcs8 RSA private keys are not supported"; | |
115 | } | |
116 | elsif ($data =~ /^\s*(\{.*?\})\s*$/sg) { | |
117 | # JSON Web Key (JWK) - http://tools.ietf.org/html/draft-ietf-jose-json-web-key | |
118 | my $json = $1; | |
119 | my $h = eval { decode_json($json) }; | |
120 | if ($h && $h->{kty} eq "RSA") { | |
121 | for (qw/n e d p q dp dq qi/) { | |
122 | $h->{$_} = eval { unpack("H*", decode_base64url($h->{$_})) } if exists $h->{$_}; | |
123 | } | |
124 | return $self->_import_hex($h->{n}, $h->{e}, $h->{d}, $h->{p}, $h->{q}, $h->{dp}, $h->{dp}, $h->{qi}) if $h->{n} && $h->{e}; | |
125 | } | |
126 | } | |
127 | elsif ($data =~ /---- BEGIN SSH2 PUBLIC KEY ----(.*?)---- END SSH2 PUBLIC KEY ----/sg) { | |
128 | $data = Crypt::PK::_pem_to_binary($data); | |
129 | my ($typ, $N, $e) = Crypt::PK::_ssh_parse($data); | |
130 | return $self->_import_hex(unpack("H*", $e), unpack("H*", $N)) if $typ && $e && $N && $typ eq 'ssh-rsa'; | |
131 | } | |
132 | elsif ($data =~ /ssh-rsa\s+(\S+)/) { | |
133 | $data = decode_base64($1); | |
134 | my ($typ, $N, $e) = Crypt::PK::_ssh_parse($data); | |
135 | return $self->_import_hex(unpack("H*", $e), unpack("H*", $N)) if $typ && $e && $N && $typ eq 'ssh-rsa'; | |
136 | } | |
137 | else { | |
138 | # DER format | |
139 | my $rv = eval { $self->_import($data) } || eval { $self->_import_pkcs8($data) }; | |
140 | return $rv if $rv; | |
141 | } | |
142 | ||
143 | croak "FATAL: invalid or unsupported RSA key format"; | |
57 | 144 | } |
58 | 145 | |
59 | 146 | sub encrypt { |
603 | 690 | openssl rsa -in rsakey.priv.pem -text |
604 | 691 | openssl rsa -in rsakey-passwd.priv.pem -text -inform pem -passin pass:secret |
605 | 692 | openssl rsa -in rsakey.pub.der -pubin -text -inform der |
606 | openssl rsa -in rsakey.pub.pem -pubin -text | |
693 | openssl rsa -in rsakey.pub.pem -pubin -text | |
607 | 694 | |
608 | 695 | =head2 Keys generated by OpenSSL |
609 | 696 |
50 | 50 | return substr($key, 0, $klen); |
51 | 51 | } |
52 | 52 | |
53 | sub _pem_to_asn1 { | |
53 | sub _pem_to_binary { | |
54 | 54 | my ($data, $password) = @_; |
55 | 55 | |
56 | my ($begin, $object, $headers, $content, $end) = $data =~ m/(-----BEGIN ([^\r\n\-]+KEY)-----)\r?\n(.*?\r?\n\r?\n)?(.+)(-----END [^\r\n\-]*-----)/s; | |
56 | my ($begin, $obj1, $content, $end, $obj2) = $data =~ m/(----[- ]BEGIN ([^\r\n\-]+KEY)[ -]----)(.*?)(----[- ]END ([^\r\n\-]+)[ -]----)/s; | |
57 | return undef unless $content; | |
58 | $content =~ s/^\s+//sg; | |
59 | $content =~ s/\s+$//sg; | |
60 | $content =~ s/\r\n/\n/sg; # CR-LF >> LF | |
61 | $content =~ s/\r/\n/sg; # CR >> LF | |
62 | $content =~ s/\\\n//sg; # \ + LF | |
57 | 63 | |
58 | return $content unless $content; | |
59 | $content = decode_base64($content); | |
64 | my ($headers, undef, $b64) = $content =~ /^(([^:]+:.*?\n)*)(.*)$/s; | |
65 | return undef unless $b64; | |
66 | my $binary = decode_base64($b64); | |
67 | return undef unless $binary; | |
60 | 68 | |
61 | 69 | my ($ptype, $cipher_name, $iv_hex); |
62 | 70 | for my $h (split /\n/, ($headers||'')) { |
70 | 78 | my $iv = pack("H*", $iv_hex); |
71 | 79 | my ($mode, $klen) = _name2mode($cipher_name); |
72 | 80 | my $key = _password2key($password, $klen, $iv, 'MD5'); |
73 | return $mode->decrypt($content, $key, $iv); | |
81 | return $mode->decrypt($binary, $key, $iv); | |
74 | 82 | } |
75 | 83 | |
76 | return $content; | |
84 | return $binary; | |
77 | 85 | } |
78 | 86 | |
79 | 87 | sub _asn1_to_pem { |
100 | 108 | $rv .= "-----END $header_name-----\n"; |
101 | 109 | } |
102 | 110 | |
111 | sub _ssh_parse { | |
112 | my $raw = shift; | |
113 | my $len = length($raw); | |
114 | my @parts = (); | |
115 | my $i = 0; | |
116 | while (1) { | |
117 | last unless $i + 4 <= $len; | |
118 | my $part_len = unpack("N4", substr($raw, $i, 4)); | |
119 | last unless $i + 4 + $part_len <= $len; | |
120 | push @parts, substr($raw, $i + 4, $part_len); | |
121 | $i += $part_len + 4; | |
122 | } | |
123 | return @parts; | |
124 | } | |
125 | ||
103 | 126 | 1; |
104 | 127 | |
105 | 128 | __END__ |
2 | 2 | use strict; |
3 | 3 | use warnings ; |
4 | 4 | |
5 | our $VERSION = '0.021_3'; | |
5 | our $VERSION = '0.021_4'; | |
6 | 6 | |
7 | 7 | require XSLoader; |
8 | 8 | XSLoader::load('CryptX', $VERSION); |
44 | 44 | XPUSHs(ST(0)); /* return self */ |
45 | 45 | } |
46 | 46 | |
47 | void | |
48 | _import_hex(Crypt::PK::DSA self, char *p, char *q, char *g, char *x, char *y) | |
49 | PPCODE: | |
50 | { | |
51 | int rv; | |
52 | if (self->key.type != -1) { dsa_free(&self->key); self->key.type = -1; } | |
53 | rv = dsa_import_hex(p, q, g, x, y, &self->key); | |
54 | if (rv != CRYPT_OK) croak("FATAL: dsa_import_hex failed: %s", error_to_string(rv)); | |
55 | XPUSHs(ST(0)); /* return self */ | |
56 | } | |
57 | ||
47 | 58 | int |
48 | 59 | is_private(Crypt::PK::DSA self) |
49 | 60 | CODE: |
44 | 44 | _ecc_free_key(&self->key, &self->dp); |
45 | 45 | rv = ecc_import_full(data, (unsigned long)data_len, &self->key, &self->dp); |
46 | 46 | if (rv != CRYPT_OK) croak("FATAL: ecc_import_full failed: %s", error_to_string(rv)); |
47 | XPUSHs(ST(0)); /* return self */ | |
48 | } | |
49 | ||
50 | void | |
51 | _import_pkcs8(Crypt::PK::ECC self, SV * key_data) | |
52 | PPCODE: | |
53 | { | |
54 | int rv; | |
55 | unsigned char *data=NULL; | |
56 | STRLEN data_len=0; | |
57 | ||
58 | data = (unsigned char *)SvPVbyte(key_data, data_len); | |
59 | _ecc_free_key(&self->key, &self->dp); | |
60 | rv = ecc_import_pkcs8(data, (unsigned long)data_len, &self->key, &self->dp); | |
61 | if (rv != CRYPT_OK) croak("FATAL: ecc_import_pkcs8 failed: %s", error_to_string(rv)); | |
47 | 62 | XPUSHs(ST(0)); /* return self */ |
48 | 63 | } |
49 | 64 |
42 | 42 | if (self->key.type != -1) { rsa_free(&self->key); self->key.type = -1; } |
43 | 43 | rv = rsa_import(data, (unsigned long)data_len, &self->key); |
44 | 44 | if (rv != CRYPT_OK) croak("FATAL: rsa_import failed: %s", error_to_string(rv)); |
45 | XPUSHs(ST(0)); /* return self */ | |
46 | } | |
47 | ||
48 | void | |
49 | _import_pkcs8(Crypt::PK::RSA self, SV * key_data) | |
50 | PPCODE: | |
51 | { | |
52 | int rv; | |
53 | unsigned char *data=NULL; | |
54 | STRLEN data_len=0; | |
55 | ||
56 | data = (unsigned char *)SvPVbyte(key_data, data_len); | |
57 | if (self->key.type != -1) { rsa_free(&self->key); self->key.type = -1; } | |
58 | rv = rsa_import_pkcs8(data, (unsigned long)data_len, &self->key); | |
59 | if (rv != CRYPT_OK) croak("FATAL: rsa_import_pkcs8 failed: %s", error_to_string(rv)); | |
60 | XPUSHs(ST(0)); /* return self */ | |
61 | } | |
62 | ||
63 | void | |
64 | _import_hex(Crypt::PK::RSA self, char *N, char *e, char *d=NULL, char *p=NULL, char *q=NULL, char *dP=NULL, char *dQ=NULL, char *qP=NULL) | |
65 | PPCODE: | |
66 | { | |
67 | int rv; | |
68 | if (self->key.type != -1) { rsa_free(&self->key); self->key.type = -1; } | |
69 | rv = rsa_import_hex(N, e, d, p, q, dP, dQ, qP, &self->key); | |
70 | if (rv != CRYPT_OK) croak("FATAL: rsa_import_hex failed: %s", error_to_string(rv)); | |
45 | 71 | XPUSHs(ST(0)); /* return self */ |
46 | 72 | } |
47 | 73 |
290 | 290 | |
291 | 291 | int ecc_dp_init(ltc_ecc_set_type *dp); |
292 | 292 | int ecc_dp_set(ltc_ecc_set_type *dp, char *ch_prime, char *ch_A, char *ch_B, char *ch_order, char *ch_Gx, char *ch_Gy, unsigned long cofactor, char *ch_name); |
293 | int ecc_dp_set_bn(ltc_ecc_set_type *dp, void *a, void *b, void *prime, void *order, void *gx, void *gy, unsigned long cofactor); | |
294 | int ecc_dp_set_by_oid(ltc_ecc_set_type *dp, unsigned long *oid, unsigned long oidsize); | |
293 | 295 | int ecc_dp_clear(ltc_ecc_set_type *dp); |
296 | ||
294 | 297 | |
295 | 298 | int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key); |
296 | 299 | int ecc_make_key_ex(prng_state *prng, int wprng, ecc_key *key, const ltc_ecc_set_type *dp); |
533 | 536 | |
534 | 537 | int der_length_sequence(ltc_asn1_list *list, unsigned long inlen, |
535 | 538 | unsigned long *outlen); |
539 | int der_length_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |
540 | unsigned long *outlen, unsigned long *payloadlen); | |
536 | 541 | |
537 | 542 | /* SUBJECT PUBLIC KEY INFO */ |
538 | 543 | int der_encode_subject_public_key_info(unsigned char *out, unsigned long *outlen, |
0 | /* LibTomCrypt, modular cryptographic library -- Tom St Denis | |
1 | * | |
2 | * LibTomCrypt is a library that provides various cryptographic | |
3 | * algorithms in a highly modular and flexible manner. | |
4 | * | |
5 | * The library is free for all purposes without any express | |
6 | * guarantee it works. | |
7 | * | |
8 | * Tom St Denis, tomstdenis@gmail.com, http://libtom.org | |
9 | */ | |
10 | #include "tomcrypt.h" | |
11 | ||
12 | /** | |
13 | @file dsa_import_hex.c | |
14 | DSA implementation, import a DSA key | |
15 | */ | |
16 | ||
17 | #ifdef LTC_MDSA | |
18 | ||
19 | int dsa_import_hex(char *p, char *q, char *g, char *x, char *y, dsa_key *key) | |
20 | { | |
21 | int err; | |
22 | ||
23 | LTC_ARGCHK(p != NULL); | |
24 | LTC_ARGCHK(q != NULL); | |
25 | LTC_ARGCHK(g != NULL); | |
26 | LTC_ARGCHK(y != NULL); | |
27 | LTC_ARGCHK(ltc_mp.name != NULL); | |
28 | ||
29 | /* init key */ | |
30 | err = mp_init_multi(&key->p, &key->g, &key->q, &key->x, &key->y, NULL); | |
31 | if (err != CRYPT_OK) return err; | |
32 | ||
33 | if ((err = mp_read_radix(key->p , p , 16)) != CRYPT_OK) { goto LBL_ERR; } | |
34 | if ((err = mp_read_radix(key->q , q , 16)) != CRYPT_OK) { goto LBL_ERR; } | |
35 | if ((err = mp_read_radix(key->g , g , 16)) != CRYPT_OK) { goto LBL_ERR; } | |
36 | if ((err = mp_read_radix(key->g , y , 16)) != CRYPT_OK) { goto LBL_ERR; } | |
37 | if (x && strlen(x) > 0) { | |
38 | key->type = PK_PRIVATE; | |
39 | } | |
40 | else { | |
41 | key->type = PK_PUBLIC; | |
42 | } | |
43 | return CRYPT_OK; | |
44 | ||
45 | LBL_ERR: | |
46 | mp_clear_multi(key->p, key->g, key->q, key->x, key->y, NULL); | |
47 | return err; | |
48 | } | |
49 | ||
50 | #endif |
0 | /* LibTomCrypt, modular cryptographic library -- Tom St Denis | |
1 | * | |
2 | * LibTomCrypt is a library that provides various cryptographic | |
3 | * algorithms in a highly modular and flexible manner. | |
4 | * | |
5 | * The library is free for all purposes without any express | |
6 | * guarantee it works. | |
7 | * | |
8 | * Tom St Denis, tomstdenis@gmail.com, http://libtom.org | |
9 | */ | |
10 | ||
11 | /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b | |
12 | * | |
13 | */ | |
14 | ||
15 | #include "tomcrypt.h" | |
16 | ||
17 | #ifdef LTC_MECC | |
18 | ||
19 | int ecc_dp_set_by_oid(ltc_ecc_set_type *dp, unsigned long *oid, unsigned long oidsize) | |
20 | { | |
21 | int i; | |
22 | unsigned long len; | |
23 | ||
24 | for(i=0; ltc_ecc_sets[i].size != 0; i++) { | |
25 | if ((oidsize == ltc_ecc_sets[i].oid.OIDlen) && | |
26 | (XMEM_NEQ(oid, ltc_ecc_sets[i].oid.OID, sizeof(unsigned long) * ltc_ecc_sets[i].oid.OIDlen) == 0)) { | |
27 | break; | |
28 | } | |
29 | } | |
30 | if (ltc_ecc_sets[i].size == 0) return CRYPT_INVALID_ARG; /* not found */ | |
31 | ||
32 | /* a */ | |
33 | len = (unsigned long)strlen(ltc_ecc_sets[i].A); | |
34 | if ((dp->A = XMALLOC(1+len)) == NULL) goto cleanup1; | |
35 | strncpy(dp->A, ltc_ecc_sets[i].A, 1+len); | |
36 | /* b */ | |
37 | len = (unsigned long)strlen(ltc_ecc_sets[i].B); | |
38 | if ((dp->B = XMALLOC(1+len)) == NULL) goto cleanup2; | |
39 | strncpy(dp->B, ltc_ecc_sets[i].B, 1+len); | |
40 | /* order */ | |
41 | len = (unsigned long)strlen(ltc_ecc_sets[i].order); | |
42 | if ((dp->order = XMALLOC(1+len)) == NULL) goto cleanup3; | |
43 | strncpy(dp->order, ltc_ecc_sets[i].order, 1+len); | |
44 | /* prime */ | |
45 | len = (unsigned long)strlen(ltc_ecc_sets[i].prime); | |
46 | if ((dp->prime = XMALLOC(1+len)) == NULL) goto cleanup4; | |
47 | strncpy(dp->prime, ltc_ecc_sets[i].prime, 1+len); | |
48 | /* gx */ | |
49 | len = (unsigned long)strlen(ltc_ecc_sets[i].Gx); | |
50 | if ((dp->Gx = XMALLOC(1+len)) == NULL) goto cleanup5; | |
51 | strncpy(dp->Gx, ltc_ecc_sets[i].Gx, 1+len); | |
52 | /* gy */ | |
53 | len = (unsigned long)strlen(ltc_ecc_sets[i].Gy); | |
54 | if ((dp->Gy = XMALLOC(1+len)) == NULL) goto cleanup6; | |
55 | strncpy(dp->Gy, ltc_ecc_sets[i].Gy, 1+len); | |
56 | /* cofactor & size */ | |
57 | dp->cofactor = ltc_ecc_sets[i].cofactor; | |
58 | dp->size = ltc_ecc_sets[i].size; | |
59 | /* name */ | |
60 | len = (unsigned long)strlen(ltc_ecc_sets[i].name); | |
61 | if ((dp->name = XMALLOC(1+len)) == NULL) goto cleanup7; | |
62 | strncpy(dp->name, ltc_ecc_sets[i].name, 1+len); | |
63 | /* done - success */ | |
64 | return CRYPT_OK; | |
65 | ||
66 | cleanup7: | |
67 | XFREE(dp->Gy); | |
68 | cleanup6: | |
69 | XFREE(dp->Gx); | |
70 | cleanup5: | |
71 | XFREE(dp->prime); | |
72 | cleanup4: | |
73 | XFREE(dp->order); | |
74 | cleanup3: | |
75 | XFREE(dp->B); | |
76 | cleanup2: | |
77 | XFREE(dp->A); | |
78 | cleanup1: | |
79 | return CRYPT_MEM; | |
80 | } | |
81 | ||
82 | #endif |
0 | /* LibTomCrypt, modular cryptographic library -- Tom St Denis | |
1 | * | |
2 | * LibTomCrypt is a library that provides various cryptographic | |
3 | * algorithms in a highly modular and flexible manner. | |
4 | * | |
5 | * The library is free for all purposes without any express | |
6 | * guarantee it works. | |
7 | * | |
8 | * Tom St Denis, tomstdenis@gmail.com, http://libtom.org | |
9 | */ | |
10 | ||
11 | /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b | |
12 | * | |
13 | */ | |
14 | ||
15 | #include "tomcrypt.h" | |
16 | ||
17 | #ifdef LTC_MECC | |
18 | ||
19 | int ecc_dp_set_bn(ltc_ecc_set_type *dp, void *a, void *b, void *prime, void *order, void *gx, void *gy, unsigned long cofactor) | |
20 | { | |
21 | unsigned char buf[ECC_BUF_SIZE]; | |
22 | unsigned long len; | |
23 | ||
24 | /* a */ | |
25 | mp_tohex(a, (char *)buf); | |
26 | len = (unsigned long)strlen((char *)buf); | |
27 | if ((dp->A = XMALLOC(1+len)) == NULL) goto cleanup1; | |
28 | strncpy(dp->A, (char*)buf, 1+len); | |
29 | /* b */ | |
30 | mp_tohex(b, (char *)buf); | |
31 | len = (unsigned long)strlen((char *)buf); | |
32 | if ((dp->B = XMALLOC(1+len)) == NULL) goto cleanup2; | |
33 | strncpy(dp->B, (char*)buf, 1+len); | |
34 | /* order */ | |
35 | mp_tohex(order, (char *)buf); | |
36 | len = (unsigned long)strlen((char *)buf); | |
37 | if ((dp->order = XMALLOC(1+len)) == NULL) goto cleanup3; | |
38 | strncpy(dp->order, (char*)buf, 1+len); | |
39 | /* prime */ | |
40 | mp_tohex(prime, (char *)buf); | |
41 | len = (unsigned long)strlen((char *)buf); | |
42 | if ((dp->prime = XMALLOC(1+len)) == NULL) goto cleanup4; | |
43 | strncpy(dp->prime, (char*)buf, 1+len); | |
44 | /* gx */ | |
45 | mp_tohex(gx, (char *)buf); | |
46 | len = (unsigned long)strlen((char *)buf); | |
47 | if ((dp->Gx = XMALLOC(1+len)) == NULL) goto cleanup5; | |
48 | strncpy(dp->Gx, (char*)buf, 1+len); | |
49 | /* gy */ | |
50 | mp_tohex(gy, (char *)buf); | |
51 | len = (unsigned long)strlen((char *)buf); | |
52 | if ((dp->Gy = XMALLOC(1+len)) == NULL) goto cleanup6; | |
53 | strncpy(dp->Gy, (char*)buf, 1+len); | |
54 | /* cofactor & size */ | |
55 | dp->cofactor = cofactor; | |
56 | dp->size = mp_unsigned_bin_size(prime); | |
57 | /* name */ | |
58 | if ((dp->name = XMALLOC(7)) == NULL) goto cleanup7; | |
59 | strcpy(dp->name, "custom"); /* XXX-TODO check this */ | |
60 | /* done - success */ | |
61 | return CRYPT_OK; | |
62 | ||
63 | /* XFREE(dp->name); **** warning: statement not reached *** */ | |
64 | cleanup7: | |
65 | XFREE(dp->Gy); | |
66 | cleanup6: | |
67 | XFREE(dp->Gx); | |
68 | cleanup5: | |
69 | XFREE(dp->prime); | |
70 | cleanup4: | |
71 | XFREE(dp->order); | |
72 | cleanup3: | |
73 | XFREE(dp->B); | |
74 | cleanup2: | |
75 | XFREE(dp->A); | |
76 | cleanup1: | |
77 | return CRYPT_MEM; | |
78 | } | |
79 | ||
80 | #endif |
16 | 16 | |
17 | 17 | #ifdef LTC_MECC |
18 | 18 | |
19 | static int _populate_dp_from_oid(unsigned long *oid, unsigned long size, ltc_ecc_set_type *dp) | |
20 | { | |
21 | int i; | |
22 | unsigned long len; | |
23 | ||
24 | for(i=0; ltc_ecc_sets[i].size != 0; i++) { | |
25 | if ((size == ltc_ecc_sets[i].oid.OIDlen) && | |
26 | (XMEM_NEQ(oid, ltc_ecc_sets[i].oid.OID, sizeof(unsigned long) * ltc_ecc_sets[i].oid.OIDlen) == 0)) { | |
27 | break; | |
28 | } | |
29 | } | |
30 | if (ltc_ecc_sets[i].size == 0) return CRYPT_INVALID_ARG; /* not found */ | |
31 | ||
32 | /* a */ | |
33 | len = (unsigned long)strlen(ltc_ecc_sets[i].A); | |
34 | if ((dp->A = XMALLOC(1+len)) == NULL) goto cleanup1; | |
35 | strncpy(dp->A, ltc_ecc_sets[i].A, 1+len); | |
36 | /* b */ | |
37 | len = (unsigned long)strlen(ltc_ecc_sets[i].B); | |
38 | if ((dp->B = XMALLOC(1+len)) == NULL) goto cleanup2; | |
39 | strncpy(dp->B, ltc_ecc_sets[i].B, 1+len); | |
40 | /* order */ | |
41 | len = (unsigned long)strlen(ltc_ecc_sets[i].order); | |
42 | if ((dp->order = XMALLOC(1+len)) == NULL) goto cleanup3; | |
43 | strncpy(dp->order, ltc_ecc_sets[i].order, 1+len); | |
44 | /* prime */ | |
45 | len = (unsigned long)strlen(ltc_ecc_sets[i].prime); | |
46 | if ((dp->prime = XMALLOC(1+len)) == NULL) goto cleanup4; | |
47 | strncpy(dp->prime, ltc_ecc_sets[i].prime, 1+len); | |
48 | /* gx */ | |
49 | len = (unsigned long)strlen(ltc_ecc_sets[i].Gx); | |
50 | if ((dp->Gx = XMALLOC(1+len)) == NULL) goto cleanup5; | |
51 | strncpy(dp->Gx, ltc_ecc_sets[i].Gx, 1+len); | |
52 | /* gy */ | |
53 | len = (unsigned long)strlen(ltc_ecc_sets[i].Gy); | |
54 | if ((dp->Gy = XMALLOC(1+len)) == NULL) goto cleanup6; | |
55 | strncpy(dp->Gy, ltc_ecc_sets[i].Gy, 1+len); | |
56 | /* cofactor & size */ | |
57 | dp->cofactor = ltc_ecc_sets[i].cofactor; | |
58 | dp->size = ltc_ecc_sets[i].size; | |
59 | /* name */ | |
60 | len = (unsigned long)strlen(ltc_ecc_sets[i].name); | |
61 | if ((dp->name = XMALLOC(1+len)) == NULL) goto cleanup6; | |
62 | strncpy(dp->name, ltc_ecc_sets[i].name, 1+len); | |
63 | /* done - success */ | |
64 | return CRYPT_OK; | |
65 | ||
66 | cleanup7: | |
67 | XFREE(dp->Gy); | |
68 | cleanup6: | |
69 | XFREE(dp->Gx); | |
70 | cleanup5: | |
71 | XFREE(dp->prime); | |
72 | cleanup4: | |
73 | XFREE(dp->order); | |
74 | cleanup3: | |
75 | XFREE(dp->B); | |
76 | cleanup2: | |
77 | XFREE(dp->A); | |
78 | cleanup1: | |
79 | return CRYPT_MEM; | |
80 | } | |
81 | ||
82 | static int _populate_dp(void *a, void *b, void *prime, void *order, void *gx, void *gy, unsigned long cofactor, ltc_ecc_set_type *dp) | |
83 | { | |
84 | unsigned char buf[ECC_BUF_SIZE]; | |
85 | unsigned long len; | |
86 | ||
87 | /* a */ | |
88 | mp_tohex(a, (char *)buf); | |
89 | len = (unsigned long)strlen((char *)buf); | |
90 | if ((dp->A = XMALLOC(1+len)) == NULL) goto cleanup1; | |
91 | strncpy(dp->A, (char*)buf, 1+len); | |
92 | /* b */ | |
93 | mp_tohex(b, (char *)buf); | |
94 | len = (unsigned long)strlen((char *)buf); | |
95 | if ((dp->B = XMALLOC(1+len)) == NULL) goto cleanup2; | |
96 | strncpy(dp->B, (char*)buf, 1+len); | |
97 | /* order */ | |
98 | mp_tohex(order, (char *)buf); | |
99 | len = (unsigned long)strlen((char *)buf); | |
100 | if ((dp->order = XMALLOC(1+len)) == NULL) goto cleanup3; | |
101 | strncpy(dp->order, (char*)buf, 1+len); | |
102 | /* prime */ | |
103 | mp_tohex(prime, (char *)buf); | |
104 | len = (unsigned long)strlen((char *)buf); | |
105 | if ((dp->prime = XMALLOC(1+len)) == NULL) goto cleanup4; | |
106 | strncpy(dp->prime, (char*)buf, 1+len); | |
107 | /* gx */ | |
108 | mp_tohex(gx, (char *)buf); | |
109 | len = (unsigned long)strlen((char *)buf); | |
110 | if ((dp->Gx = XMALLOC(1+len)) == NULL) goto cleanup5; | |
111 | strncpy(dp->Gx, (char*)buf, 1+len); | |
112 | /* gy */ | |
113 | mp_tohex(gy, (char *)buf); | |
114 | len = (unsigned long)strlen((char *)buf); | |
115 | if ((dp->Gy = XMALLOC(1+len)) == NULL) goto cleanup6; | |
116 | strncpy(dp->Gy, (char*)buf, 1+len); | |
117 | /* cofactor & size */ | |
118 | dp->cofactor = cofactor; | |
119 | dp->size = mp_unsigned_bin_size(prime); | |
120 | /* name */ | |
121 | if ((dp->name = XMALLOC(7)) == NULL) goto cleanup7; | |
122 | strcpy(dp->name, "custom"); /* XXX-TODO check this */ | |
123 | /* done - success */ | |
124 | return CRYPT_OK; | |
125 | ||
126 | /* XFREE(dp->name); **** warning: statement not reached *** */ | |
127 | cleanup7: | |
128 | XFREE(dp->Gy); | |
129 | cleanup6: | |
130 | XFREE(dp->Gx); | |
131 | cleanup5: | |
132 | XFREE(dp->prime); | |
133 | cleanup4: | |
134 | XFREE(dp->order); | |
135 | cleanup3: | |
136 | XFREE(dp->B); | |
137 | cleanup2: | |
138 | XFREE(dp->A); | |
139 | cleanup1: | |
140 | return CRYPT_MEM; | |
141 | } | |
142 | ||
143 | 19 | int ecc_import_full(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp) |
144 | 20 | { |
145 | 21 | void *prime, *order, *a, *b, *gx, *gy; |
146 | ltc_asn1_list seq_fieldid[2], seq_curve[3], seq_ecparams[6], seq_priv[4], seq_pub[2]; | |
22 | ltc_asn1_list seq_fieldid[2], seq_curve[3], seq_ecparams[6], seq_priv[4]; | |
147 | 23 | unsigned char bin_a[ECC_MAXSIZE], bin_b[ECC_MAXSIZE], bin_k[ECC_MAXSIZE], bin_g[2*ECC_MAXSIZE+1], bin_xy[2*ECC_MAXSIZE+2], bin_seed[128]; |
148 | 24 | unsigned long len_a, len_b, len_k, len_g, len_xy, len_oid; |
149 | 25 | unsigned long cofactor = 0, ecver = 0, pkver = 0, tmpoid[16], curveoid[16]; |
150 | /*oid_st oid;*/ | |
151 | 26 | int err; |
152 | 27 | |
153 | 28 | if ((err = mp_init_multi(&prime, &order, &a, &b, &gx, &gy, NULL)) != CRYPT_OK) return err; |
158 | 33 | err = der_decode_subject_public_key_info_ex(in, inlen, PKA_EC, bin_xy, &len_xy, LTC_ASN1_OBJECT_IDENTIFIER, curveoid, 16UL, &len_oid); |
159 | 34 | if (err == CRYPT_OK) { |
160 | 35 | /* load curve parameters for given curve OID */ |
161 | if ((err = _populate_dp_from_oid(curveoid, len_oid, dp)) != CRYPT_OK) { goto error; } | |
36 | if ((err = ecc_dp_set_by_oid(dp, curveoid, len_oid)) != CRYPT_OK) { goto error; } | |
162 | 37 | /* load public key */ |
163 | 38 | if ((err = ecc_import_raw(bin_xy, len_xy, key, dp)) != CRYPT_OK) { goto error; } |
164 | 39 | goto success; |
185 | 60 | /* try to load public key */ |
186 | 61 | len_xy = sizeof(bin_xy); |
187 | 62 | err = der_decode_subject_public_key_info(in, inlen, PKA_EC, bin_xy, &len_xy, LTC_ASN1_SEQUENCE, seq_ecparams, 6); |
63 | ||
188 | 64 | if (err == CRYPT_OK) { |
189 | 65 | len_a = seq_curve[0].size; |
190 | 66 | len_b = seq_curve[1].size; |
194 | 70 | if ((err = mp_read_unsigned_bin(b, bin_b, len_b)) != CRYPT_OK) { goto error; } |
195 | 71 | if ((err = ecc_import_point(bin_g, len_g, prime, a, b, gx, gy)) != CRYPT_OK) { goto error; } |
196 | 72 | /* load curve parameters */ |
197 | if ((err = _populate_dp(a, b, prime, order, gx, gy, cofactor, dp)) != CRYPT_OK) { goto error; } | |
73 | if ((err = ecc_dp_set_bn(dp, a, b, prime, order, gx, gy, cofactor)) != CRYPT_OK) { goto error; } | |
198 | 74 | /* load public key */ |
199 | 75 | if ((err = ecc_import_raw(bin_xy, len_xy, key, dp)) != CRYPT_OK) { goto error; } |
200 | 76 | goto success; |
211 | 87 | seq_priv[3].tag = 0xA1; /* context specific 1 */ |
212 | 88 | /* try to load private key */ |
213 | 89 | err = der_decode_sequence(in, inlen, seq_priv, 4); |
90 | ||
214 | 91 | if (err == CRYPT_OK) { |
215 | 92 | /* load curve parameters for given curve OID */ |
216 | if ((err = _populate_dp_from_oid(curveoid, seq_priv[2].size, dp)) != CRYPT_OK) { goto error; } | |
93 | if ((err = ecc_dp_set_by_oid(dp, curveoid, seq_priv[2].size)) != CRYPT_OK) { goto error; } | |
217 | 94 | /* load private+public key */ |
218 | 95 | if ((err = ecc_import_raw(bin_k, seq_priv[1].size, key, dp)) != CRYPT_OK) { goto error; } |
219 | 96 | goto success; |
257 | 134 | if ((err = mp_read_unsigned_bin(b, bin_b, len_b)) != CRYPT_OK) { goto error; } |
258 | 135 | if ((err = ecc_import_point(bin_g, len_g, prime, a, b, gx, gy)) != CRYPT_OK) { goto error; } |
259 | 136 | /* load curve parameters */ |
260 | if ((err = _populate_dp(a, b, prime, order, gx, gy, cofactor, dp)) != CRYPT_OK) { goto error; } | |
137 | if ((err = ecc_dp_set_bn(dp, a, b, prime, order, gx, gy, cofactor)) != CRYPT_OK) { goto error; } | |
261 | 138 | /* load private+public key */ |
262 | 139 | if ((err = ecc_import_raw(bin_k, len_k, key, dp)) != CRYPT_OK) { goto error; } |
263 | 140 | goto success; |
0 | /* LibTomCrypt, modular cryptographic library -- Tom St Denis | |
1 | * | |
2 | * LibTomCrypt is a library that provides various cryptographic | |
3 | * algorithms in a highly modular and flexible manner. | |
4 | * | |
5 | * The library is free for all purposes without any express | |
6 | * guarantee it works. | |
7 | * | |
8 | * Tom St Denis, tomstdenis@gmail.com, http://libtom.org | |
9 | */ | |
10 | ||
11 | /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b | |
12 | * | |
13 | */ | |
14 | ||
15 | #include "tomcrypt.h" | |
16 | ||
17 | #ifdef LTC_MECC | |
18 | ||
19 | int ecc_import_pkcs8(unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp) | |
20 | { | |
21 | int err; | |
22 | void *zero, *one, *iter; | |
23 | unsigned char *buf1=NULL, *buf2=NULL; | |
24 | unsigned long buf1len, buf2len; | |
25 | unsigned long oid[16]; | |
26 | oid_st ecoid; | |
27 | ltc_asn1_list alg_seq[2], top_seq[3]; | |
28 | ltc_asn1_list alg_seq_e[2], key_seq_e[2], top_seq_e[2]; | |
29 | unsigned char *decrypted=NULL; | |
30 | unsigned long decryptedlen; | |
31 | void *prime, *order, *a, *b, *gx, *gy; | |
32 | ltc_asn1_list seq_fieldid[2], seq_curve[3], seq_ecparams[6], seq_priv[4]; | |
33 | unsigned char bin_a[ECC_MAXSIZE], bin_b[ECC_MAXSIZE], bin_k[ECC_MAXSIZE], bin_g[2*ECC_MAXSIZE+1], bin_xy[2*ECC_MAXSIZE+2], bin_seed[128]; | |
34 | unsigned long len_a, len_b, len_g; | |
35 | unsigned long cofactor = 0, ecver = 0, tmpoid[16], curveoid[16]; | |
36 | ||
37 | LTC_ARGCHK(in != NULL); | |
38 | LTC_ARGCHK(key != NULL); | |
39 | LTC_ARGCHK(ltc_mp.name != NULL); | |
40 | ||
41 | /* get EC alg oid */ | |
42 | err = pk_get_oid(PKA_EC, &ecoid); | |
43 | if (err != CRYPT_OK) { return err; } | |
44 | ||
45 | /* alloc buffers */ | |
46 | buf1len = 10000; /* XXX-TODO LTC_DER_MAX_PUBKEY_SIZE*8 nebo inlen*/ | |
47 | buf1 = XCALLOC(1, buf1len); | |
48 | if (buf1 == NULL) { err = CRYPT_MEM; goto LBL_FREE; } | |
49 | buf2len = 10000; /* XXX-TODO LTC_DER_MAX_PUBKEY_SIZE*8 nebo inlen */ | |
50 | buf2 = XCALLOC(1, buf2len); | |
51 | if (buf2 == NULL) { err = CRYPT_MEM; goto LBL_FREE; } | |
52 | ||
53 | /* init key */ | |
54 | err = mp_init_multi(&prime, &order, &a, &b, &gx, &gy, &zero, &one, &iter, NULL); | |
55 | if (err != CRYPT_OK) { return err; } | |
56 | ||
57 | /* try to decode encrypted priv key */ | |
58 | LTC_SET_ASN1(key_seq_e, 0, LTC_ASN1_OCTET_STRING, buf1, 9000UL); | |
59 | LTC_SET_ASN1(key_seq_e, 1, LTC_ASN1_INTEGER, iter, 1UL); | |
60 | LTC_SET_ASN1(alg_seq_e, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL); | |
61 | LTC_SET_ASN1(alg_seq_e, 1, LTC_ASN1_SEQUENCE, key_seq_e, 2UL); | |
62 | LTC_SET_ASN1(top_seq_e, 0, LTC_ASN1_SEQUENCE, alg_seq_e, 2UL); | |
63 | LTC_SET_ASN1(top_seq_e, 1, LTC_ASN1_OCTET_STRING, buf2, 9000UL); | |
64 | err=der_decode_sequence(in, inlen, top_seq_e, 2UL); | |
65 | if (err == CRYPT_OK) { | |
66 | /* unsigned long icount = mp_get_int(iter); */ | |
67 | /* XXX: TODO decrypt buf1 with a key derived form password + salt + iter */ | |
68 | /* fprintf(stderr, "XXX-DEBUG: gonna decrypt: iter=%ld salt.len=%ld encdata.len=%ld\n", icount, key_seq_e[0].size, top_seq_e[1].size); */ | |
69 | err = CRYPT_PK_INVALID_TYPE; | |
70 | goto LBL_ERR; | |
71 | } | |
72 | else { | |
73 | decrypted = in; | |
74 | decryptedlen = inlen; | |
75 | } | |
76 | ||
77 | /* try to decode unencrypted priv key - curve defined by OID */ | |
78 | LTC_SET_ASN1(alg_seq, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL); | |
79 | LTC_SET_ASN1(alg_seq, 1, LTC_ASN1_OBJECT_IDENTIFIER, curveoid, 16UL); | |
80 | LTC_SET_ASN1(top_seq, 0, LTC_ASN1_INTEGER, zero, 1UL); | |
81 | LTC_SET_ASN1(top_seq, 1, LTC_ASN1_SEQUENCE, alg_seq, 2UL); | |
82 | LTC_SET_ASN1(top_seq, 2, LTC_ASN1_OCTET_STRING, buf1, buf1len); | |
83 | err=der_decode_sequence(decrypted, decryptedlen, top_seq, 3UL); | |
84 | if (err == CRYPT_OK) { | |
85 | /* load curve parameters for given curve OID */ | |
86 | err = ecc_dp_set_by_oid(dp, curveoid, alg_seq[1].size); | |
87 | if (err != CRYPT_OK) { goto LBL_ERR; } | |
88 | } | |
89 | else { | |
90 | /* try to decode unencrypted priv key - curve defined by params */ | |
91 | /* ECParameters SEQUENCE */ | |
92 | LTC_SET_ASN1(seq_ecparams, 0, LTC_ASN1_SHORT_INTEGER, &ecver, 1UL); | |
93 | LTC_SET_ASN1(seq_ecparams, 1, LTC_ASN1_SEQUENCE, seq_fieldid, 2UL); | |
94 | LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 3UL); | |
95 | LTC_SET_ASN1(seq_ecparams, 3, LTC_ASN1_OCTET_STRING, bin_g, (unsigned long)2*ECC_MAXSIZE+1); | |
96 | LTC_SET_ASN1(seq_ecparams, 4, LTC_ASN1_INTEGER, order, 1UL); | |
97 | LTC_SET_ASN1(seq_ecparams, 5, LTC_ASN1_SHORT_INTEGER, &cofactor, 1UL); | |
98 | seq_ecparams[5].optional = 1; | |
99 | /* FieldID SEQUENCE */ | |
100 | LTC_SET_ASN1(seq_fieldid, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, 16UL); | |
101 | LTC_SET_ASN1(seq_fieldid, 1, LTC_ASN1_INTEGER, prime, 1UL); | |
102 | /* Curve SEQUENCE */ | |
103 | LTC_SET_ASN1(seq_curve, 0, LTC_ASN1_OCTET_STRING, bin_a, (unsigned long)ECC_MAXSIZE); | |
104 | LTC_SET_ASN1(seq_curve, 1, LTC_ASN1_OCTET_STRING, bin_b, (unsigned long)ECC_MAXSIZE); | |
105 | LTC_SET_ASN1(seq_curve, 2, LTC_ASN1_RAW_BIT_STRING, bin_seed, (unsigned long)8*128); | |
106 | /* */ | |
107 | LTC_SET_ASN1(alg_seq, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL); | |
108 | LTC_SET_ASN1(alg_seq, 1, LTC_ASN1_SEQUENCE, seq_ecparams, 6UL); | |
109 | LTC_SET_ASN1(top_seq, 0, LTC_ASN1_INTEGER, zero, 1UL); | |
110 | LTC_SET_ASN1(top_seq, 1, LTC_ASN1_SEQUENCE, alg_seq, 2UL); | |
111 | LTC_SET_ASN1(top_seq, 2, LTC_ASN1_OCTET_STRING, buf1, buf1len); | |
112 | seq_curve[2].optional = 1; | |
113 | err=der_decode_sequence(decrypted, decryptedlen, top_seq, 3UL); | |
114 | if (err != CRYPT_OK) { goto LBL_ERR; } | |
115 | len_a = seq_curve[0].size; | |
116 | len_b = seq_curve[1].size; | |
117 | len_g = seq_ecparams[3].size; | |
118 | /* create bignums */ | |
119 | if ((err = mp_read_unsigned_bin(a, bin_a, len_a)) != CRYPT_OK) { goto error; } | |
120 | if ((err = mp_read_unsigned_bin(b, bin_b, len_b)) != CRYPT_OK) { goto error; } | |
121 | if ((err = ecc_import_point(bin_g, len_g, prime, a, b, gx, gy)) != CRYPT_OK) { goto error; } | |
122 | /* load curve parameters */ | |
123 | if ((err = ecc_dp_set_bn(dp, a, b, prime, order, gx, gy, cofactor)) != CRYPT_OK) { goto error; } | |
124 | } | |
125 | ||
126 | /* check alg oid */ | |
127 | if ((alg_seq[0].size != ecoid.OIDlen) || | |
128 | XMEMCMP(ecoid.OID, alg_seq[0].data, ecoid.OIDlen * sizeof(ecoid.OID[0]))) { | |
129 | err = CRYPT_PK_INVALID_TYPE; | |
130 | goto LBL_ERR; | |
131 | } | |
132 | ||
133 | /* ECPrivateKey SEQUENCE */ | |
134 | LTC_SET_ASN1(seq_priv, 0, LTC_ASN1_SHORT_INTEGER, &one, 1UL); | |
135 | LTC_SET_ASN1(seq_priv, 1, LTC_ASN1_OCTET_STRING, bin_k, (unsigned long)ECC_MAXSIZE); | |
136 | LTC_SET_ASN1(seq_priv, 2, LTC_ASN1_RAW_BIT_STRING, bin_xy, (unsigned long)8*(2*ECC_MAXSIZE+2)); | |
137 | seq_priv[2].tag = 0xA1; /* context specific 1 */ | |
138 | /* try to load private key */ | |
139 | err = der_decode_sequence(buf1, top_seq[2].size, seq_priv, 3); | |
140 | if (err != CRYPT_OK) { goto LBL_ERR; } | |
141 | ||
142 | /* load private+public key */ | |
143 | if ((err = ecc_import_raw(bin_k, seq_priv[1].size, key, dp)) != CRYPT_OK) { goto LBL_ERR; } | |
144 | return err; | |
145 | ||
146 | error: | |
147 | LBL_FREE: | |
148 | LBL_ERR: | |
149 | mp_clear_multi(prime, order, a, b, gx, gy, NULL); | |
150 | return err; | |
151 | } | |
152 | ||
153 | #endif |
98 | 98 | return CRYPT_MEM; |
99 | 99 | } |
100 | 100 | |
101 | if (inlen == (unsigned long)dp->size) { | |
101 | if (inlen <= (unsigned long)dp->size) { | |
102 | 102 | /* read PRIVATE key */ |
103 | 103 | type = PK_PRIVATE; |
104 | 104 | size = inlen; |
0 | /* LibTomCrypt, modular cryptographic library -- Tom St Denis | |
1 | * | |
2 | * LibTomCrypt is a library that provides various cryptographic | |
3 | * algorithms in a highly modular and flexible manner. | |
4 | * | |
5 | * The library is free for all purposes without any express | |
6 | * guarantee it works. | |
7 | * | |
8 | * Tom St Denis, tomstdenis@gmail.com, http://libtom.org | |
9 | */ | |
10 | #include "tomcrypt.h" | |
11 | ||
12 | /** | |
13 | @file rsa_import_hex.c | |
14 | Import a PKCS RSA key | |
15 | */ | |
16 | ||
17 | #ifdef LTC_MRSA | |
18 | ||
19 | int rsa_import_hex(char *N, char *e, char *d, char *p, char *q, char *dP, char *dQ, char *qP, rsa_key *key) | |
20 | { | |
21 | int err; | |
22 | ||
23 | LTC_ARGCHK(key != NULL); | |
24 | LTC_ARGCHK(N != NULL); | |
25 | LTC_ARGCHK(e != NULL); | |
26 | LTC_ARGCHK(ltc_mp.name != NULL); | |
27 | ||
28 | err = mp_init_multi(&key->e, &key->d, &key->N, &key->dQ, &key->dP, &key->qP, &key->p, &key->q, NULL); | |
29 | if (err != CRYPT_OK) return err; | |
30 | ||
31 | if ((err = mp_read_radix(key->N , N , 16)) != CRYPT_OK) { goto LBL_ERR; } | |
32 | if ((err = mp_read_radix(key->e , e , 16)) != CRYPT_OK) { goto LBL_ERR; } | |
33 | if (d && p && q && dP && dQ && qP && strlen(d)>0 && strlen(p)>0 && | |
34 | strlen(q)>0 && strlen(dP)>0 && strlen(dQ)>0 && strlen(qP)>0) { | |
35 | if ((err = mp_read_radix(key->d , d , 16)) != CRYPT_OK) { goto LBL_ERR; } | |
36 | if ((err = mp_read_radix(key->p , p , 16)) != CRYPT_OK) { goto LBL_ERR; } | |
37 | if ((err = mp_read_radix(key->q , q , 16)) != CRYPT_OK) { goto LBL_ERR; } | |
38 | if ((err = mp_read_radix(key->dP, dP, 16)) != CRYPT_OK) { goto LBL_ERR; } | |
39 | if ((err = mp_read_radix(key->dQ, dQ, 16)) != CRYPT_OK) { goto LBL_ERR; } | |
40 | if ((err = mp_read_radix(key->qP, qP, 16)) != CRYPT_OK) { goto LBL_ERR; } | |
41 | key->type = PK_PRIVATE; | |
42 | } | |
43 | else { | |
44 | key->type = PK_PUBLIC; | |
45 | } | |
46 | return CRYPT_OK; | |
47 | ||
48 | LBL_ERR: | |
49 | mp_clear_multi(key->d, key->e, key->N, key->dQ, key->dP, key->qP, key->p, key->q, NULL); | |
50 | return err; | |
51 | } | |
52 | ||
53 | #endif /* LTC_MRSA */ |
0 | /* LibTomCrypt, modular cryptographic library -- Tom St Denis | |
1 | * | |
2 | * LibTomCrypt is a library that provides various cryptographic | |
3 | * algorithms in a highly modular and flexible manner. | |
4 | * | |
5 | * The library is free for all purposes without any express | |
6 | * guarantee it works. | |
7 | * | |
8 | * Tom St Denis, tomstdenis@gmail.com, http://libtom.org | |
9 | */ | |
10 | #include "tomcrypt.h" | |
11 | ||
12 | /** | |
13 | @file rsa_import_pkcs8.c | |
14 | Import a PKCS RSA key | |
15 | */ | |
16 | ||
17 | #ifdef LTC_MRSA | |
18 | ||
19 | /* Public-Key Cryptography Standards (PKCS) #8: | |
20 | * Private-Key Information Syntax Specification Version 1.2 | |
21 | * https://tools.ietf.org/html/rfc5208 | |
22 | * | |
23 | * PrivateKeyInfo ::= SEQUENCE { | |
24 | * version Version, | |
25 | * privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, | |
26 | * privateKey PrivateKey, | |
27 | * attributes [0] IMPLICIT Attributes OPTIONAL } | |
28 | * where: | |
29 | * - Version ::= INTEGER | |
30 | * - PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier | |
31 | * - PrivateKey ::= OCTET STRING | |
32 | * - Attributes ::= SET OF Attribute | |
33 | * | |
34 | * EncryptedPrivateKeyInfo ::= SEQUENCE { | |
35 | * encryptionAlgorithm EncryptionAlgorithmIdentifier, | |
36 | * encryptedData EncryptedData } | |
37 | * where: | |
38 | * - EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier | |
39 | * - EncryptedData ::= OCTET STRING | |
40 | */ | |
41 | ||
42 | /* | |
43 | * This PKCS12 key derivation code comes from BouncyCastle. | |
44 | * | |
45 | * @param idByte 1 == key, 2 == iv | |
46 | * @param n keysize or ivsize | |
47 | * @param salt 8 byte salt | |
48 | * @param password password | |
49 | * @param iterationCount iteration-count | |
50 | * @param md The message digest to use | |
51 | * @return byte[] the derived key | |
52 | */ | |
53 | ||
54 | /* | |
55 | pkcs12(int idByte, int n, byte[] salt, byte[] password, int iterationCount, MessageDigest md) | |
56 | */ | |
57 | ||
58 | int rsa_import_pkcs8(unsigned char *in, unsigned long inlen, rsa_key *key) | |
59 | { | |
60 | int err; | |
61 | void *zero, *iter; | |
62 | unsigned char *buf1=NULL, *buf2=NULL; | |
63 | unsigned long buf1len, buf2len; | |
64 | unsigned long oid[16]; | |
65 | oid_st rsaoid; | |
66 | ltc_asn1_list alg_seq[2], top_seq[3]; | |
67 | ltc_asn1_list alg_seq_e[2], key_seq_e[2], top_seq_e[2]; | |
68 | unsigned char *decrypted=NULL; | |
69 | unsigned long decryptedlen; | |
70 | ||
71 | LTC_ARGCHK(in != NULL); | |
72 | LTC_ARGCHK(key != NULL); | |
73 | LTC_ARGCHK(ltc_mp.name != NULL); | |
74 | ||
75 | /* get RSA alg oid */ | |
76 | err = pk_get_oid(PKA_RSA, &rsaoid); | |
77 | if (err != CRYPT_OK) { return err; } | |
78 | ||
79 | /* alloc buffers */ | |
80 | buf1len = 10000; /* XXX-TODO LTC_DER_MAX_PUBKEY_SIZE*8 nebo inlen*/ | |
81 | buf1 = XCALLOC(1, buf1len); | |
82 | if (buf1 == NULL) { err = CRYPT_MEM; goto LBL_FREE; } | |
83 | buf2len = 10000; /* XXX-TODO LTC_DER_MAX_PUBKEY_SIZE*8 nebo inlen */ | |
84 | buf2 = XCALLOC(1, buf2len); | |
85 | if (buf2 == NULL) { err = CRYPT_MEM; goto LBL_FREE; } | |
86 | ||
87 | /* init key */ | |
88 | err = mp_init_multi(&key->e, &key->d, &key->N, &key->dQ, &key->dP, &key->qP, &key->p, &key->q, &zero, &iter, NULL); | |
89 | if (err != CRYPT_OK) { return err; } | |
90 | ||
91 | /* try to decode encrypted priv key */ | |
92 | LTC_SET_ASN1(key_seq_e, 0, LTC_ASN1_OCTET_STRING, buf1, 9000UL); | |
93 | LTC_SET_ASN1(key_seq_e, 1, LTC_ASN1_INTEGER, iter, 1UL); | |
94 | LTC_SET_ASN1(alg_seq_e, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL); | |
95 | LTC_SET_ASN1(alg_seq_e, 1, LTC_ASN1_SEQUENCE, key_seq_e, 2UL); | |
96 | LTC_SET_ASN1(top_seq_e, 0, LTC_ASN1_SEQUENCE, alg_seq_e, 2UL); | |
97 | LTC_SET_ASN1(top_seq_e, 1, LTC_ASN1_OCTET_STRING, buf2, 9000UL); | |
98 | err=der_decode_sequence(in, inlen, top_seq_e, 2UL); | |
99 | if (err == CRYPT_OK) { | |
100 | /* unsigned long icount = mp_get_int(iter); */ | |
101 | /* XXX: TODO */ | |
102 | /* fprintf(stderr, "XXX-DEBUG: gonna decrypt: iter=%ld salt.len=%ld encdata.len=%ld\n", icount, key_seq_e[0].size, top_seq_e[1].size); */ | |
103 | err = CRYPT_PK_INVALID_TYPE; | |
104 | goto LBL_ERR; | |
105 | } | |
106 | else { | |
107 | decrypted = in; | |
108 | decryptedlen = inlen; | |
109 | } | |
110 | ||
111 | /* try to decode unencrypted priv key */ | |
112 | LTC_SET_ASN1(alg_seq, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL); | |
113 | LTC_SET_ASN1(alg_seq, 1, LTC_ASN1_NULL, NULL, 0UL); | |
114 | LTC_SET_ASN1(top_seq, 0, LTC_ASN1_INTEGER, zero, 1UL); | |
115 | LTC_SET_ASN1(top_seq, 1, LTC_ASN1_SEQUENCE, alg_seq, 2UL); | |
116 | LTC_SET_ASN1(top_seq, 2, LTC_ASN1_OCTET_STRING, buf1, buf1len); | |
117 | err=der_decode_sequence(decrypted, decryptedlen, top_seq, 3UL); | |
118 | if (err != CRYPT_OK) { goto LBL_ERR; } | |
119 | ||
120 | /* check alg oid */ | |
121 | if ((alg_seq[0].size != rsaoid.OIDlen) || | |
122 | XMEMCMP(rsaoid.OID, alg_seq[0].data, rsaoid.OIDlen * sizeof(rsaoid.OID[0]))) { | |
123 | err = CRYPT_PK_INVALID_TYPE; | |
124 | goto LBL_ERR; | |
125 | } | |
126 | ||
127 | err = der_decode_sequence_multi(buf1, top_seq[2].size, | |
128 | LTC_ASN1_INTEGER, 1UL, zero, | |
129 | LTC_ASN1_INTEGER, 1UL, key->N, | |
130 | LTC_ASN1_INTEGER, 1UL, key->e, | |
131 | LTC_ASN1_INTEGER, 1UL, key->d, | |
132 | LTC_ASN1_INTEGER, 1UL, key->p, | |
133 | LTC_ASN1_INTEGER, 1UL, key->q, | |
134 | LTC_ASN1_INTEGER, 1UL, key->dP, | |
135 | LTC_ASN1_INTEGER, 1UL, key->dQ, | |
136 | LTC_ASN1_INTEGER, 1UL, key->qP, | |
137 | LTC_ASN1_EOL, 0UL, NULL); | |
138 | if (err != CRYPT_OK) { goto LBL_ERR; } | |
139 | mp_clear_multi(zero, iter, NULL); | |
140 | key->type = PK_PRIVATE; | |
141 | err = CRYPT_OK; | |
142 | goto LBL_FREE; | |
143 | ||
144 | LBL_ERR: | |
145 | mp_clear_multi(key->d, key->e, key->N, key->dQ, key->dP, key->qP, key->p, key->q, zero, iter, NULL); | |
146 | ||
147 | LBL_FREE: | |
148 | if (buf2 != NULL) XFREE(buf2); | |
149 | if (buf1 != NULL) XFREE(buf1); | |
150 | ||
151 | return err; | |
152 | } | |
153 | ||
154 | #endif /* LTC_MRSA */ |
0 | {"kty":"EC", | |
1 | "crv":"P-256", | |
2 | "x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4", | |
3 | "y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM", | |
4 | "d":"870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE", | |
5 | "use":"enc", | |
6 | "kid":"1"}⏎ |
0 | {"kty":"EC", | |
1 | "crv":"P-256", | |
2 | "x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU", | |
3 | "y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0", | |
4 | "kid":"Public key used in JWS A.3 example" | |
5 | }⏎ |
0 | {"kty":"EC", | |
1 | "crv":"P-256", | |
2 | "x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4", | |
3 | "y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM", | |
4 | "use":"enc", | |
5 | "kid":"1"}⏎ |
0 | { | |
1 | "kty":"RSA", | |
2 | "kid":"juliet@capulet.lit", | |
3 | "use":"enc", | |
4 | "n":"t6Q8PWSi1dkJj9hTP8hNYFlvadM7DflW9mWepOJhJ66w7nyoK1gPNqFMSQRyO125Gp-TEkodhWr0iujjHVx7BcV0llS4w5ACGgPrcAd6ZcSR0-Iqom-QFcNP8Sjg086MwoqQU_LYywlAGZ21WSdS_PERyGFiNnj3QQlO8Yns5jCtLCRwLHL0Pb1fEv45AuRIuUfVcPySBWYnDyGxvjYGDSM-AqWS9zIQ2ZilgT-GqUmipg0XOC0Cc20rgLe2ymLHjpHciCKVAbY5-L32-lSeZO-Os6U15_aXrk9Gw8cPUaX1_I8sLGuSiVdt3C_Fn2PZ3Z8i744FPFGGcG1qs2Wz-Q", | |
5 | "e":"AQAB", | |
6 | "d":"GRtbIQmhOZtyszfgKdg4u_N-R_mZGU_9k7JQ_jn1DnfTuMdSNprTeaSTyWfSNkuaAwnOEbIQVy1IQbWVV25NY3ybc_IhUJtfri7bAXYEReWaCl3hdlPKXy9UvqPYGR0kIXTQRqns-dVJ7jahlI7LyckrpTmrM8dWBo4_PMaenNnPiQgO0xnuToxutRZJfJvG4Ox4ka3GORQd9CsCZ2vsUDmsXOfUENOyMqADC6p1M3h33tsurY15k9qMSpG9OX_IJAXmxzAh_tWiZOwk2K4yxH9tS3Lq1yX8C1EWmeRDkK2ahecG85-oLKQt5VEpWHKmjOi_gJSdSgqcN96X52esAQ", | |
7 | "p":"2rnSOV4hKSN8sS4CgcQHFbs08XboFDqKum3sc4h3GRxrTmQdl1ZK9uw-PIHfQP0FkxXVrx-WE-ZEbrqivH_2iCLUS7wAl6XvARt1KkIaUxPPSYB9yk31s0Q8UK96E3_OrADAYtAJs-M3JxCLfNgqh56HDnETTQhH3rCT5T3yJws", | |
8 | "q":"1u_RiFDP7LBYh3N4GXLT9OpSKYP0uQZyiaZwBtOCBNJgQxaj10RWjsZu0c6Iedis4S7B_coSKB0Kj9PaPaBzg-IySRvvcQuPamQu66riMhjVtG6TlV8CLCYKrYl52ziqK0E_ym2QnkwsUX7eYTB7LbAHRK9GqocDE5B0f808I4s", | |
9 | "dp":"KkMTWqBUefVwZ2_Dbj1pPQqyHSHjj90L5x_MOzqYAJMcLMZtbUtwKqvVDq3tbEo3ZIcohbDtt6SbfmWzggabpQxNxuBpoOOf_a_HgMXK_lhqigI4y_kqS1wY52IwjUn5rgRrJ-yYo1h41KR-vz2pYhEAeYrhttWtxVqLCRViD6c", | |
10 | "dq":"AvfS0-gRxvn0bwJoMSnFxYcK1WnuEjQFluMGfwGitQBWtfZ1Er7t1xDkbN9GQTB9yqpDoYaN06H7CFtrkxhJIBQaj6nkF5KKS3TQtQ5qCzkOkmxIe3KRbBymXxkb5qwUpX5ELD5xFc6FeiafWYY63TmmEAu_lRFCOJ3xDea-ots", | |
11 | "qi":"lSQi-w9CpyUReMErP1RsBLk7wNtOvs5EQpPqmuMvqW57NBUczScEoPwmUqqabu9V0-Py4dQ57_bapoKRu1R90bvuFnU63SHWEFglZQvJDMeAvmj4sm-Fp0oYu_neotgQ0hzbI5gry7ajdYy9-2lNx_76aBZoOUu9HCJ-UsfSOI8" | |
12 | }⏎ |
0 | {"kty":"RSA", | |
1 | "n":"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw", | |
2 | "e":"AQAB", | |
3 | "d":"X4cTteJY_gn4FYPsXB8rdXix5vwsg1FLN5E3EaG6RJoVH-HLLKD9M7dx5oo7GURknchnrRweUkC7hT5fJLM0WbFAKNLWY2vv7B6NqXSzUvxT0_YSfqijwp3RTzlBaCxWp4doFk5N2o8Gy_nHNKroADIkJ46pRUohsXywbReAdYaMwFs9tv8d_cPVY3i07a3t8MN6TNwm0dSawm9v47UiCl3Sk5ZiG7xojPLu4sbg1U2jx4IBTNBznbJSzFHK66jT8bgkuqsk0GjskDJk19Z4qwjwbsnn4j2WBii3RL-Us2lGVkY8fkFzme1z0HbIkfz0Y6mqnOYtqc0X4jfcKoAC8Q", | |
4 | "p":"83i-7IvMGXoMXCskv73TKr8637FiO7Z27zv8oj6pbWUQyLPQBQxtPVnwD20R-60eTDmD2ujnMt5PoqMrm8RfmNhVWDtjjMmCMjOpSXicFHj7XOuVIYQyqVWlWEh6dN36GVZYk93N8Bc9vY41xy8B9RzzOGVQzXvNEvn7O0nVbfs", | |
5 | "q":"3dfOR9cuYq-0S-mkFLzgItgMEfFzB2q3hWehMuG0oCuqnb3vobLyumqjVZQO1dIrdwgTnCdpYzBcOfW5r370AFXjiWft_NGEiovonizhKpo9VVS78TzFgxkIdrecRezsZ-1kYd_s1qDbxtkDEgfAITAG9LUnADun4vIcb6yelxk", | |
6 | "dp":"G4sPXkc6Ya9y8oJW9_ILj4xuppu0lzi_H7VTkS8xj5SdX3coE0oimYwxIi2emTAue0UOa5dpgFGyBJ4c8tQ2VF402XRugKDTP8akYhFo5tAA77Qe_NmtuYZc3C3m3I24G2GvR5sSDxUyAN2zq8Lfn9EUms6rY3Ob8YeiKkTiBj0", | |
7 | "dq":"s9lAH9fggBsoFR8Oac2R_E2gw282rT2kGOAhvIllETE1efrA6huUUvMfBcMpn8lqeW6vzznYY5SSQF7pMdC_agI3nG8Ibp1BUb0JUiraRNqUfLhcQb_d9GF4Dh7e74WbRsobRonujTYN1xCaP6TO61jvWrX-L18txXw494Q_cgk", | |
8 | "qi":"GyM_p6JrXySiz1toFgKbWV-JdI3jQ4ypu9rbMWx3rQJBfmt0FoYzgUIZEVFEcOqwemRN81zoDAaa-Bk0KWNGDjJHZDdDmFhW3AN7lI-puxk_mHZGJ11rxyR8O55XLSe3SPmRfKwZI6yU24ZxvQKFYItdldUKGzO6Ia6zTKhAVRU", | |
9 | "alg":"RS256", | |
10 | "kid":"2011-04-29"}⏎ |
0 | {"kty":"RSA", | |
1 | "n": "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw", | |
2 | "e":"AQAB", | |
3 | "alg":"RS256", | |
4 | "kid":"2011-04-29"}⏎ |
Binary diff not shown
0 | -----BEGIN PRIVATE KEY----- | |
1 | MIIBMAIBADCB0wYHKoZIzj0CATCBxwIBATAkBgcqhkjOPQEBAhkA//////////// | |
2 | /////////v//////////MEsEGP////////////////////7//////////AQYIhI9 | |
3 | wjlaBcqnQj2uzMlHYKfUYiVr1WkWAxUAxGloRDXes3jEtlypWR4qV2MFmi4EMQR9 | |
4 | KXeBAMZaHaF4NxZYjc4ri0rujiKPGJY4qQ8iY3M3M0tJ3LZqbcj5l4rKdkipQ7AC | |
5 | GQD///////////////96YtAxyD9ClPZA7BMCAQEEVTBTAgEBBBiKolTGIsTgOCtl | |
6 | 6dpdos0LvuaExCDFyT6hNAMyAAREwaCX0VY1LZxLW3G75tmft4p9uhc0J7/+NGaP | |
7 | DN3Tr7SXkT9+co2a+8KPJhQy10k= | |
8 | -----END PRIVATE KEY----- |
Binary diff not shown
0 | -----BEGIN ENCRYPTED PRIVATE KEY----- | |
1 | MIIBWjAcBgoqhkiG9w0BDAEDMA4ECKvdZESlMxWnAgIIAASCATjCay4uTsTVaS2L | |
2 | d8714Xwv3EWfIFc4+I3dWFQayElm+PNcWIuESk3Pr4VwIUEuLAzo5xCI5G60DnDX | |
3 | 5Bux/FenEbeE4Vi/s8UmUDANGbAZrOzrlEzDKitCuYV77cK8Bkrdu408OqrmNBtn | |
4 | HTtUX9o+o+fNbqHvrsQwRbBm7BcvG8P83kcMBDDVCgfJHfME4NeFZTFfgG+NOT6f | |
5 | 77jN4ylAac6jEa/lEnYWUn2CorTb/gT/5G/o6KuY7RHIYGQIgkQGGbQBCoUISgi8 | |
6 | Mk+7012wlXiN+tzeAkvitTvZlVXTHBwnx1iU5cmx+S4VmH2DdZPNq7lbp69uiqzZ | |
7 | CtFNCAlycZJkf7aiYgDQeimUDIceW+NKSf8PZCgLkvBNAgJ7GvS5SVvQoOrghtEI | |
8 | 5fUFKVAaDkKBGXUgCY8= | |
9 | -----END ENCRYPTED PRIVATE KEY----- |
Binary diff not shown
0 | -----BEGIN PRIVATE KEY----- | |
1 | MG8CAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQMEVTBTAgEBBBjFP/caeQV4WO3fnWWS | |
2 | f917PGzwtypd/t+hNAMyAATSg6pBT7RO6l/p+aKcrFsGuthUdfwJWS5V3NGcVt1b | |
3 | lEHQYjWya2YnHaPq/iMFa7A= | |
4 | -----END PRIVATE KEY----- |
Binary diff not shown
0 | -----BEGIN ENCRYPTED PRIVATE KEY----- | |
1 | MIGYMBwGCiqGSIb3DQEMAQMwDgQINApjTa6oFl0CAggABHi+59l4d4e6KtG9yci2 | |
2 | BSC65LEsQSnrnFAExfKptNU1zMFsDLCRvDeDQDbxc6HlfoxyqFL4SmH1g3RvC/Vv | |
3 | NfckdL5O2L8MRnM+ljkFtV2Te4fszWcJFdd7KiNOkPpn+7sWLfzQdvhHChLKUzmz | |
4 | 4INKZyMv/G7VpZ0= | |
5 | -----END ENCRYPTED PRIVATE KEY----- |
Binary diff not shown
0 | -----BEGIN PRIVATE KEY----- | |
1 | MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANPN17xW4EkH5PXG | |
2 | 1i/i3rE1EXFcCHyxmz95VRBDs1p3MuYf9mxntbfYAmuzS3KrRWh3IyX/Eh80N/v9 | |
3 | OXPlwZbVqSTX+L3pCEJtRtsWn0zmswGThjMZiwle0oWuap63L35F1QN8EDaSPSBC | |
4 | yGELNRr6rwVYq0w5b+LOcaCZ+/H1AgMBAAECgYEApfu3aGpww+rC3HUhX0+ckyTy | |
5 | cXLdV9LbxidwqRlVEb0+DyfXNucjelp2sy5EHy3na9GJovo8mmWSxhCRGKliRkQ6 | |
6 | XgrEMZdCSaWI2AazuHAGlUJRFEVkvdla3AuBAn6y0YdDp/3kbg0yahmKyD8Gq74z | |
7 | nUYbDL3R5JtR2Ad/KlUCQQDvSEICTHbO/BF7hVmlKRYZSNHKEPrv8X/OlppS14Kv | |
8 | QRwc+CZ5+l6T1Y+l5cHJQUXrXZoWS1K741TXdUhjjUd7AkEA4pod804Ex8sttdWi | |
9 | pHMfeyj+IbPAk5XnBc91jT7AYIeL8ccjtfl99xhMsGFaxrh3wA/4SGEvwzWkbxcq | |
10 | H8G5TwJAKNG+0P2SVwURRm0dOdukdXPCtiHnbP9Zujhe4zr4hEUrMpXymmRntfh8 | |
11 | pORpBpgoAVraams3Fe5WDttnGfSD+QJAOOC6V9HjfUrQhG3FT0XeRwm5EDiQQ/tC | |
12 | a8DxHqz7mL8tL1ju68ReC+G7jiJBqNOwqzLW/UP3uyYByiikWChGHQJAHUau7jIM | |
13 | 45ErO096n94Vh95p76ANxOroWszOt39TyvJOykIfoPwFagLrBWV9Jjos2/D54KE+ | |
14 | fyoy4t3yHT+/nw== | |
15 | -----END PRIVATE KEY----- |
Binary diff not shown
0 | -----BEGIN ENCRYPTED PRIVATE KEY----- | |
1 | MIICojAcBgoqhkiG9w0BDAEDMA4ECCQk+Rr1yzzcAgIIAASCAoD/mgpUFjxxM/Ty | |
2 | Yt+NeT0Fo4echgoGksqs6+rYhO16oshG664emZfkuNoFGGzJ38X6GVuqIXhlPnYQ | |
3 | biKvL37dN/KnoGytFHq9Wnk8dDwjGHPtwajhW5WuIV3NuhW/AO1PF/cRZKFjWrPt | |
4 | NWY5CrpfH6t6zojoe+5uyXpH29lQy4OqvSRdPIt/12UcB+tzV7XzSWEuXh8HAi8a | |
5 | sYUu6tuCFnq4GrD2ffM4KWFmL5GqBAwN6m0KkyrNni9XT+RaA6zEhv/lVcwg2esa | |
6 | 4/EzRs0ixzzZDKaml8oCMl9RHtFAbQmdlfV7Ip4rGK9BwY6UFiDMIVru6HynOVQK | |
7 | vvZ+j//bgO+3ubrv7psX+vC9Fy/MoH2Tc7MIwDN/QVTciPZlzjWBnBNxMfeFKtEn | |
8 | d7NFiapgfLuRQIiDTMrW/clcqvO54NphxhrcgUEoxos4twKZARntqPZHtf8nEM2x | |
9 | 2sEF5kI65aEF/5Yy16qvP0vZAA2B1kcIdXZ8XLZCp4c3olhkIrmgUpo1gyFXdCoC | |
10 | 7dT5Cz7/YLkq5hkcFrtp4V9BZMR24fSttc4p24N5xuZ+JneGnGkLX6B+nJAtm9vw | |
11 | bZA6P+23GI0qeMzL3HJXwCOTSsWfm/H9W5+2Zmw851aAmE+pZLni/pk3e3iNSWgs | |
12 | 946x/doA5O0uCFsU7oxme+WAIp2SjhxGoe808Lf1CCFMPboFi1O/E0NsX8SIEX+i | |
13 | U+UHi4kxZqVkr3Q5SB/9kiSv8K1bE787yueQOT/dsTYYaMsjAbkEZo0o/47F32T6 | |
14 | A2ioXHOV/pr5zNHqE5tL+qKEcLYbAUF1O+WvmdqYz+vHQjRQBatAqTmncvLDYr/j | |
15 | 1HPwZX2d | |
16 | -----END ENCRYPTED PRIVATE KEY----- |
0 | -----BEGIN DSA PRIVATE KEY----- | |
1 | MIIBuwIBAAKBgQClPP2r5pBXhp0qsGBu3WZ0JRvtNUDWsbtxeb9DXC/0kVFuyHaV | |
2 | KvLdeLIitJgOso6YS4Tn+bfILoExFQZZT/OgDUmxYoB+1jd7+snSVqputKTYTRzf | |
3 | /+dHJzbSLF28Xqt1bbCOuKZB9TianmQxy5ru95OE9BCjs7MpUnxf8LVQSQIVAKGm | |
4 | 5ssdWLA8H6NK9Rvx7hMdLs8FAoGACQ9TzAokwkGtccg/zQljmowrn0ziMygIZupf | |
5 | p5QVT4iiPtutl6WLdduynuJjy/FyQYs6E40kDdPLhzIP/C+lv3HTtmmfpoZAZ0tc | |
6 | QJvNwwMKi6w62kdcP+EERca+VW8svKp3o6z40yaGwTdQRrL/OMB5I5qAp+qRSH5B | |
7 | mHgE5SYCgYAHYPU1zMVBTDWru7SNC4G2UyWGWYYLjLytBVHfQmBa51CmqrSs2kCf | |
8 | GLGA1ynfYENsxcJq9nsXrb4i17H5BHJFkH0g7BUDpeBeLr8gsK3WgfqWwtZsDklt | |
9 | Obw9chUD/siK6q/dk/fSIB2Ho0inev7k68Z5ZkNI4XOwuEssAVhmwAIVAJjBvZ2W | |
10 | /WS2qshYFM74ef4InjBE | |
11 | -----END DSA PRIVATE KEY----- |
0 | ssh-dss AAAAB3NzaC1kc3MAAACBAKU8/avmkFeGnSqwYG7dZnQlG+01QNaxu3F5v0NcL/SRUW7IdpUq8t14siK0mA6yjphLhOf5t8gugTEVBllP86ANSbFigH7WN3v6ydJWqm60pNhNHN//50cnNtIsXbxeq3VtsI64pkH1OJqeZDHLmu73k4T0EKOzsylSfF/wtVBJAAAAFQChpubLHViwPB+jSvUb8e4THS7PBQAAAIAJD1PMCiTCQa1xyD/NCWOajCufTOIzKAhm6l+nlBVPiKI+262XpYt127Ke4mPL8XJBizoTjSQN08uHMg/8L6W/cdO2aZ+mhkBnS1xAm83DAwqLrDraR1w/4QRFxr5Vbyy8qnejrPjTJobBN1BGsv84wHkjmoCn6pFIfkGYeATlJgAAAIAHYPU1zMVBTDWru7SNC4G2UyWGWYYLjLytBVHfQmBa51CmqrSs2kCfGLGA1ynfYENsxcJq9nsXrb4i17H5BHJFkH0g7BUDpeBeLr8gsK3WgfqWwtZsDkltObw9chUD/siK6q/dk/fSIB2Ho0inev7k68Z5ZkNI4XOwuEssAVhmwA== comment for dsa/1024 key |
0 | -----BEGIN PUBLIC KEY----- | |
1 | MIIBtjCCASsGByqGSM44BAEwggEeAoGBAKU8/avmkFeGnSqwYG7dZnQlG+01QNax | |
2 | u3F5v0NcL/SRUW7IdpUq8t14siK0mA6yjphLhOf5t8gugTEVBllP86ANSbFigH7W | |
3 | N3v6ydJWqm60pNhNHN//50cnNtIsXbxeq3VtsI64pkH1OJqeZDHLmu73k4T0EKOz | |
4 | sylSfF/wtVBJAhUAoabmyx1YsDwfo0r1G/HuEx0uzwUCgYAJD1PMCiTCQa1xyD/N | |
5 | CWOajCufTOIzKAhm6l+nlBVPiKI+262XpYt127Ke4mPL8XJBizoTjSQN08uHMg/8 | |
6 | L6W/cdO2aZ+mhkBnS1xAm83DAwqLrDraR1w/4QRFxr5Vbyy8qnejrPjTJobBN1BG | |
7 | sv84wHkjmoCn6pFIfkGYeATlJgOBhAACgYAHYPU1zMVBTDWru7SNC4G2UyWGWYYL | |
8 | jLytBVHfQmBa51CmqrSs2kCfGLGA1ynfYENsxcJq9nsXrb4i17H5BHJFkH0g7BUD | |
9 | peBeLr8gsK3WgfqWwtZsDkltObw9chUD/siK6q/dk/fSIB2Ho0inev7k68Z5ZkNI | |
10 | 4XOwuEssAVhmwA== | |
11 | -----END PUBLIC KEY----- |
0 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
1 | Comment: "1024-bit DSA, converted by miko@HIROKO from OpenSSH" | |
2 | AAAAB3NzaC1kc3MAAACBAKU8/avmkFeGnSqwYG7dZnQlG+01QNaxu3F5v0NcL/SRUW7Idp | |
3 | Uq8t14siK0mA6yjphLhOf5t8gugTEVBllP86ANSbFigH7WN3v6ydJWqm60pNhNHN//50cn | |
4 | NtIsXbxeq3VtsI64pkH1OJqeZDHLmu73k4T0EKOzsylSfF/wtVBJAAAAFQChpubLHViwPB | |
5 | +jSvUb8e4THS7PBQAAAIAJD1PMCiTCQa1xyD/NCWOajCufTOIzKAhm6l+nlBVPiKI+262X | |
6 | pYt127Ke4mPL8XJBizoTjSQN08uHMg/8L6W/cdO2aZ+mhkBnS1xAm83DAwqLrDraR1w/4Q | |
7 | RFxr5Vbyy8qnejrPjTJobBN1BGsv84wHkjmoCn6pFIfkGYeATlJgAAAIAHYPU1zMVBTDWr | |
8 | u7SNC4G2UyWGWYYLjLytBVHfQmBa51CmqrSs2kCfGLGA1ynfYENsxcJq9nsXrb4i17H5BH | |
9 | JFkH0g7BUDpeBeLr8gsK3WgfqWwtZsDkltObw9chUD/siK6q/dk/fSIB2Ho0inev7k68Z5 | |
10 | ZkNI4XOwuEssAVhmwA== | |
11 | ---- END SSH2 PUBLIC KEY ---- |
0 | -----BEGIN EC PRIVATE KEY----- | |
1 | MHcCAQEEIGsCiMB7N5OXYUVyHR4APvQupWm4kxvzPl3o67C+JaojoAoGCCqGSM49 | |
2 | AwEHoUQDQgAEjhAhdfoyDQ1YPo69apv8vzyxOznqGqzmxeQCHq+v02V4VzNqKMJT | |
3 | Kf/2ovP8J9aDWmqPcqA6IVngHJPfFh8kiw== | |
4 | -----END EC PRIVATE KEY----- |
0 | ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBI4QIXX6Mg0NWD6OvWqb/L88sTs56hqs5sXkAh6vr9NleFczaijCUyn/9qLz/CfWg1pqj3KgOiFZ4ByT3xYfJIs= comment for esdsa/256 key |
0 | -----BEGIN PUBLIC KEY----- | |
1 | MIIBSzCCAQMGByqGSM49AgEwgfcCAQEwLAYHKoZIzj0BAQIhAP////8AAAABAAAA | |
2 | AAAAAAAAAAAA////////////////MFsEIP////8AAAABAAAAAAAAAAAAAAAA//// | |
3 | ///////////8BCBaxjXYqjqT57PrvVV2mIa8ZR0GsMxTsPY7zjw+J9JgSwMVAMSd | |
4 | NgiG5wSTamZ44ROdJreBn36QBEEEaxfR8uEsQkf4vOblY6RA8ncDfYEt6zOg9KE5 | |
5 | RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9QIhAP////8AAAAA | |
6 | //////////+85vqtpxeehPO5ysL8YyVRAgEBA0IABI4QIXX6Mg0NWD6OvWqb/L88 | |
7 | sTs56hqs5sXkAh6vr9NleFczaijCUyn/9qLz/CfWg1pqj3KgOiFZ4ByT3xYfJIs= | |
8 | -----END PUBLIC KEY----- |
0 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
1 | Comment: "256-bit ECDSA, converted by miko@HIROKO from OpenSSH" | |
2 | AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBI4QIXX6Mg0NWD6OvW | |
3 | qb/L88sTs56hqs5sXkAh6vr9NleFczaijCUyn/9qLz/CfWg1pqj3KgOiFZ4ByT3xYfJIs= | |
4 | ||
5 | ---- END SSH2 PUBLIC KEY ---- |
0 | -----BEGIN EC PRIVATE KEY----- | |
1 | MIGkAgEBBDD3dcLYMCsBbWxLYEQybGLLM6eUtV3ANwkys6qIxd39ZBIJOXQ6Rh53 | |
2 | xIuu1X8HFlygBwYFK4EEACKhZANiAASWQhcqgIlNqJCXnzncp4aTBiGpG15JJssG | |
3 | 1M5eI3wHQlGkIPpRQ1azuRkpODZREXfIhak/vv378nbAnNoJE69h+xwi1W4hHsz4 | |
4 | qlwatHXJMwcpitiwhzPQZCbbjpuIZjQ= | |
5 | -----END EC PRIVATE KEY----- |
0 | ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBJZCFyqAiU2okJefOdynhpMGIakbXkkmywbUzl4jfAdCUaQg+lFDVrO5GSk4NlERd8iFqT++/fvydsCc2gkTr2H7HCLVbiEezPiqXBq0dckzBymK2LCHM9BkJtuOm4hmNA== comment for esdsa/384 key |
0 | -----BEGIN PUBLIC KEY----- | |
1 | MIIBzDCCAWQGByqGSM49AgEwggFXAgEBMDwGByqGSM49AQECMQD///////////// | |
2 | /////////////////////////////v////8AAAAAAAAAAP////8wewQw//////// | |
3 | //////////////////////////////////7/////AAAAAAAAAAD////8BDCzMS+n | |
4 | 4j7n5JiOBWvj+C0ZGB2cbv6BQRIDFAiPUBOHWsZWOY2KLtGdKoXI7dPsKu8DFQCj | |
5 | NZJqoxmieh0AiWpnc6SCes2scwRhBKqHyiK+iwU3jrHHHvMgrXRuHTtii6ebmFn3 | |
6 | QeCCVCo4VQLyXb9VKWw6VF44cnYKtzYX3kqWJixvXZ6Yv5KS3Cn49B29KJoUfOna | |
7 | MRO18LjACmCxzh1+gZ16Qx18kOoOXwIxAP////////////////////////////// | |
8 | /8djTYH0Ny3fWBoNskiwp3rs7BlqzMUpcwIBAQNiAASWQhcqgIlNqJCXnzncp4aT | |
9 | BiGpG15JJssG1M5eI3wHQlGkIPpRQ1azuRkpODZREXfIhak/vv378nbAnNoJE69h | |
10 | +xwi1W4hHsz4qlwatHXJMwcpitiwhzPQZCbbjpuIZjQ= | |
11 | -----END PUBLIC KEY----- |
0 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
1 | Comment: "384-bit ECDSA, converted by miko@HIROKO from OpenSSH" | |
2 | AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBJZCFyqAiU2okJefOd | |
3 | ynhpMGIakbXkkmywbUzl4jfAdCUaQg+lFDVrO5GSk4NlERd8iFqT++/fvydsCc2gkTr2H7 | |
4 | HCLVbiEezPiqXBq0dckzBymK2LCHM9BkJtuOm4hmNA== | |
5 | ---- END SSH2 PUBLIC KEY ---- |
0 | -----BEGIN EC PRIVATE KEY----- | |
1 | MIHbAgEBBEHeJefvwF/LJrhUok7XvKgIWcZ2BoXq2ebXKSDC4GyYElLhjLtz4eIx | |
2 | p0kySKDqvw0RrelJV7dqbiItueACXH5uDqAHBgUrgQQAI6GBiQOBhgAEAWTfmyu1 | |
3 | 4/23ALBgq9T2i8wGLvsN3qUQE+sVowRvQJl1nkwLedKp+UYdFaRJtSmN0907txhA | |
4 | 2kr1hcds1I7mFtTWAVmDKIYXHAlhjPw0CN50FcyDIfglamUrkVCbk/ly9qCUi0L2 | |
5 | qQqKhReEJzrtgxgG2K9eVR7Q+AirqRsdOptfr7k3 | |
6 | -----END EC PRIVATE KEY----- |
0 | ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAFk35srteP9twCwYKvU9ovMBi77Dd6lEBPrFaMEb0CZdZ5MC3nSqflGHRWkSbUpjdPdO7cYQNpK9YXHbNSO5hbU1gFZgyiGFxwJYYz8NAjedBXMgyH4JWplK5FQm5P5cvaglItC9qkKioUXhCc67YMYBtivXlUe0PgIq6kbHTqbX6+5Nw== comment for esdsa/521 key |
0 | -----BEGIN PUBLIC KEY----- | |
1 | MIICXDCCAc8GByqGSM49AgEwggHCAgEBME0GByqGSM49AQECQgH///////////// | |
2 | //////////////////////////////////////////////////////////////// | |
3 | /////////zCBngRCAf////////////////////////////////////////////// | |
4 | ///////////////////////////////////////8BEFRlT65YY4cmh+SmiGgtoVA | |
5 | 7qLacluZsxXzuLSJkY7xCeFWGTlR7H6TexZSwL07sb8HNXPfiD0sNPHvRR/Ua1A/ | |
6 | AAMVANCeiAApHLhTlsxnFzkyhKqg2mS6BIGFBADGhY4GtwQE6c2ePstmI5W0Qpxk | |
7 | gTkFP7Uh+CivYGtNPbqhS1537+dZKP4dwSei/6jeM0izwYVqQpv5fn4xwuW9ZgEY | |
8 | OSlqeJo7wARcil+0LH0b2Zj1RElXm0RoF6+9Fyc+ZiyX7nKZXvQmQMVQuQE/rQdh | |
9 | NTxwhqJywkCIvpR2n9FmUAJCAf////////////////////////////////////// | |
10 | ////+lGGh4O/L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGQJAgEBA4GGAAQBZN+b | |
11 | K7Xj/bcAsGCr1PaLzAYu+w3epRAT6xWjBG9AmXWeTAt50qn5Rh0VpEm1KY3T3Tu3 | |
12 | GEDaSvWFx2zUjuYW1NYBWYMohhccCWGM/DQI3nQVzIMh+CVqZSuRUJuT+XL2oJSL | |
13 | QvapCoqFF4QnOu2DGAbYr15VHtD4CKupGx06m1+vuTc= | |
14 | -----END PUBLIC KEY----- |
0 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
1 | Comment: "521-bit ECDSA, converted by miko@HIROKO from OpenSSH" | |
2 | AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAFk35srteP9twCwYK | |
3 | vU9ovMBi77Dd6lEBPrFaMEb0CZdZ5MC3nSqflGHRWkSbUpjdPdO7cYQNpK9YXHbNSO5hbU | |
4 | 1gFZgyiGFxwJYYz8NAjedBXMgyH4JWplK5FQm5P5cvaglItC9qkKioUXhCc67YMYBtivXl | |
5 | Ue0PgIq6kbHTqbX6+5Nw== | |
6 | ---- END SSH2 PUBLIC KEY ---- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | MIICWwIBAAKBgQC458k0igFgcvkrDjUKo0gIgPW0+7QEPck7/DXIpGAkHzHDTQLu | |
2 | 7/IzxBDCL7iQhF2eQwaR/s9SXjs2DV/OT3SXM3QjJO4PS3nHkzfP7Zjqm9LGSicB | |
3 | gR8x5LPmxoNVA3qOInMP5xhhgbKYYusuBMAlpEgq/T9uCvLIuvRnGhBTDwIDAQAB | |
4 | AoGAD5UhBLd4pDssOm+pEqtt/6F2k3j+07itQ8vecHlBzOmAFRhhXeeEvs4QJ31E | |
5 | DZHKHfNCE32o1SUx0j1QTJ+vkIWHcQmLR89cLROlB4cyb+e4ki483ROr6niDNhni | |
6 | KeaeW9QGMEHIAbf8UbguA2vU4p+9wcemNiFUJcwiQ740zNECQQD2GyyQbzEUbiiw | |
7 | GjGbH131aVvO2FtYpYWckQhgfrBdwkLECUDRL4ggqGpOgjnF4WFXa2UC/BvLySAE | |
8 | jfwBhUy3AkEAwFbCKDQWIblrQoCeFHU75fASbCXwEGtMIO/+GT9hcpUAB5iQjwOe | |
9 | AMQEbs7aezSufGbIyUUL6AJBGoRGRVcEaQJALwEPqOJjyFgl00Sddtgt1OJzk3UF | |
10 | NVAfzcBxjiSEQNQKdnCh/ZILeNlRvH7o099w/QZY+5H1KR3XzKblm9C+zwJAavKS | |
11 | 6Tn1KHFqg8Lyo1uAn9160OnTb73JyfLIbo+Ahu704kRh9TPEspZMBLU+ZQ2pDAE3 | |
12 | GjsrYKmIO89bJ4k4KQJADF9+tNJ1xtW1z/wS/u1IGTkMLYApyqUMf2ewf5yvD8yx | |
13 | H4PEeYEC96+kn6bdEErk6ssOP2O1n9jwIlRyZgcKOg== | |
14 | -----END RSA PRIVATE KEY----- |
0 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC458k0igFgcvkrDjUKo0gIgPW0+7QEPck7/DXIpGAkHzHDTQLu7/IzxBDCL7iQhF2eQwaR/s9SXjs2DV/OT3SXM3QjJO4PS3nHkzfP7Zjqm9LGSicBgR8x5LPmxoNVA3qOInMP5xhhgbKYYusuBMAlpEgq/T9uCvLIuvRnGhBTDw== comment for rsa/1024 key |
0 | -----BEGIN RSA PUBLIC KEY----- | |
1 | MIGJAoGBALjnyTSKAWBy+SsONQqjSAiA9bT7tAQ9yTv8NcikYCQfMcNNAu7v8jPE | |
2 | EMIvuJCEXZ5DBpH+z1JeOzYNX85PdJczdCMk7g9LeceTN8/tmOqb0sZKJwGBHzHk | |
3 | s+bGg1UDeo4icw/nGGGBsphi6y4EwCWkSCr9P24K8si69GcaEFMPAgMBAAE= | |
4 | -----END RSA PUBLIC KEY----- |
0 | -----BEGIN PUBLIC KEY----- | |
1 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC458k0igFgcvkrDjUKo0gIgPW0 | |
2 | +7QEPck7/DXIpGAkHzHDTQLu7/IzxBDCL7iQhF2eQwaR/s9SXjs2DV/OT3SXM3Qj | |
3 | JO4PS3nHkzfP7Zjqm9LGSicBgR8x5LPmxoNVA3qOInMP5xhhgbKYYusuBMAlpEgq | |
4 | /T9uCvLIuvRnGhBTDwIDAQAB | |
5 | -----END PUBLIC KEY----- |
0 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
1 | Comment: "1024-bit RSA, converted by miko@HIROKO from OpenSSH" | |
2 | AAAAB3NzaC1yc2EAAAADAQABAAAAgQC458k0igFgcvkrDjUKo0gIgPW0+7QEPck7/DXIpG | |
3 | AkHzHDTQLu7/IzxBDCL7iQhF2eQwaR/s9SXjs2DV/OT3SXM3QjJO4PS3nHkzfP7Zjqm9LG | |
4 | SicBgR8x5LPmxoNVA3qOInMP5xhhgbKYYusuBMAlpEgq/T9uCvLIuvRnGhBTDw== | |
5 | ---- END SSH2 PUBLIC KEY ---- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | Proc-Type: 4,ENCRYPTED | |
2 | DEK-Info: AES-128-CBC,253BAF06E085D30F39C03966F03680E2 | |
3 | ||
4 | FmIMXYIseEF2wUqnYcpmDzYWM0jK8QdqJwVpdmTJEKcdlrHAq1Fs8PYzffrutZA7 | |
5 | JTbwDinajRTK6US2ZQamJhq2iljbv+iR9bqbqIp2Zs8u2PI1KuS/9HJOl+arO3Su | |
6 | Dt1LhazOs4UWqXa37nTXUizggUqkOU0p0Fl1xydu17NJi18MRLEKzkd922b7Z2GE | |
7 | WF5VB7w0oXB0MfULnW89nyLXsxni/jGaa/DGm44ERLy9HsdZ1q59HsNuAD3rnVV8 | |
8 | jabRcCy14urnEiwXw27JSDAnZRIRDmigeYL+AlEE+A900G9S4yXWrcTcf04MvUT3 | |
9 | cP1pbAGvdx/R2XlXSpbE5vwE0ctHb6Q2K6r47lL+RoU9+qp2CNW/moPlcHMCUFM4 | |
10 | A01hoWjHWbfPOD+2Ay/lbt43zNviRlIGk8zLVudxn6Z2wfNk/k6+FgeXBzmm9ccq | |
11 | ZodR8XVnef7zCIyIqLX+UgcTV6DjyM6hRMCscKGHsBeafof8ItRkklDiUzZ5bUef | |
12 | bIzta7PGbEAgJr/tKcObODZXjkdOkoMlP5xH8X8Datt8SoFU0Se727j+wUPRN0te | |
13 | NnAe5YGb2GpvzGN2Be1t++GQOc3xUw4c9CDnh+FSxeP45dHA13zBflPy44arDOKz | |
14 | EdvgefMsPxnjf/qsldiCv0kmke8TJ05BF3GCaxbPSMCfbetKldeBOKxxpQW1PNYg | |
15 | Zb+t/eZotzPYrHClphUi8Wz4t5P4Gsf2RXeYeOaTkj8S2kS5MWIIVYSsfieXFYsD | |
16 | mI2FXpQCH0tYDgK1dW36/HGPUqaIBs3gffS6XVMAlwk= | |
17 | -----END RSA PRIVATE KEY----- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | MIIDewIBAAKBwQCkYHef/kFhdtEwG4YZfanYY92cmDX9gqw7OE2dxMyQyj5Eyn/z | |
2 | taIIERJGv2BG7TlEi8Gd83wFvSrqk4diHycQm2FbLtp258buy/PYCY3cvxYL1imU | |
3 | xt6aPeLphzxQpt2dSwCom6M5Dq/sxB4YV+lvVpWZEuIFzsfGtqiLO7U4x80lXC14 | |
4 | 30MtN5Z6nYTOVtktYkFJCmMSThYice6L4RHdTNejQZlmKGfLEKeR3wTwBIfLO9XF | |
5 | kSlHz2Uk4q/Clr0CAwEAAQKBwH3dN/wUbe+5UThq+uWt6U2+OkTb8Atr8YFu/U+f | |
6 | D5yWn9OA0zTDkYxntfziMVBd+QnZkanmdMLYNHJmALZLcFgxAf0WBUYi95qGJPL5 | |
7 | bdznnHP3yuMW3ABy/rseSDrhaXoOpxFbi2dA3OymRCgHXJkW3QlJyqfiGLlFdZtO | |
8 | TCdgQVrk89ceKD2VZA07vgsoy1O7t0W6Gjhgnyz77qXI0UkzFQTkZn4cwKKWi8en | |
9 | g1+AxSEozYMxz6RH6m9j/NKtqQJhAM297KcPFPNcbLZYt66ARzfoUnhHhor9F8/a | |
10 | 3/5nib3EGtQACJwzqFNedRiOXPAe3wzCmNH7Dae9eZMTm+zv0gV04CPbce3KULSW | |
11 | fVa2Z2vCvmT9HT3d4tWkhJtTvps4RwJhAMyHxvGb6tlUlDcwWht3ZaZo9MJXncox | |
12 | ikc0g2GJ3Xs3ZqMnmw/ROeJhL/rrZf0ZM+dPEhu8veQgsD5NElLp05H+Mh+Y3ZQV | |
13 | FbvzjoYxsMt7gEad0Xng/WxyKSzP7EX+2wJgGn/A0E+P+jxIQEAzAEXDZn8EyDsm | |
14 | KBarD3l4ajL5ubhdYDrU4RGCN6Kt4EjNzZucTO9vcXQtcRJlaz0WUzEcUtmX2OZ1 | |
15 | yRPKy0eqwxVhQq7liOpU7tf6VFwJPFxP63wXAmBMNfunY5WqzZ08w0OQIHk7/LfX | |
16 | ApbFFJiV17dszNY+Z3JTMRrSVf/fnp8mPDiQiqeQdSImO7n2G0gQrt85De/L4pAC | |
17 | vg8ycnjaw/JDhph9+dLefUfkxjUoB5HYJNHBcykCYEZkrc//Bi+o7NQdMXuQDNJY | |
18 | My9BOxZddy4VrB2W+KqeEXYrXBBZp8i0iHDWMl7wI+UhhrW8KYGWP/8PAvQRYbNr | |
19 | xig90FpRw5AqTjIKM0bb0BI+zFhJu5fcHY9I6UjISg== | |
20 | -----END RSA PRIVATE KEY----- |
0 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAwQCkYHef/kFhdtEwG4YZfanYY92cmDX9gqw7OE2dxMyQyj5Eyn/ztaIIERJGv2BG7TlEi8Gd83wFvSrqk4diHycQm2FbLtp258buy/PYCY3cvxYL1imUxt6aPeLphzxQpt2dSwCom6M5Dq/sxB4YV+lvVpWZEuIFzsfGtqiLO7U4x80lXC1430MtN5Z6nYTOVtktYkFJCmMSThYice6L4RHdTNejQZlmKGfLEKeR3wTwBIfLO9XFkSlHz2Uk4q/Clr0= comment for rsa/1536 key |
0 | -----BEGIN RSA PUBLIC KEY----- | |
1 | MIHJAoHBAKRgd5/+QWF20TAbhhl9qdhj3ZyYNf2CrDs4TZ3EzJDKPkTKf/O1oggR | |
2 | Eka/YEbtOUSLwZ3zfAW9KuqTh2IfJxCbYVsu2nbnxu7L89gJjdy/FgvWKZTG3po9 | |
3 | 4umHPFCm3Z1LAKibozkOr+zEHhhX6W9WlZkS4gXOx8a2qIs7tTjHzSVcLXjfQy03 | |
4 | lnqdhM5W2S1iQUkKYxJOFiJx7ovhEd1M16NBmWYoZ8sQp5HfBPAEh8s71cWRKUfP | |
5 | ZSTir8KWvQIDAQAB | |
6 | -----END RSA PUBLIC KEY----- |
0 | -----BEGIN PUBLIC KEY----- | |
1 | MIHfMA0GCSqGSIb3DQEBAQUAA4HNADCByQKBwQCkYHef/kFhdtEwG4YZfanYY92c | |
2 | mDX9gqw7OE2dxMyQyj5Eyn/ztaIIERJGv2BG7TlEi8Gd83wFvSrqk4diHycQm2Fb | |
3 | Ltp258buy/PYCY3cvxYL1imUxt6aPeLphzxQpt2dSwCom6M5Dq/sxB4YV+lvVpWZ | |
4 | EuIFzsfGtqiLO7U4x80lXC1430MtN5Z6nYTOVtktYkFJCmMSThYice6L4RHdTNej | |
5 | QZlmKGfLEKeR3wTwBIfLO9XFkSlHz2Uk4q/Clr0CAwEAAQ== | |
6 | -----END PUBLIC KEY----- |
0 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
1 | Comment: "1536-bit RSA, converted by miko@HIROKO from OpenSSH" | |
2 | AAAAB3NzaC1yc2EAAAADAQABAAAAwQCkYHef/kFhdtEwG4YZfanYY92cmDX9gqw7OE2dxM | |
3 | yQyj5Eyn/ztaIIERJGv2BG7TlEi8Gd83wFvSrqk4diHycQm2FbLtp258buy/PYCY3cvxYL | |
4 | 1imUxt6aPeLphzxQpt2dSwCom6M5Dq/sxB4YV+lvVpWZEuIFzsfGtqiLO7U4x80lXC1430 | |
5 | MtN5Z6nYTOVtktYkFJCmMSThYice6L4RHdTNejQZlmKGfLEKeR3wTwBIfLO9XFkSlHz2Uk | |
6 | 4q/Clr0= | |
7 | ---- END SSH2 PUBLIC KEY ---- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | Proc-Type: 4,ENCRYPTED | |
2 | DEK-Info: AES-128-CBC,6724457B0E61D83CACA2F37336709F43 | |
3 | ||
4 | cKmWiYITd+9Q2goeFBMEMptmeZfjwp7GA7uH1Pvo3Op2VDDd14q8vg11MLtSE1oV | |
5 | nAWb0qzraJcXfnANd3+XsmUVh9IMDE4r3dZNgSoIVfGkIUlRNJnXfaFU4OojaWyc | |
6 | RPOcX9wmulcqE4gBKXBnWYjlsoSo9cdJnn79LejxNvxRoPE5XJ+ANmVfeGtZcvvc | |
7 | z5Avsm3L7FXFnD8I5cnYugdnmXU/JJAmI4jqd2EbYtOPDDEwP/4oN5nGMCnZPSGV | |
8 | mAnoBxKH4bWyk2TUfMDHeg8Ma5STuDYmWc5u1/H7Ym5NXxYH7cie6EdhQWw0BMc4 | |
9 | nZ+R3/5k+Taj9/I5IuB8OcztxnnSYVESHxrBqRTs8qPK7060OojLQ351WJos5wHS | |
10 | XHWxh7pGOO5It/hYrIhPVrCY0jcYIhHZmwBx6b/frHvYf2t/LLUw/AVNgUwapL2/ | |
11 | Vv2Et0zZIQHOGZ2VuVDvGWPxjMH8p9+Ql482CrGQ2M2U2DHFcx2uQh1wsmARRhkP | |
12 | 5juYYSYAOGqAkZSR0hmjt1nwnP22WeoWLWUhgNHFrf8qbaQ66dHLnWDSsHlg29du | |
13 | 2Khd4qi8ivpBekFo3PV08Q7rmuhp1wFjrnu+mXhJWh4zp7MQ7XM7UJ5rriAxOBvt | |
14 | RZuLnPDMTsIMPp53G12FH4LpoSUdNY6YlZC0yXrGdg4af4ukNhLxPH5xaeEsPqqW | |
15 | nwOI7Wcmf7sXgH/wLlOeSBQ6eHAIhconjKnxhIxR4htnJNtA3D1MBZEaeI5xbvVL | |
16 | ePSzlvffxjaL0rm76kevWnbKMdwnGGgIvgbT/gYyDmqOD525t4YaiyfC21CUVyZV | |
17 | FM87TBFnxJlcpgY7ewQTJMrufyPanpqm1XmvnpQrYV7pnPexJCx0g40ZUDaQYtcE | |
18 | gOwAWqcD2vXuuFK0/H5/M/LXChOcj9JwnmeZRVB6Wc+TPcniusuUoJiYcoTEUThT | |
19 | 8j1odI+zDu2umliDAMMK8ZEvMBiFi4RtL3qijQt2rlZcfT5/B19d3sIL6Oe6/3dS | |
20 | /lq9/wtCH8Gm2yI2ETKQo90DR90ZD2SxFY80VQhFJgumwTT0FpZJRzOolN9C3opZ | |
21 | h04n2a7KqplKcqXV/nee+2hzzTXMwCdsDL2qE8tFtjTDRg3leYcZPXqIn4xa2qtq | |
22 | Yt1D5JuPhVYZI38ZIpfiJbejCOhjofqz0Upzr6/Qwc8= | |
23 | -----END RSA PRIVATE KEY----- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | MIIEogIBAAKCAQEA3cYzdPtsXO6Xa3gamHP5g0QvDrlq0u8K3uXxFAacpaK0I24b | |
2 | VFVFPjsf+kUmW23jYNxL3Fk0+zUGO9cOyxkoIjSvW4FNStedes6b2NBdiBoMfcWb | |
3 | 7yCVRC0l0ERYCAUhXrGplWbyUXefrM4KtY5jE4m6PX8jyaGSz8rOUhcTxw3silM/ | |
4 | Jc2B1ZrjoczoUo0jR0BlT9B6HvDe3UGhVONAPCUrFIeeu74I15bbNdyhKxmgXstu | |
5 | OKHuCfsZcM1h7IoAI9Q6AhjGg3UkPFnxPwRFCauZjRKfhsUHuIRzMG24NkSWWfJB | |
6 | USjoglInEJFQhQN8lmqPuaHXIMiNN7Kn564JGwIDAQABAoIBAEN53oYlSV8tKN0F | |
7 | +fGQt8X8pOSx/ZKYMJKJG8SgDmFHE9AD3ETYfOzmSGB5UaZX1OrPnDU63yffhjoG | |
8 | wPWCffeKWCBbQw0WdU+8NSbOnuaeJlbOHRewrjnEEtE/OhmWlgSdwZ83Z1rqLqcB | |
9 | ObjrzbFQIl47pMPgaS7X4daQNvBE9yvygiR/wkffBuTXAaGK2/eJAqxdN0pYJvtU | |
10 | +Hg/IFoTBPOe3FRDRFiruiZPcM2ZXpNKTeXPCPd3uV2PyQ0ehYXa5N5QzfZJzrUO | |
11 | vJWVgoUM+TdpL7L2t/UbdcTOBfEhWhygsXvJzAHRQopO7NEkYWSDuefcA/YrmOGG | |
12 | InN58iECgYEA99pG2fPTX9Znd3EoxWa4Ce+p7QBJSPKr1kKhf4Z9zCdch+UT31w4 | |
13 | ZD/s3cXK6XOlj8ygDVzxVm4IDPSzPGDeyeeYg7hbrJivBnxUKoHBSxKcHo7Cv6Hh | |
14 | pzrhV7zYdVQhFbvqMf+j7vKztl81aIkU2TVd1u8vOfsblG0iXOeUsYcCgYEA5RB4 | |
15 | Q2rAEShRlVOJmyJQEpWCGvuQzLrjFZprs70lgowwpFUl/4aOaqp1aye+BZt9JvPv | |
16 | sI7nTM43VscQdWO4h62Q+efjQPUzpELNhcW1SgtnNyZWW0vFTBr+U5P9eYjyHApn | |
17 | ZbCVxS9QU3pXCe2j79V0ejIOOA3nhxQ3z2v9IM0CgYBMdFCWutfhIEoaVhW1jtIG | |
18 | fp90NDpm/jRzi2o15E65wwqQAOH4bIIYqn9uiazmBn5ztTNJ6/mmJ5rkJDeF0Hvo | |
19 | 3D/3oc7lltOmtINh+VSey8bMxkzcwBrTcx4/6kj7KFBsW+MKOUlgVA2LnCLldCOy | |
20 | PPwNaQqwX/1J88A92FHN0QKBgDYocbbG24hy9u8OZD+ImlP6g1tr1S2ClkQ6UXKa | |
21 | qu61xJ5l/2jt4Gg5yy89o0DiJXH7RNWCxA81xoG+6RZIMI3rrJZZjDKEhuQ0YzFY | |
22 | sGdEUPAKIWrOfGRlEXKjT8/XYB7fGtlBKfgIGr7R8xhG1nbTCgoGIbSBHRej4Roq | |
23 | lxuVAoGAJB9h+oys2G3mw2WsD2KuwCROWsRXQLmoZ0Jz1rjMxe4JoGI50/BCKnNQ | |
24 | EfNvS+5D6qjo8QfW7cmlSWk9ZLhT4xOF2i2YCYIARtviN0boJs00hVXmTydH0nfM | |
25 | h2MGPr8DcdhWAjuY4WMo8/av1rVIvFuWaGdKz+1rk1B3OPXKGoA= | |
26 | -----END RSA PRIVATE KEY----- |
0 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDdxjN0+2xc7pdreBqYc/mDRC8OuWrS7wre5fEUBpylorQjbhtUVUU+Ox/6RSZbbeNg3EvcWTT7NQY71w7LGSgiNK9bgU1K1516zpvY0F2IGgx9xZvvIJVELSXQRFgIBSFesamVZvJRd5+szgq1jmMTibo9fyPJoZLPys5SFxPHDeyKUz8lzYHVmuOhzOhSjSNHQGVP0Hoe8N7dQaFU40A8JSsUh567vgjXlts13KErGaBey244oe4J+xlwzWHsigAj1DoCGMaDdSQ8WfE/BEUJq5mNEp+GxQe4hHMwbbg2RJZZ8kFRKOiCUicQkVCFA3yWao+5odcgyI03sqfnrgkb comment for rsa/2048 key |
0 | -----BEGIN RSA PUBLIC KEY----- | |
1 | MIIBCgKCAQEA3cYzdPtsXO6Xa3gamHP5g0QvDrlq0u8K3uXxFAacpaK0I24bVFVF | |
2 | Pjsf+kUmW23jYNxL3Fk0+zUGO9cOyxkoIjSvW4FNStedes6b2NBdiBoMfcWb7yCV | |
3 | RC0l0ERYCAUhXrGplWbyUXefrM4KtY5jE4m6PX8jyaGSz8rOUhcTxw3silM/Jc2B | |
4 | 1ZrjoczoUo0jR0BlT9B6HvDe3UGhVONAPCUrFIeeu74I15bbNdyhKxmgXstuOKHu | |
5 | CfsZcM1h7IoAI9Q6AhjGg3UkPFnxPwRFCauZjRKfhsUHuIRzMG24NkSWWfJBUSjo | |
6 | glInEJFQhQN8lmqPuaHXIMiNN7Kn564JGwIDAQAB | |
7 | -----END RSA PUBLIC KEY----- |
0 | -----BEGIN PUBLIC KEY----- | |
1 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3cYzdPtsXO6Xa3gamHP5 | |
2 | g0QvDrlq0u8K3uXxFAacpaK0I24bVFVFPjsf+kUmW23jYNxL3Fk0+zUGO9cOyxko | |
3 | IjSvW4FNStedes6b2NBdiBoMfcWb7yCVRC0l0ERYCAUhXrGplWbyUXefrM4KtY5j | |
4 | E4m6PX8jyaGSz8rOUhcTxw3silM/Jc2B1ZrjoczoUo0jR0BlT9B6HvDe3UGhVONA | |
5 | PCUrFIeeu74I15bbNdyhKxmgXstuOKHuCfsZcM1h7IoAI9Q6AhjGg3UkPFnxPwRF | |
6 | CauZjRKfhsUHuIRzMG24NkSWWfJBUSjoglInEJFQhQN8lmqPuaHXIMiNN7Kn564J | |
7 | GwIDAQAB | |
8 | -----END PUBLIC KEY----- |
0 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
1 | Comment: "2048-bit RSA, converted by miko@HIROKO from OpenSSH" | |
2 | AAAAB3NzaC1yc2EAAAADAQABAAABAQDdxjN0+2xc7pdreBqYc/mDRC8OuWrS7wre5fEUBp | |
3 | ylorQjbhtUVUU+Ox/6RSZbbeNg3EvcWTT7NQY71w7LGSgiNK9bgU1K1516zpvY0F2IGgx9 | |
4 | xZvvIJVELSXQRFgIBSFesamVZvJRd5+szgq1jmMTibo9fyPJoZLPys5SFxPHDeyKUz8lzY | |
5 | HVmuOhzOhSjSNHQGVP0Hoe8N7dQaFU40A8JSsUh567vgjXlts13KErGaBey244oe4J+xlw | |
6 | zWHsigAj1DoCGMaDdSQ8WfE/BEUJq5mNEp+GxQe4hHMwbbg2RJZZ8kFRKOiCUicQkVCFA3 | |
7 | yWao+5odcgyI03sqfnrgkb | |
8 | ---- END SSH2 PUBLIC KEY ---- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | Proc-Type: 4,ENCRYPTED | |
2 | DEK-Info: AES-128-CBC,E752B3536B1560DE39C17E0FB930F635 | |
3 | ||
4 | TIgSfwVt7W5mvcono7TZCa9hXimqJv1amcCrD0ePqidHW7x0tLyRq2Lj8vMapv9e | |
5 | j20NNxjtmtgfcfHBYBQurVSOve4lI2TZtkA7LsGPvilJBhSN7vyZ/NWmwaHPp/up | |
6 | kfcXe+8R80QI8aGHtennZEnItUDmwwfCY79kctlQfhpWcFox+k6Nodf5im5BABYs | |
7 | /5Bah4eesBvIiZI1ilkOMJ3kGJiXK6mY8Kvw0j7Kr0PHD8NBpeaibdLZtgvq+tye | |
8 | VtAYm6ce/BpG2AD0WWaG3b766XXlQEzybwDTjzqoMCtuIaDcKTmywq7Tysl5/Wvh | |
9 | mj76pRZcsae+7UKr2jZuYXVJZMgJoittg00tSQsV8G39HGtzeDAyEuDP3hffxw0a | |
10 | aShaMBK5FilpvOUxX8ouSWG+GZ40uWwn+DbumiLXzfbiK3Y5b3s2JLxkUoyxqLO/ | |
11 | xDK5VEiFy3rII176PWjY4iYKeK5RbDihy4AWLFkLEG6IBbPxD8dHWiCtkrYVtX1m | |
12 | UAUgotuVa6+RAi/lbhyZzONKrVgks5RsBysNuzwou1jx3v7hzAy+sdhSexzqJFWB | |
13 | /KU4e/LllX/a2LPRJ3vXpV+S3r5xuR9YmYpwkfeGBdizO8OOthOFrwalDy0ay8h6 | |
14 | s4bAzw9vgXRXQWG0oncVADEuOeAa/enPTvT3oXSeCdWeAP9AIuk1F96PRPoBRaVJ | |
15 | UHNB5Dd0LOF2VJ1AI+qhUN09FJpvJ0xeVsiaGr5xgWdAjtLOoEnS6UkYV9L7fvbN | |
16 | Ix0I4wFGT7msuAMlYe19zakVrZ37YlkQLIV6JUm/xIFjSOsH7SCPmmONh3aiN5Qw | |
17 | jCNDg7QghkumkIoYkJp42ulESuIx5JMdfqWnxQgUB5iYy2YqXs1Z6xLIvglhPDMT | |
18 | Xs8yLutppjPqFLO2FKl508u5Am6xPJCP366bZMDpNtlvHZANtwMwKpL1h6PyvqQx | |
19 | 72WktaPVCmrVMIna7dfLRw/p+QwSD0oDuOV6qGVKEgh5Ml+eVnUxCQZxD+ZIdzzp | |
20 | MkP6GKkM/XEwy8GX/0/Cyn+BerfSSUfryh0rskU9RbtpjnywdaBtyJ6DADHEB3GG | |
21 | oVx1E/WAj+ab/n8i85ulbMvunstPRoYG8CJt5pQBKCU5qrcaUI3i56HiBCy9Kw3/ | |
22 | 0tSCn0BE73XZvVZhqtkDV1EYaEKOYSuWmAYx9NHcLSKviiX1GV6fLnPIf60Owrl0 | |
23 | gUewApNsH3WNlpcr6B32xM3R2wh7eW7ClKxrFJZuH3VEt8tuMbgR5kDG1UWB2Cgg | |
24 | x58yOA/kq3hr4Xfv7hDcGRIQjm+9UdtQVAMBQQPd0nfTQofQBQj/j8xYd1S/t2bI | |
25 | cr5gAw/HUF7KgFwJ6YhahhylfKIMDX8/fVp384IyK6aaVG1LVDUuzGC27RFc6GYr | |
26 | MB2rbvok3YDaSaF23oM87hxz3YVGGF+GOhSEWT3lllv1AvH6OruEQkuZOPgJCvXY | |
27 | IJDXEZO2mA9rtSOwZyGcDf8Pm6LRN8eHmlOtn6GeQw373pLJWmWoRsNVM/rNxDZc | |
28 | uJGFgG+PVD5Bp13elb/S/uqhDG3PQK7z9AJMVE9sdBulADqxbdlj+LUqDKHfkETh | |
29 | -----END RSA PRIVATE KEY----- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | 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 | |
50 | -----END RSA PRIVATE KEY----- |
0 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCjoUqRX9tJ6YVj+E7Y0D9oy2SCUtoLmNqovMOc/bWB+Fg8GgEQNp99XvH6p+/XDIY4Mm91Q9o1rydWnAnHKs/9LOySpOUNbbflDsFstN8ZrqqyuPiIoZqawQvYexk0/0ZyNckA9fWAKZDJom1N5DutBK55Dgq40yHkpAB6nlqdWLY8Iab0V4LKTtNBGydrdPR8A10I54kDkFxx82NOZNJ9hq7QYYJDsL5Le/fB+PqIksP5qo2lfaPJe9xtx7m4+FIJRQQOLrFef/K0tO1Zv0U5dVNHmWWhyTN4tnwoEX4pZ7YkHHemcBFiX4xt70/zpvG5cuIPMwJIA5P72w7A5ifKSoTLrkQGy7yW/ezyxrm42Ng5jNQb+jsiuQhcnU/IKip7xO1K2zxSPhcwDRRIPGGwkCfMrr5PG4EVn9PJCeW/ydQpOm4ysJay8AZxyQohP1jRasus+qUGovOHD6rjiDrg0lDpJY7Cf6EtPU/Z0GFyf5WY4952lRiawIXLi0VOAexG/s/n+eIiwTiFOtnmURjRjLJ3TlkVy/C9Iw6TBaJsF9DW/MN4BeYMSAVodVjqWJyLQc7ulbymguMuNnkhDjQ1XR0SXNw9fzT9lE+NC+EOwxysOu+y9ErV6lA8mExwtmu/a9zHUnyunXUz8ZVFh6mUhP0Tc7X/F/Q2XTTxzzC4jw== comment for rsa/4096 key |
0 | -----BEGIN RSA PUBLIC KEY----- | |
1 | MIICCgKCAgEAo6FKkV/bSemFY/hO2NA/aMtkglLaC5jaqLzDnP21gfhYPBoBEDaf | |
2 | fV7x+qfv1wyGODJvdUPaNa8nVpwJxyrP/SzskqTlDW235Q7BbLTfGa6qsrj4iKGa | |
3 | msEL2HsZNP9GcjXJAPX1gCmQyaJtTeQ7rQSueQ4KuNMh5KQAep5anVi2PCGm9FeC | |
4 | yk7TQRsna3T0fANdCOeJA5BccfNjTmTSfYau0GGCQ7C+S3v3wfj6iJLD+aqNpX2j | |
5 | yXvcbce5uPhSCUUEDi6xXn/ytLTtWb9FOXVTR5llockzeLZ8KBF+KWe2JBx3pnAR | |
6 | Yl+Mbe9P86bxuXLiDzMCSAOT+9sOwOYnykqEy65EBsu8lv3s8sa5uNjYOYzUG/o7 | |
7 | IrkIXJ1PyCoqe8TtSts8Uj4XMA0USDxhsJAnzK6+TxuBFZ/TyQnlv8nUKTpuMrCW | |
8 | svAGcckKIT9Y0WrLrPqlBqLzhw+q44g64NJQ6SWOwn+hLT1P2dBhcn+VmOPedpUY | |
9 | msCFy4tFTgHsRv7P5/niIsE4hTrZ5lEY0Yyyd05ZFcvwvSMOkwWibBfQ1vzDeAXm | |
10 | DEgFaHVY6lici0HO7pW8poLjLjZ5IQ40NV0dElzcPX80/ZRPjQvhDsMcrDrvsvRK | |
11 | 1epQPJhMcLZrv2vcx1J8rp11M/GVRYeplIT9E3O1/xf0Nl008c8wuI8CAwEAAQ== | |
12 | -----END RSA PUBLIC KEY----- |
0 | -----BEGIN PUBLIC KEY----- | |
1 | MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAo6FKkV/bSemFY/hO2NA/ | |
2 | aMtkglLaC5jaqLzDnP21gfhYPBoBEDaffV7x+qfv1wyGODJvdUPaNa8nVpwJxyrP | |
3 | /SzskqTlDW235Q7BbLTfGa6qsrj4iKGamsEL2HsZNP9GcjXJAPX1gCmQyaJtTeQ7 | |
4 | rQSueQ4KuNMh5KQAep5anVi2PCGm9FeCyk7TQRsna3T0fANdCOeJA5BccfNjTmTS | |
5 | fYau0GGCQ7C+S3v3wfj6iJLD+aqNpX2jyXvcbce5uPhSCUUEDi6xXn/ytLTtWb9F | |
6 | OXVTR5llockzeLZ8KBF+KWe2JBx3pnARYl+Mbe9P86bxuXLiDzMCSAOT+9sOwOYn | |
7 | ykqEy65EBsu8lv3s8sa5uNjYOYzUG/o7IrkIXJ1PyCoqe8TtSts8Uj4XMA0USDxh | |
8 | sJAnzK6+TxuBFZ/TyQnlv8nUKTpuMrCWsvAGcckKIT9Y0WrLrPqlBqLzhw+q44g6 | |
9 | 4NJQ6SWOwn+hLT1P2dBhcn+VmOPedpUYmsCFy4tFTgHsRv7P5/niIsE4hTrZ5lEY | |
10 | 0Yyyd05ZFcvwvSMOkwWibBfQ1vzDeAXmDEgFaHVY6lici0HO7pW8poLjLjZ5IQ40 | |
11 | NV0dElzcPX80/ZRPjQvhDsMcrDrvsvRK1epQPJhMcLZrv2vcx1J8rp11M/GVRYep | |
12 | lIT9E3O1/xf0Nl008c8wuI8CAwEAAQ== | |
13 | -----END PUBLIC KEY----- |
0 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
1 | Comment: "4096-bit RSA, converted by miko@HIROKO from OpenSSH" | |
2 | AAAAB3NzaC1yc2EAAAADAQABAAACAQCjoUqRX9tJ6YVj+E7Y0D9oy2SCUtoLmNqovMOc/b | |
3 | WB+Fg8GgEQNp99XvH6p+/XDIY4Mm91Q9o1rydWnAnHKs/9LOySpOUNbbflDsFstN8Zrqqy | |
4 | uPiIoZqawQvYexk0/0ZyNckA9fWAKZDJom1N5DutBK55Dgq40yHkpAB6nlqdWLY8Iab0V4 | |
5 | LKTtNBGydrdPR8A10I54kDkFxx82NOZNJ9hq7QYYJDsL5Le/fB+PqIksP5qo2lfaPJe9xt | |
6 | x7m4+FIJRQQOLrFef/K0tO1Zv0U5dVNHmWWhyTN4tnwoEX4pZ7YkHHemcBFiX4xt70/zpv | |
7 | G5cuIPMwJIA5P72w7A5ifKSoTLrkQGy7yW/ezyxrm42Ng5jNQb+jsiuQhcnU/IKip7xO1K | |
8 | 2zxSPhcwDRRIPGGwkCfMrr5PG4EVn9PJCeW/ydQpOm4ysJay8AZxyQohP1jRasus+qUGov | |
9 | OHD6rjiDrg0lDpJY7Cf6EtPU/Z0GFyf5WY4952lRiawIXLi0VOAexG/s/n+eIiwTiFOtnm | |
10 | URjRjLJ3TlkVy/C9Iw6TBaJsF9DW/MN4BeYMSAVodVjqWJyLQc7ulbymguMuNnkhDjQ1XR | |
11 | 0SXNw9fzT9lE+NC+EOwxysOu+y9ErV6lA8mExwtmu/a9zHUnyunXUz8ZVFh6mUhP0Tc7X/ | |
12 | F/Q2XTTxzzC4jw== | |
13 | ---- END SSH2 PUBLIC KEY ---- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | Proc-Type: 4,ENCRYPTED | |
2 | DEK-Info: AES-128-CBC,A26F7B9DB28D8D9548D32560F7A9C06E | |
3 | ||
4 | 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 | |
53 | -----END RSA PRIVATE KEY----- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | MIIBywIBAAJhANh5t4ZAUKeVCI1ETuv1QRuOv4NAxN3DVkcYHbDrEP8PMp6bzvrU | |
2 | Z0KmqwusZrDYPtpIig/UHlLPzvRihVYefoCjse+bXtXcrF+fgHTUY1BMzn4vbqZ1 | |
3 | izmIk0a7+W1R1wIDAQABAmEAq8E3Cb+xvqUSmfMeozx+If1Kmjsjd8hqhhHuTNbV | |
4 | L2nBgfKhcIZiP5G5mJN7Dski77gqXkNk2e4/hXezBRFgW9f+58P77lCziQ2a7f24 | |
5 | UGJffLaxbwK7JKOyONyBv68BAjEA7uxiVTW//ejJXxCO+pFeCZ4HTC7E4YUibOjH | |
6 | iw7QcF4DF8LFhxB9mILi5VLEXmCXAjEA5/KZlRMxLcRTSJ6Yco0C8GOFH8+jqWMU | |
7 | aUez5zzukKy3D8ivg7Xc69oLf2FWPYDBAjAz9+i/ngxfvzWl3uUqrVnl/6CYuoeK | |
8 | gjnltJBKt/MwrdJAZdYvNbAL71RJC0K5QIsCMQDTAoQv947E6RcvOIDNrXUgBhmk | |
9 | z/w+7BE0mfOTiX4rBcVgSZ1KwFckBXBySLXxK8ECMASNKoZFnTNjU3NnanGqWk4l | |
10 | VhPn5x5saUHEJtH4AnX8gWE+LmxA6nw3efM8NtxSog== | |
11 | -----END RSA PRIVATE KEY----- |
0 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAYQDYebeGQFCnlQiNRE7r9UEbjr+DQMTdw1ZHGB2w6xD/DzKem8761GdCpqsLrGaw2D7aSIoP1B5Sz870YoVWHn6Ao7Hvm17V3Kxfn4B01GNQTM5+L26mdYs5iJNGu/ltUdc= comment for rsa/768 key |
0 | -----BEGIN RSA PUBLIC KEY----- | |
1 | MGgCYQDYebeGQFCnlQiNRE7r9UEbjr+DQMTdw1ZHGB2w6xD/DzKem8761GdCpqsL | |
2 | rGaw2D7aSIoP1B5Sz870YoVWHn6Ao7Hvm17V3Kxfn4B01GNQTM5+L26mdYs5iJNG | |
3 | u/ltUdcCAwEAAQ== | |
4 | -----END RSA PUBLIC KEY----- |
0 | -----BEGIN PUBLIC KEY----- | |
1 | MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhANh5t4ZAUKeVCI1ETuv1QRuOv4NAxN3D | |
2 | VkcYHbDrEP8PMp6bzvrUZ0KmqwusZrDYPtpIig/UHlLPzvRihVYefoCjse+bXtXc | |
3 | rF+fgHTUY1BMzn4vbqZ1izmIk0a7+W1R1wIDAQAB | |
4 | -----END PUBLIC KEY----- |
0 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
1 | Comment: "768-bit RSA, converted by miko@HIROKO from OpenSSH" | |
2 | AAAAB3NzaC1yc2EAAAADAQABAAAAYQDYebeGQFCnlQiNRE7r9UEbjr+DQMTdw1ZHGB2w6x | |
3 | D/DzKem8761GdCpqsLrGaw2D7aSIoP1B5Sz870YoVWHn6Ao7Hvm17V3Kxfn4B01GNQTM5+ | |
4 | L26mdYs5iJNGu/ltUdc= | |
5 | ---- END SSH2 PUBLIC KEY ---- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | Proc-Type: 4,ENCRYPTED | |
2 | DEK-Info: AES-128-CBC,B8B44B077A4C4A63144875D0A8319272 | |
3 | ||
4 | 4S9dwwHP6kvCq+PHpCOEuJV9eFZo30ujR4V4ju2GEDxoNzl+RvBurSABRv+MOwOO | |
5 | +7cXxFOCNFOnhKxvwENLyJ/wvkO7X0al1lF0yFHoF5scWFG1LRxQKp3kpW+k/ncW | |
6 | +eO72S7Er0fv3DbMC7ZqXXecHc5RauC16quRWqHrYuRHpGj8VqzveEz2r4XAg0zB | |
7 | OBq+osTF/fxydpncrtChRwcgyCZ7Er9eMEID0T+vlJFmuNEUYvYW9j4BVqMcmoKA | |
8 | qKr5vr95ss4Hq8lOnha4OQlVzod883QzB3MCMLFkE3e9x3DyvyfGgm0CIIZzz/I4 | |
9 | 3w40pmq1tB/yrp2V8PvdC+ksWHx/2MFuzhcgeugfnrE0my9khsGLkaS2k1fbueBl | |
10 | s83tIODLBbvjS26KxrADo5vHltwGD9GK6CpnAbL4tS2YVHiOaaI8fqWjNNq8EoXI | |
11 | tmMve/dEej0HILbjIp0IqKs/rOtrTxf4UBKAhf+j2S8VxDq1gf28YR34zHEpzM3p | |
12 | bMTPlg0KZRYJ9x7VNz818a4FSBJOWMI8VXBbb7lW/iSQwvQ3orX5rhNrdkHa4B2W | |
13 | aYaiT78/MwUzjmexGRSgNhymDmHrNx76cg40MeWV6vU= | |
14 | -----END RSA PRIVATE KEY----- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | 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 | |
98 | -----END RSA PRIVATE KEY----- |
0 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAEAQCpX3u2NWcx7n4Hoe7/AYqLItYRwcstbTuve0yTZ6HHcwKs6RChChunSVne2fkxecuLdpiAZNrdja7sQxqL0wDi+vjWucLml0hDQ2ipPy4/849DmQeNVh11oRoUkA6HpI5oSr5LTJGpXinT/CRMP3lU4oM7GXwyOslHBJsQz3xwiZgjC9dsU06FrZLxby0noB5EkGYHWIU7TABogVrl+q8aqiFIli6oUW4QGlefQNbv1yn/P1xkk/JDpN7BZW7XX1cbAc19p+MqVuMekI34bjHMoVU5evY4WqmtfWRIoounAclCuiOue/qrYMoXwo64JrMaX19nIl65jrDqfjCtRQtWq6i9D/pTF2LzERgEkLU9xV6stIXKkcpjyErBrvlKlRHdXWhkGN1XonTK32GSPOxsDkRsyjOCrfMlTkcuOunIBKzpFWF0N9m6H6jh/mDdatvQ1t72clgTgQI1rrtxh4RzbiKThq7GEuQn5aVjsj/Z0q+qeY71t7lNF1kaaLa44kPWcmSMqv9us0U90mgSn+J/KtFnBBDzs4gQsn54BEyZUhF/qOl4FfpgzR6+KzdQRfXlGY2LFHTlPbdyJnsBlRs3ld2W3lghbNNi4VZsLt0syDdyaW2wr3atWlFsq5XxkGY7/lyRzHlWRCIAbSSZgDz/aWBBdpvg54AtIvRJysO1nZdfD0b1NLjD8oGt3hftWyUn/6/UigW36AfqgsJjHly2mpSW53lYJHktsrPfrQDNT3J/SftKpGTjU5Rwxz41JSQwEifM5LomG/MGrw5+kJGdp4GhlRSqf25lR3BRSjSI6r7ofYPGOCSc9TWjnEifv1HtcH08mzd92Bu6WXCWFpXxerf9oLSWYlZDLUl9nxdpclGaqQyyVXwFWKKUieu0+wg/u2YryrQ1JgTsAlWFYh8/So9yWyqXcwFkKpL0cWf1sRbRTuLzhUIyc31MNWyVN1P+j1HGKEveKVfGTxiaNx8qxEFlsssNVmFwHvLB7sX7P8hMXjZxevTekKLkKR+//EEQp8qwjHDlOPWm1tQPuKMHsbDcjxyXqFO6HMEJhfeV0OWK6tBMlypSjM8+8fmqFBSiJGmXM1S0v/8S6D2Q/3OrnFD5XLOsuubTYeSqJNzIaLSNvHvGk1tJRqc4qQjDRXI8ZQ+QGZJBl3ejHUM9f1cNMApCom4RfcZqvK0NTesb4OhFF7K3V8Bb6DfYaW76TtJQYtN/sGAweSrifzXZ3XaBHelCrh91kozzKrEcJYeGtUfR9o823U3pTk5bX7QvECgLuP6G5L8Lc6V8VI8iXhV6SfEVN9ecwh6nLsUHimqS5IvdynbqQ9rj3+ZhaVQiHmrF1n3jrxnEIY0IWSUdUwH5 comment for rsa/8192 key |
0 | -----BEGIN RSA PUBLIC KEY----- | |
1 | MIIECgKCBAEAqV97tjVnMe5+B6Hu/wGKiyLWEcHLLW07r3tMk2ehx3MCrOkQoQob | |
2 | p0lZ3tn5MXnLi3aYgGTa3Y2u7EMai9MA4vr41rnC5pdIQ0NoqT8uP/OPQ5kHjVYd | |
3 | daEaFJAOh6SOaEq+S0yRqV4p0/wkTD95VOKDOxl8MjrJRwSbEM98cImYIwvXbFNO | |
4 | ha2S8W8tJ6AeRJBmB1iFO0wAaIFa5fqvGqohSJYuqFFuEBpXn0DW79cp/z9cZJPy | |
5 | Q6TewWVu119XGwHNfafjKlbjHpCN+G4xzKFVOXr2OFqprX1kSKKLpwHJQrojrnv6 | |
6 | q2DKF8KOuCazGl9fZyJeuY6w6n4wrUULVquovQ/6Uxdi8xEYBJC1PcVerLSFypHK | |
7 | Y8hKwa75SpUR3V1oZBjdV6J0yt9hkjzsbA5EbMozgq3zJU5HLjrpyASs6RVhdDfZ | |
8 | uh+o4f5g3Wrb0Nbe9nJYE4ECNa67cYeEc24ik4auxhLkJ+WlY7I/2dKvqnmO9be5 | |
9 | TRdZGmi2uOJD1nJkjKr/brNFPdJoEp/ifyrRZwQQ87OIELJ+eARMmVIRf6jpeBX6 | |
10 | YM0evis3UEX15RmNixR05T23ciZ7AZUbN5Xdlt5YIWzTYuFWbC7dLMg3cmltsK92 | |
11 | rVpRbKuV8ZBmO/5ckcx5VkQiAG0kmYA8/2lgQXab4OeALSL0ScrDtZ2XXw9G9TS4 | |
12 | w/KBrd4X7VslJ/+v1IoFt+gH6oLCYx5ctpqUlud5WCR5LbKz360AzU9yf0n7SqRk | |
13 | 41OUcMc+NSUkMBInzOS6JhvzBq8OfpCRnaeBoZUUqn9uZUdwUUo0iOq+6H2Dxjgk | |
14 | nPU1o5xIn79R7XB9PJs3fdgbullwlhaV8Xq3/aC0lmJWQy1JfZ8XaXJRmqkMslV8 | |
15 | BViilInrtPsIP7tmK8q0NSYE7AJVhWIfP0qPclsql3MBZCqS9HFn9bEW0U7i84VC | |
16 | MnN9TDVslTdT/o9RxihL3ilXxk8YmjcfKsRBZbLLDVZhcB7ywe7F+z/ITF42cXr0 | |
17 | 3pCi5Ckfv/xBEKfKsIxw5Tj1ptbUD7ijB7Gw3I8cl6hTuhzBCYX3ldDliurQTJcq | |
18 | UozPPvH5qhQUoiRplzNUtL//Eug9kP9zq5xQ+VyzrLrm02HkqiTcyGi0jbx7xpNb | |
19 | SUanOKkIw0VyPGUPkBmSQZd3ox1DPX9XDTAKQqJuEX3GarytDU3rG+DoRReyt1fA | |
20 | W+g32Glu+k7SUGLTf7BgMHkq4n812d12gR3pQq4fdZKM8yqxHCWHhrVH0faPNt1N | |
21 | 6U5OW1+0LxAoC7j+huS/C3OlfFSPIl4VeknxFTfXnMIepy7FB4pqkuSL3cp26kPa | |
22 | 49/mYWlUIh5qxdZ9468ZxCGNCFklHVMB+QIDAQAB | |
23 | -----END RSA PUBLIC KEY----- |
0 | -----BEGIN PUBLIC KEY----- | |
1 | MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEAqV97tjVnMe5+B6Hu/wGK | |
2 | iyLWEcHLLW07r3tMk2ehx3MCrOkQoQobp0lZ3tn5MXnLi3aYgGTa3Y2u7EMai9MA | |
3 | 4vr41rnC5pdIQ0NoqT8uP/OPQ5kHjVYddaEaFJAOh6SOaEq+S0yRqV4p0/wkTD95 | |
4 | VOKDOxl8MjrJRwSbEM98cImYIwvXbFNOha2S8W8tJ6AeRJBmB1iFO0wAaIFa5fqv | |
5 | GqohSJYuqFFuEBpXn0DW79cp/z9cZJPyQ6TewWVu119XGwHNfafjKlbjHpCN+G4x | |
6 | zKFVOXr2OFqprX1kSKKLpwHJQrojrnv6q2DKF8KOuCazGl9fZyJeuY6w6n4wrUUL | |
7 | VquovQ/6Uxdi8xEYBJC1PcVerLSFypHKY8hKwa75SpUR3V1oZBjdV6J0yt9hkjzs | |
8 | bA5EbMozgq3zJU5HLjrpyASs6RVhdDfZuh+o4f5g3Wrb0Nbe9nJYE4ECNa67cYeE | |
9 | c24ik4auxhLkJ+WlY7I/2dKvqnmO9be5TRdZGmi2uOJD1nJkjKr/brNFPdJoEp/i | |
10 | fyrRZwQQ87OIELJ+eARMmVIRf6jpeBX6YM0evis3UEX15RmNixR05T23ciZ7AZUb | |
11 | N5Xdlt5YIWzTYuFWbC7dLMg3cmltsK92rVpRbKuV8ZBmO/5ckcx5VkQiAG0kmYA8 | |
12 | /2lgQXab4OeALSL0ScrDtZ2XXw9G9TS4w/KBrd4X7VslJ/+v1IoFt+gH6oLCYx5c | |
13 | tpqUlud5WCR5LbKz360AzU9yf0n7SqRk41OUcMc+NSUkMBInzOS6JhvzBq8OfpCR | |
14 | naeBoZUUqn9uZUdwUUo0iOq+6H2DxjgknPU1o5xIn79R7XB9PJs3fdgbullwlhaV | |
15 | 8Xq3/aC0lmJWQy1JfZ8XaXJRmqkMslV8BViilInrtPsIP7tmK8q0NSYE7AJVhWIf | |
16 | P0qPclsql3MBZCqS9HFn9bEW0U7i84VCMnN9TDVslTdT/o9RxihL3ilXxk8Ymjcf | |
17 | KsRBZbLLDVZhcB7ywe7F+z/ITF42cXr03pCi5Ckfv/xBEKfKsIxw5Tj1ptbUD7ij | |
18 | B7Gw3I8cl6hTuhzBCYX3ldDliurQTJcqUozPPvH5qhQUoiRplzNUtL//Eug9kP9z | |
19 | q5xQ+VyzrLrm02HkqiTcyGi0jbx7xpNbSUanOKkIw0VyPGUPkBmSQZd3ox1DPX9X | |
20 | DTAKQqJuEX3GarytDU3rG+DoRReyt1fAW+g32Glu+k7SUGLTf7BgMHkq4n812d12 | |
21 | gR3pQq4fdZKM8yqxHCWHhrVH0faPNt1N6U5OW1+0LxAoC7j+huS/C3OlfFSPIl4V | |
22 | eknxFTfXnMIepy7FB4pqkuSL3cp26kPa49/mYWlUIh5qxdZ9468ZxCGNCFklHVMB | |
23 | +QIDAQAB | |
24 | -----END PUBLIC KEY----- |
0 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
1 | Comment: "8192-bit RSA, converted by miko@HIROKO from OpenSSH" | |
2 | AAAAB3NzaC1yc2EAAAADAQABAAAEAQCpX3u2NWcx7n4Hoe7/AYqLItYRwcstbTuve0yTZ6 | |
3 | HHcwKs6RChChunSVne2fkxecuLdpiAZNrdja7sQxqL0wDi+vjWucLml0hDQ2ipPy4/849D | |
4 | mQeNVh11oRoUkA6HpI5oSr5LTJGpXinT/CRMP3lU4oM7GXwyOslHBJsQz3xwiZgjC9dsU0 | |
5 | 6FrZLxby0noB5EkGYHWIU7TABogVrl+q8aqiFIli6oUW4QGlefQNbv1yn/P1xkk/JDpN7B | |
6 | ZW7XX1cbAc19p+MqVuMekI34bjHMoVU5evY4WqmtfWRIoounAclCuiOue/qrYMoXwo64Jr | |
7 | MaX19nIl65jrDqfjCtRQtWq6i9D/pTF2LzERgEkLU9xV6stIXKkcpjyErBrvlKlRHdXWhk | |
8 | GN1XonTK32GSPOxsDkRsyjOCrfMlTkcuOunIBKzpFWF0N9m6H6jh/mDdatvQ1t72clgTgQ | |
9 | I1rrtxh4RzbiKThq7GEuQn5aVjsj/Z0q+qeY71t7lNF1kaaLa44kPWcmSMqv9us0U90mgS | |
10 | n+J/KtFnBBDzs4gQsn54BEyZUhF/qOl4FfpgzR6+KzdQRfXlGY2LFHTlPbdyJnsBlRs3ld | |
11 | 2W3lghbNNi4VZsLt0syDdyaW2wr3atWlFsq5XxkGY7/lyRzHlWRCIAbSSZgDz/aWBBdpvg | |
12 | 54AtIvRJysO1nZdfD0b1NLjD8oGt3hftWyUn/6/UigW36AfqgsJjHly2mpSW53lYJHktsr | |
13 | PfrQDNT3J/SftKpGTjU5Rwxz41JSQwEifM5LomG/MGrw5+kJGdp4GhlRSqf25lR3BRSjSI | |
14 | 6r7ofYPGOCSc9TWjnEifv1HtcH08mzd92Bu6WXCWFpXxerf9oLSWYlZDLUl9nxdpclGaqQ | |
15 | yyVXwFWKKUieu0+wg/u2YryrQ1JgTsAlWFYh8/So9yWyqXcwFkKpL0cWf1sRbRTuLzhUIy | |
16 | c31MNWyVN1P+j1HGKEveKVfGTxiaNx8qxEFlsssNVmFwHvLB7sX7P8hMXjZxevTekKLkKR | |
17 | +//EEQp8qwjHDlOPWm1tQPuKMHsbDcjxyXqFO6HMEJhfeV0OWK6tBMlypSjM8+8fmqFBSi | |
18 | JGmXM1S0v/8S6D2Q/3OrnFD5XLOsuubTYeSqJNzIaLSNvHvGk1tJRqc4qQjDRXI8ZQ+QGZ | |
19 | JBl3ejHUM9f1cNMApCom4RfcZqvK0NTesb4OhFF7K3V8Bb6DfYaW76TtJQYtN/sGAweSri | |
20 | fzXZ3XaBHelCrh91kozzKrEcJYeGtUfR9o823U3pTk5bX7QvECgLuP6G5L8Lc6V8VI8iXh | |
21 | V6SfEVN9ecwh6nLsUHimqS5IvdynbqQ9rj3+ZhaVQiHmrF1n3jrxnEIY0IWSUdUwH5 | |
22 | ---- END SSH2 PUBLIC KEY ---- |
0 | -----BEGIN RSA PRIVATE KEY----- | |
1 | Proc-Type: 4,ENCRYPTED | |
2 | DEK-Info: AES-128-CBC,555970539213A18AC076A1D00F0C23B7 | |
3 | ||
4 | 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 | |
101 | -----END RSA PRIVATE KEY----- |
0 | use strict; | |
1 | use warnings; | |
2 | use Test::More; | |
3 | ||
4 | use Crypt::PK::RSA; | |
5 | use Crypt::PK::ECC; | |
6 | ||
7 | my $rsa = Crypt::PK::RSA->new; | |
8 | my $ec = Crypt::PK::ECC->new; | |
9 | ok($rsa, "RSA new"); | |
10 | ok($ec, "ECC new"); | |
11 | ||
12 | ### RSA | |
13 | ||
14 | for my $f (qw/jwk_rsa-priv.json jwk_rsa-priv1.json jwk_rsa-pub1.json /) { | |
15 | $rsa->import_key("t/data/$f"); | |
16 | my $kh = $rsa->key2hash; | |
17 | ok($kh->{N}, "RSA N test $f"); | |
18 | ok($kh->{e}, "RSA e test $f"); | |
19 | } | |
20 | ||
21 | my $RSA1 = { | |
22 | d => "5F8713B5E258FE09F81583EC5C1F2B7578B1E6FC2C83514B37913711A1BA449A151FE1CB2CA0FD33B771E68A3B1944649DC867AD1C1E5240BB853E5F24B33459B14028D2D6636BEFEC1E8DA974B352FC53D3F6127EA8A3C29DD14F3941682C56A78768164E4DDA8F06CBF9C734AAE8003224278EA9454A21B17CB06D178075868CC05B3DB6FF1DFDC3D56378B4EDADEDF0C37A4CDC26D1D49AC26F6FE3B5220A5DD29396621BBC688CF2EEE2C6E0D54DA3C782014CD0739DB252CC51CAEBA8D3F1B824BAAB24D068EC903264D7D678AB08F06EC9E7E23D960628B744BF94B3694656463C7E417399ED73D076C891FCF463A9AA9CE62DA9CD17E237DC2A8002F1", | |
23 | dP => "1B8B0F5E473A61AF72F28256F7F20B8F8C6EA69BB49738BF1FB553912F318F949D5F7728134A22998C31222D9E99302E7B450E6B97698051B2049E1CF2D436545E34D9746E80A0D33FC6A4621168E6D000EFB41EFCD9ADB9865CDC2DE6DC8DB81B61AF479B120F153200DDB3ABC2DF9FD1149ACEAB63739BF187A22A44E2063D", | |
24 | dQ => "1B8B0F5E473A61AF72F28256F7F20B8F8C6EA69BB49738BF1FB553912F318F949D5F7728134A22998C31222D9E99302E7B450E6B97698051B2049E1CF2D436545E34D9746E80A0D33FC6A4621168E6D000EFB41EFCD9ADB9865CDC2DE6DC8DB81B61AF479B120F153200DDB3ABC2DF9FD1149ACEAB63739BF187A22A44E2063D", | |
25 | e => "10001", | |
26 | N => "D2FC7B6A0A1E6C67104AEB8F88B257669B4DF679DDAD099B5C4A6CD9A88015B5A133BF0B856C7871B6DF000B554FCEB3C2ED512BB68F145C6E8434752FAB52A1CFC124408F79B58A4578C16428855789F7A249E384CB2D9FAE2D67FD96FB926C198E077399FDC815C0AF097DDE5AADEFF44DE70E827F4878432439BFEEB96068D0474FC50D6D90BF3A98DFAF1040C89C02D692AB3B3C2896609D86FD73B774CE0740647CEEEAA310BD12F985A8EB9F59FDD426CEA5B2120F4F2A34BCAB764B7E6C54D6840238BCC40587A59E66ED1F33894577635C470AF75CF92C20D1DA43E1BFC419E222A6F0D0BB358C5E38F9CB050AEAFE904814F1AC1AA49CCA9EA0CA83", | |
27 | p => "F378BEEC8BCC197A0C5C2B24BFBDD32ABF3ADFB1623BB676EF3BFCA23EA96D6510C8B3D0050C6D3D59F00F6D11FBAD1E4C3983DAE8E732DE4FA2A32B9BC45F98D855583B638CC9823233A949789C1478FB5CEB95218432A955A558487A74DDFA19565893DDCDF0173DBD8E35C72F01F51CF3386550CD7BCD12F9FB3B49D56DFB", | |
28 | q => "DDD7CE47D72E62AFB44BE9A414BCE022D80C11F173076AB78567A132E1B4A02BAA9DBDEFA1B2F2BA6AA355940ED5D22B7708139C276963305C39F5B9AF7EF40055E38967EDFCD1848A8BE89E2CE12A9A3D5554BBF13CC583190876B79C45ECEC67ED6461DFECD6A0DBC6D9031207C0213006F4B527003BA7E2F21C6FAC9E9719", | |
29 | qP => "1B233FA7A26B5F24A2CF5B6816029B595F89748DE3438CA9BBDADB316C77AD02417E6B7416863381421911514470EAB07A644DF35CE80C069AF819342963460E3247643743985856DC037B948FA9BB193F987646275D6BC7247C3B9E572D27B748F9917CAC1923AC94DB8671BD0285608B5D95D50A1B33BA21AEB34CA8405515", | |
30 | size => 256, | |
31 | type => 1, | |
32 | }; | |
33 | ||
34 | my $RSA2 = { | |
35 | d => "", | |
36 | dP => "", | |
37 | dQ => "", | |
38 | e => "10001", | |
39 | N => "D2FC7B6A0A1E6C67104AEB8F88B257669B4DF679DDAD099B5C4A6CD9A88015B5A133BF0B856C7871B6DF000B554FCEB3C2ED512BB68F145C6E8434752FAB52A1CFC124408F79B58A4578C16428855789F7A249E384CB2D9FAE2D67FD96FB926C198E077399FDC815C0AF097DDE5AADEFF44DE70E827F4878432439BFEEB96068D0474FC50D6D90BF3A98DFAF1040C89C02D692AB3B3C2896609D86FD73B774CE0740647CEEEAA310BD12F985A8EB9F59FDD426CEA5B2120F4F2A34BCAB764B7E6C54D6840238BCC40587A59E66ED1F33894577635C470AF75CF92C20D1DA43E1BFC419E222A6F0D0BB358C5E38F9CB050AEAFE904814F1AC1AA49CCA9EA0CA83", | |
40 | p => "", | |
41 | q => "", | |
42 | qP => "", | |
43 | size => 256, | |
44 | type => 0, | |
45 | }; | |
46 | ||
47 | { | |
48 | $rsa->import_key($RSA1); | |
49 | my $kh = $rsa->key2hash; | |
50 | is($kh->{N}, $RSA1->{N}, "RSA N test HASH1"); | |
51 | is($kh->{e}, $RSA1->{e}, "RSA e test HASH1"); | |
52 | is($kh->{p}, $RSA1->{p}, "RSA private p test HASH1"); | |
53 | is($kh->{q}, $RSA1->{q}, "RSA private q test HASH1"); | |
54 | is($kh->{d}, $RSA1->{d}, "RSA private d test HASH1"); | |
55 | is($kh->{dP}, $RSA1->{dP}, "RSA private dP test HASH1"); | |
56 | is($kh->{dQ}, $RSA1->{dQ}, "RSA private dQ test HASH1"); | |
57 | is($kh->{qP}, $RSA1->{qP}, "RSA private qP test HASH1"); | |
58 | ok($rsa->is_private, "RSA private test HASH1"); | |
59 | my $jwk = $rsa->export_key_jwk('private'); | |
60 | my $jwkp = $rsa->export_key_jwk('public'); | |
61 | ### jwk re-import private key | |
62 | $rsa->import_key(\$jwk); | |
63 | $kh = $rsa->key2hash; | |
64 | ok($rsa->is_private, "RSA private test JWK1"); | |
65 | is($kh->{N}, $RSA1->{N}, "RSA N test JWK1"); | |
66 | is($kh->{e}, $RSA1->{e}, "RSA e test JWK1"); | |
67 | is($kh->{p}, $RSA1->{p}, "RSA private p test JWK1"); | |
68 | is($kh->{q}, $RSA1->{q}, "RSA private q test JWK1"); | |
69 | is($kh->{d}, $RSA1->{d}, "RSA private d test JWK1"); | |
70 | is($kh->{dP}, $RSA1->{dP}, "RSA private dP test JWK1"); | |
71 | is($kh->{dQ}, $RSA1->{dQ}, "RSA private dQ test JWK1"); | |
72 | is($kh->{qP}, $RSA1->{qP}, "RSA private qP test JWK1"); | |
73 | ### jwk re-import public key | |
74 | $rsa->import_key(\$jwkp); | |
75 | $kh = $rsa->key2hash; | |
76 | ok(!$rsa->is_private, "RSA !private test JWK2"); | |
77 | is($kh->{N}, $RSA1->{N}, "RSA N test JWK2"); | |
78 | is($kh->{e}, $RSA1->{e}, "RSA e test JWK2"); | |
79 | is($kh->{p}, "", "RSA private p test JWK2"); | |
80 | is($kh->{q}, "", "RSA private q test JWK2"); | |
81 | is($kh->{d}, "", "RSA private d test JWK2"); | |
82 | is($kh->{dP}, "", "RSA private dP test JWK2"); | |
83 | is($kh->{dQ}, "", "RSA private dQ test JWK2"); | |
84 | is($kh->{qP}, "", "RSA private qP test JWK2"); | |
85 | } | |
86 | ||
87 | { | |
88 | $rsa->import_key($RSA2); | |
89 | my $kh = $rsa->key2hash; | |
90 | is($kh->{N}, $RSA1->{N}, "RSA N test HASH2"); | |
91 | is($kh->{e}, $RSA1->{e}, "RSA e test HASH2"); | |
92 | is($kh->{p}, "", "RSA private p test HASH2"); | |
93 | is($kh->{q}, "", "RSA private q test HASH2"); | |
94 | is($kh->{d}, "", "RSA private d test HASH2"); | |
95 | is($kh->{dP}, "", "RSA private dP test HASH2"); | |
96 | is($kh->{dQ}, "", "RSA private dQ test HASH2"); | |
97 | is($kh->{qP}, "", "RSA private qP test HASH2"); | |
98 | ok(!$rsa->is_private, "RSA private test HASH2"); | |
99 | } | |
100 | ||
101 | ### ECC | |
102 | ||
103 | for my $f (qw/jwk_ec-priv1.json jwk_ec-pub.json jwk_ec-pub1.json/) { | |
104 | $ec->import_key("t/data/$f"); | |
105 | my $kh = $ec->key2hash; | |
106 | ok($kh->{pub_x}, "EC x test $f"); | |
107 | ok($kh->{pub_y}, "EC y test $f"); | |
108 | } | |
109 | ||
110 | my $EC1 = { | |
111 | curve_A => "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", | |
112 | curve_B => "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", | |
113 | curve_bits => 256, | |
114 | curve_bytes => 32, | |
115 | curve_cofactor => 1, | |
116 | curve_Gx => "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", | |
117 | curve_Gy => "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", | |
118 | curve_name => "secp256r1", | |
119 | curve_order => "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", | |
120 | curve_prime => "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", | |
121 | k => "F3BD0C07A81FB932781ED52752F60CC89A6BE5E51934FE01938DDB55D8F77801", | |
122 | pub_x => "30A0424CD21C2944838A2D75C92B37E76EA20D9F00893A3B4EEE8A3C0AAFEC3E", | |
123 | pub_y => "E04B65E92456D9888B52B379BDFBD51EE869EF1F0FC65B6659695B6CCE081723", | |
124 | size => 32, | |
125 | type => 1, | |
126 | }; | |
127 | ||
128 | my $EC2 = { | |
129 | curve_A => "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", | |
130 | curve_B => "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", | |
131 | curve_bits => 256, | |
132 | curve_bytes => 32, | |
133 | curve_cofactor => 1, | |
134 | curve_Gx => "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", | |
135 | curve_Gy => "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", | |
136 | curve_name => "secp256r1", | |
137 | curve_order => "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", | |
138 | curve_prime => "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", | |
139 | k => "", | |
140 | pub_x => "30A0424CD21C2944838A2D75C92B37E76EA20D9F00893A3B4EEE8A3C0AAFEC3E", | |
141 | pub_y => "E04B65E92456D9888B52B379BDFBD51EE869EF1F0FC65B6659695B6CCE081723", | |
142 | size => 32, | |
143 | type => 0, | |
144 | }; | |
145 | ||
146 | { | |
147 | $ec->import_key($EC1); | |
148 | my $kh = $ec->key2hash; | |
149 | is($kh->{pub_x}, $EC1->{pub_x}, "EC x test HASH1"); | |
150 | is($kh->{pub_y}, $EC1->{pub_y}, "EC y test HASH1"); | |
151 | is($kh->{k}, $EC1->{k}, "EC k test HASH1"); | |
152 | is($kh->{curve_name}, "secp256r1", "EC curve test HASH1"); | |
153 | ok($ec->is_private, "EC private test HASH1"); | |
154 | my $jwk = $ec->export_key_jwk('private'); | |
155 | my $jwkp = $ec->export_key_jwk('public'); | |
156 | ### jwk re-import private key | |
157 | $ec->import_key(\$jwk); | |
158 | $kh = $ec->key2hash; | |
159 | is($kh->{pub_x}, $EC1->{pub_x}, "EC x test JWK1"); | |
160 | is($kh->{pub_y}, $EC1->{pub_y}, "EC y test JWK1"); | |
161 | is($kh->{k}, $EC1->{k}, "EC k test JWK1"); | |
162 | is($kh->{curve_name}, "secp256r1", "EC curve test JWK1"); | |
163 | ok($ec->is_private, "EC private test JWK1"); | |
164 | ### jwk re-import public key | |
165 | $ec->import_key(\$jwkp); | |
166 | $kh = $ec->key2hash; | |
167 | is($kh->{pub_x}, $EC1->{pub_x}, "EC x test JWK2"); | |
168 | is($kh->{pub_y}, $EC1->{pub_y}, "EC y test JWK2"); | |
169 | is($kh->{k}, "", "EC k test JWK2"); | |
170 | is($kh->{curve_name}, "secp256r1", "EC curve test JWK2"); | |
171 | ok(!$ec->is_private, "EC !private test JWK2"); | |
172 | } | |
173 | ||
174 | { | |
175 | $ec->import_key($EC2); | |
176 | my $kh = $ec->key2hash; | |
177 | is($kh->{pub_x}, $EC1->{pub_x}, "EC x test HASH2"); | |
178 | is($kh->{pub_y}, $EC1->{pub_y}, "EC y test HASH2"); | |
179 | is($kh->{k}, "", "EC k test HASH2"); | |
180 | is($kh->{curve_name}, "secp256r1", "EC curve test HASH2"); | |
181 | ok(!$ec->is_private, "EC private test HASH2"); | |
182 | } | |
183 | ||
184 | done_testing;⏎ |
0 | use strict; | |
1 | use warnings; | |
2 | use Test::More; | |
3 | ||
4 | use Crypt::PK::RSA; | |
5 | use Crypt::PK::ECC; | |
6 | ||
7 | ### generating test keys: | |
8 | # | |
9 | # openssl genrsa -out rsakey.priv.pem 1024 | |
10 | # openssl.exe pkcs8 -topk8 -v1 PBE-SHA1-3DES -passout pass:secret -in rsakey.priv.pem -out pkcs8.rsa-priv-pass.pem | |
11 | # openssl.exe pkcs8 -topk8 -v1 PBE-SHA1-3DES -passout pass:secret -in rsakey.priv.pem -out pkcs8.rsa-priv-pass.der -outform DER | |
12 | # openssl.exe pkcs8 -topk8 -nocrypt -in rsakey.priv.pem -out pkcs8.rsa-priv-nopass.pem | |
13 | # openssl.exe pkcs8 -topk8 -nocrypt -in rsakey.priv.pem -out pkcs8.rsa-priv-nopass.der -outform DER | |
14 | # | |
15 | # openssl ecparam -param_enc explicit -name prime192v3 -genkey -out eckey.priv.pem | |
16 | # openssl.exe pkcs8 -topk8 -v1 PBE-SHA1-3DES -passout pass:secret -in eckey.priv.pem -out pkcs8.ec-priv-pass.pem | |
17 | # openssl.exe pkcs8 -topk8 -v1 PBE-SHA1-3DES -passout pass:secret -in eckey.priv.pem -out pkcs8.ec-priv-pass.der -outform DER | |
18 | # openssl.exe pkcs8 -topk8 -nocrypt -in eckey.priv.pem -out pkcs8.ec-priv-nopass.pem | |
19 | # openssl.exe pkcs8 -topk8 -nocrypt -in eckey.priv.pem -out pkcs8.ec-priv-nopass.der -outform DER | |
20 | # | |
21 | # openssl ecparam -name prime192v3 -genkey -out eckey.priv.pem | |
22 | # openssl.exe pkcs8 -topk8 -v1 PBE-SHA1-3DES -passout pass:secret -in eckey.priv.pem -out pkcs8.ec-short-priv-pass.pem | |
23 | # openssl.exe pkcs8 -topk8 -v1 PBE-SHA1-3DES -passout pass:secret -in eckey.priv.pem -out pkcs8.ec-short-priv-pass.der -outform DER | |
24 | # openssl.exe pkcs8 -topk8 -nocrypt -in eckey.priv.pem -out pkcs8.ec-short-priv-nopass.pem | |
25 | # openssl.exe pkcs8 -topk8 -nocrypt -in eckey.priv.pem -out pkcs8.ec-short-priv-nopass.der -outform DER | |
26 | # | |
27 | ||
28 | my $rsa = Crypt::PK::RSA->new; | |
29 | my $ec = Crypt::PK::ECC->new; | |
30 | ok($rsa, "RSA new"); | |
31 | ok($ec, "ECC new"); | |
32 | ||
33 | for my $f (qw/pkcs8.rsa-priv-nopass.pem pkcs8.rsa-priv-nopass.der/) { | |
34 | $rsa->import_key("t/data/$f"); | |
35 | ok($rsa->is_private, "RSA is_private $f"); | |
36 | } | |
37 | ||
38 | ### XXX-FIXME password protected pkcs8 private keys are not supported | |
39 | ### for my $f (qw/pkcs8.rsa-priv-pass.der pkcs8.rsa-priv-pass.pem/) { | |
40 | ### $rsa->import_key("t/data/$f"); | |
41 | ### ok($rsa->is_private, "RSA is_private $f"); | |
42 | ### } | |
43 | ||
44 | for my $f (qw/pkcs8.ec-short-priv-nopass.der pkcs8.ec-short-priv-nopass.pem pkcs8.ec-priv-nopass.der pkcs8.ec-priv-nopass.pem/) { | |
45 | $ec->import_key("t/data/$f"); | |
46 | ok($ec->is_private, "ECC is_private $f"); | |
47 | } | |
48 | ||
49 | ### XXX-FIXME password protected pkcs8 private keys are not supported | |
50 | ### for my $f (qw/pkcs8.ec-priv-pass.der pkcs8.ec-priv-pass.pem pkcs8.ec-short-priv-pass.der pkcs8.ec-short-priv-pass.pem/) { | |
51 | ### $ec->import_key("t/data/$f"); | |
52 | ### ok($ec->is_private, "ECC is_private $f"); | |
53 | ### } | |
54 | ||
55 | done_testing;⏎ |
0 | use strict; | |
1 | use warnings; | |
2 | use Test::More; | |
3 | ||
4 | use Crypt::PK::RSA; | |
5 | use Crypt::PK::ECC; | |
6 | use Crypt::PK::DSA; | |
7 | use Data::Dumper; | |
8 | ||
9 | my $rsa = Crypt::PK::RSA->new; | |
10 | my $ec = Crypt::PK::ECC->new; | |
11 | my $dsa = Crypt::PK::DSA->new; | |
12 | ok($rsa, "RSA new"); | |
13 | ok($ec, "ECC new"); | |
14 | ok($dsa, "DSA new"); | |
15 | ||
16 | my $dir = "t/data/ssh"; | |
17 | ||
18 | for my $f (qw/ssh_rsa_1024 ssh_rsa_1536 ssh_rsa_2048 ssh_rsa_4096 ssh_rsa_768 ssh_rsa_8192/) { | |
19 | $rsa->import_key("$dir/$f"); | |
20 | ok($rsa->is_private, "RSA is_private $f"); | |
21 | $rsa->import_key("$dir/$f\_passwd", "secret"); | |
22 | ok($rsa->is_private, "RSA is_private $f\_passwd"); | |
23 | $rsa->import_key("$dir/$f.pub.pkcs8"); | |
24 | ok(!$rsa->is_private, "RSA !is_private $f.pub.pkcs8"); | |
25 | $rsa->import_key("$dir/$f.pub"); | |
26 | ok(!$rsa->is_private, "RSA !is_private $f.pub"); | |
27 | $rsa->import_key("$dir/$f.pub.pem"); | |
28 | ok(!$rsa->is_private, "RSA !is_private $f.pub.pem"); | |
29 | $rsa->import_key("$dir/$f.pub.rfc4716"); | |
30 | ok(!$rsa->is_private, "RSA !is_private $f.pub.rfc4716"); | |
31 | } | |
32 | ||
33 | for my $f (qw/ssh_ecdsa_256 ssh_ecdsa_384 ssh_ecdsa_521/) { | |
34 | $ec->import_key("$dir/$f"); | |
35 | ok($ec->is_private, "ECC is_private $f"); | |
36 | $ec->import_key("$dir/$f.pub.pkcs8"); | |
37 | ok(!$ec->is_private, "ECC !is_private $f.pub.pkcs8"); | |
38 | $ec->import_key("$dir/$f.pub"); | |
39 | ok(!$ec->is_private, "ECC !is_private $f.pub"); | |
40 | $ec->import_key("$dir/$f.pub.rfc4716"); | |
41 | ok(!$ec->is_private, "ECC !is_private $f.pub.rfc4716"); | |
42 | } | |
43 | ||
44 | { | |
45 | my $f = "ssh_dsa_1024"; | |
46 | $dsa->import_key("$dir/$f"); | |
47 | ok($dsa->is_private, "DSA is_private $f"); | |
48 | my $kh_priv = $dsa->key2hash; | |
49 | $dsa->import_key("$dir/$f.pub.pkcs8"); | |
50 | ok(!$dsa->is_private, "DSA !is_private $f.pub.pkcs8"); | |
51 | my $kh_pub = $dsa->key2hash; | |
52 | $dsa->import_key("$dir/$f.pub"); | |
53 | ok(!$dsa->is_private, "DSA !is_private $f.pub"); | |
54 | $dsa->import_key("$dir/$f.pub.rfc4716"); | |
55 | ok(!$dsa->is_private, "DSA !is_private $f.pub.rfc4716"); | |
56 | $dsa->import_key($kh_priv); | |
57 | ok($dsa->is_private, "DSA is_private HASH"); | |
58 | $dsa->import_key($kh_pub); | |
59 | ok(!$dsa->is_private, "DSA !is_private HASH"); | |
60 | } | |
61 | ||
62 | done_testing;⏎ |
0 | 0 | ########################### |
1 | 1 | TYPEMAP |
2 | 2 | |
3 | Crypt::Cipher T_PTROBJ | |
4 | Crypt::Digest T_PTROBJ | |
3 | Crypt::Cipher T_PTROBJ | |
4 | Crypt::Digest T_PTROBJ | |
5 | 5 | |
6 | Crypt::AuthEnc::CCM T_PTROBJ | |
7 | Crypt::AuthEnc::EAX T_PTROBJ | |
8 | Crypt::AuthEnc::GCM T_PTROBJ | |
9 | Crypt::AuthEnc::OCB T_PTROBJ | |
6 | Crypt::AuthEnc::CCM T_PTROBJ | |
7 | Crypt::AuthEnc::EAX T_PTROBJ | |
8 | Crypt::AuthEnc::GCM T_PTROBJ | |
9 | Crypt::AuthEnc::OCB T_PTROBJ | |
10 | 10 | |
11 | Crypt::Mac::F9 T_PTROBJ | |
12 | Crypt::Mac::HMAC T_PTROBJ | |
13 | Crypt::Mac::OMAC T_PTROBJ | |
14 | Crypt::Mac::Pelican T_PTROBJ | |
15 | Crypt::Mac::PMAC T_PTROBJ | |
16 | Crypt::Mac::XCBC T_PTROBJ | |
11 | Crypt::Mac::F9 T_PTROBJ | |
12 | Crypt::Mac::HMAC T_PTROBJ | |
13 | Crypt::Mac::OMAC T_PTROBJ | |
14 | Crypt::Mac::Pelican T_PTROBJ | |
15 | Crypt::Mac::PMAC T_PTROBJ | |
16 | Crypt::Mac::XCBC T_PTROBJ | |
17 | 17 | |
18 | Crypt::Mode::CBC T_PTROBJ | |
19 | Crypt::Mode::CFB T_PTROBJ | |
20 | Crypt::Mode::CTR T_PTROBJ | |
21 | Crypt::Mode::ECB T_PTROBJ | |
22 | Crypt::Mode::F8 T_PTROBJ | |
23 | Crypt::Mode::LRW T_PTROBJ | |
24 | Crypt::Mode::OFB T_PTROBJ | |
25 | Crypt::Mode::XTS T_PTROBJ | |
18 | Crypt::Mode::CBC T_PTROBJ | |
19 | Crypt::Mode::CFB T_PTROBJ | |
20 | Crypt::Mode::CTR T_PTROBJ | |
21 | Crypt::Mode::ECB T_PTROBJ | |
22 | Crypt::Mode::F8 T_PTROBJ | |
23 | Crypt::Mode::LRW T_PTROBJ | |
24 | Crypt::Mode::OFB T_PTROBJ | |
25 | Crypt::Mode::XTS T_PTROBJ | |
26 | 26 | |
27 | Crypt::PRNG T_PTROBJ | |
27 | Crypt::PRNG T_PTROBJ | |
28 | 28 | |
29 | Crypt::PK::RSA T_PTROBJ | |
30 | Crypt::PK::DSA T_PTROBJ | |
31 | Crypt::PK::ECC T_PTROBJ | |
32 | Crypt::PK::DH T_PTROBJ | |
29 | Crypt::PK::RSA T_PTROBJ | |
30 | Crypt::PK::DSA T_PTROBJ | |
31 | Crypt::PK::ECC T_PTROBJ | |
32 | Crypt::PK::DH T_PTROBJ | |
33 | 33 | |
34 | 34 | #pointer with automatic NULL<->undef conversion on input/output |
35 | unsigned char * T_PTR_OR_NULL | |
35 | unsigned char * T_PTR_OR_NULL | |
36 | char * T_STR_OR_NULL | |
37 | const char * T_STR_OR_NULL | |
36 | 38 | |
37 | 39 | #perl 5.6.2 hack |
38 | 40 | STRLEN T_UV |
41 | 43 | INPUT |
42 | 44 | |
43 | 45 | T_PTR_OR_NULL |
44 | $var = (SvIOK($arg)) ? INT2PTR($type,SvIVX($arg)) : NULL; | |
46 | $var = (SvIOK($arg)) ? INT2PTR($type,SvIVX($arg)) : NULL; | |
47 | ||
48 | T_STR_OR_NULL | |
49 | $var = (SvOK($arg)) ? SvPV_nolen($arg) : NULL; | |
45 | 50 | |
46 | 51 | ########################### |
47 | 52 | OUTPUT |
48 | 53 | |
49 | 54 | T_PTR_OR_NULL |
50 | if ($var==NULL) XSRETURN_UNDEF; | |
51 | else sv_setiv($arg, PTR2IV($var)); | |
55 | if ($var==NULL) XSRETURN_UNDEF; | |
56 | else sv_setiv($arg, PTR2IV($var)); | |
57 | ||
58 | T_STR_OR_NULL | |
59 | if ($var==NULL) XSRETURN_UNDEF; | |
60 | else sv_setpv($arg, $var); |