Codebase list libcryptx-perl / b04a9c5
v0.021_4 Karel Miko 8 years ago
93 changed file(s) with 2274 addition(s) and 271 deletion(s). Raw diff Collapse all Expand all
00 Changes for CryptX
11
22 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-----"
55 - disable LTC_FAST for gcc 3
66 - add CCM interface for new-add-add-done mode
7 - add SHA3
87 - switch yarrow > fortuna for Crypt::PK::*
98 - 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)
1110 - DSA: generate_key($p, $q, $g), generate_key(\$dsa_params_der), generate_key($dsa_params_file)
1211 - DH: generate_key($base, $prime), generate_key(\$dh_params_der), generate_key($dh_params_file)
1312 - 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
1913 - XS croaks should report the "real caller" (Crypt::Mac::*, Crypt::Mode::*, ...)
2014
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)
2221 - new: SHA512_224 + SHA512_256
23 - new: Crypt::PK::ECC now supports loading keys without explicit curve parameters (with just curve oid)
2422 - libtomcrypt updated to the latest develop branch, commit aeaa6d4a51 Apr 17 08:59:35 2015 +0200
2523 - libtommath updated to the latest develop branch, commit 0fd5e6c17f Dec 11 14:59:35 2014 +0100
2624 - 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
2424 my ($self, $type, $password, $cipher) = @_;
2525 my $key = $self->export_key_der($type||'');
2626 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';
2828 return Crypt::PK::_asn1_to_pem($key, "DSA PUBLIC KEY") if $type eq 'public';
2929 return Crypt::PK::_asn1_to_pem($key, "PUBLIC KEY") if $type eq 'public_x509';
3030 }
3232 sub import_key {
3333 my ($self, $key, $password) = @_;
3434 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
3544 my $data;
3645 if (ref($key) eq 'SCALAR') {
3746 $data = $$key;
4251 else {
4352 croak "FATAL: non-existing file '$key'";
4453 }
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";
5074 }
5175
5276 sub encrypt {
472496 openssl dsa -in dsakey.priv.pem -text
473497 openssl dsa -in dsakey-passwd.priv.pem -text -inform pem -passin pass:secret
474498 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
476500
477501 =head2 Keys generated by OpenSSL
478502
1111 use Crypt::PK;
1212 use Crypt::Digest 'digest_data';
1313 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);
1516
1617 our %curve = (
1718 ### http://www.ecc-brainpool.org/download/Domain-parameters.pdf (v1.0 19.10.2005)
360361 },
361362 );
362363
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
363426 sub new {
364427 my ($class, $f, $p) = @_;
365428 my $self = _new();
371434 my ($self, $type, $password, $cipher) = @_;
372435 my $key = $self->export_key_der($type||'');
373436 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';
375438 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 }
376473 }
377474
378475 sub import_key {
379476 my ($self, $key, $password) = @_;
380477 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
381498 my $data;
382499 if (ref($key) eq 'SCALAR') {
383500 $data = $$key;
388505 else {
389506 croak "FATAL: non-existing file '$key'";
390507 }
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";
396550 }
397551
398552 sub encrypt {
9101064 openssl ec -in eckey.priv.pem -text
9111065 openssl ec -in eckey-passwd.priv.pem -text -inform pem -passin pass:secret
9121066 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
9141068
9151069 =head2 Keys generated by OpenSSL
9161070
1111 use Crypt::PK;
1212 use Crypt::Digest 'digest_data';
1313 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);
1516
1617 sub new {
1718 my ($class, $f, $p) = @_;
2526 my $key = $self->export_key_der($type||'');
2627 return unless $key;
2728
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)
3031 # PKCS#8 EncryptedPrivateKeyInfo** (PEM header: BEGIN ENCRYPTED PRIVATE KEY)
3132 return Crypt::PK::_asn1_to_pem($key, "RSA PRIVATE KEY", $password, $cipher) if $type eq 'private';
3233
3334 # PKCS#1 RSAPublicKey* (PEM header: BEGIN RSA PUBLIC KEY)
3435 return Crypt::PK::_asn1_to_pem($key, "RSA PUBLIC KEY") if $type eq 'public';
3536 # 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 }
3767 }
3868
3969 sub import_key {
4070 my ($self, $key, $password) = @_;
4171 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
4288 my $data;
4389 if (ref($key) eq 'SCALAR') {
4490 $data = $$key;
4995 else {
5096 croak "FATAL: non-existing file '$key'";
5197 }
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";
57144 }
58145
59146 sub encrypt {
603690 openssl rsa -in rsakey.priv.pem -text
604691 openssl rsa -in rsakey-passwd.priv.pem -text -inform pem -passin pass:secret
605692 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
607694
608695 =head2 Keys generated by OpenSSL
609696
5050 return substr($key, 0, $klen);
5151 }
5252
53 sub _pem_to_asn1 {
53 sub _pem_to_binary {
5454 my ($data, $password) = @_;
5555
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
5763
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;
6068
6169 my ($ptype, $cipher_name, $iv_hex);
6270 for my $h (split /\n/, ($headers||'')) {
7078 my $iv = pack("H*", $iv_hex);
7179 my ($mode, $klen) = _name2mode($cipher_name);
7280 my $key = _password2key($password, $klen, $iv, 'MD5');
73 return $mode->decrypt($content, $key, $iv);
81 return $mode->decrypt($binary, $key, $iv);
7482 }
7583
76 return $content;
84 return $binary;
7785 }
7886
7987 sub _asn1_to_pem {
100108 $rv .= "-----END $header_name-----\n";
101109 }
102110
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
103126 1;
104127
105128 __END__
22 use strict;
33 use warnings ;
44
5 our $VERSION = '0.021_3';
5 our $VERSION = '0.021_4';
66
77 require XSLoader;
88 XSLoader::load('CryptX', $VERSION);
4444 XPUSHs(ST(0)); /* return self */
4545 }
4646
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
4758 int
4859 is_private(Crypt::PK::DSA self)
4960 CODE:
4444 _ecc_free_key(&self->key, &self->dp);
4545 rv = ecc_import_full(data, (unsigned long)data_len, &self->key, &self->dp);
4646 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));
4762 XPUSHs(ST(0)); /* return self */
4863 }
4964
4242 if (self->key.type != -1) { rsa_free(&self->key); self->key.type = -1; }
4343 rv = rsa_import(data, (unsigned long)data_len, &self->key);
4444 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));
4571 XPUSHs(ST(0)); /* return self */
4672 }
4773
290290
291291 int ecc_dp_init(ltc_ecc_set_type *dp);
292292 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);
293295 int ecc_dp_clear(ltc_ecc_set_type *dp);
296
294297
295298 int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key);
296299 int ecc_make_key_ex(prng_state *prng, int wprng, ecc_key *key, const ltc_ecc_set_type *dp);
533536
534537 int der_length_sequence(ltc_asn1_list *list, unsigned long inlen,
535538 unsigned long *outlen);
539 int der_length_sequence_ex(ltc_asn1_list *list, unsigned long inlen,
540 unsigned long *outlen, unsigned long *payloadlen);
536541
537542 /* SUBJECT PUBLIC KEY INFO */
538543 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
1616
1717 #ifdef LTC_MECC
1818
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
14319 int ecc_import_full(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp)
14420 {
14521 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];
14723 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];
14824 unsigned long len_a, len_b, len_k, len_g, len_xy, len_oid;
14925 unsigned long cofactor = 0, ecver = 0, pkver = 0, tmpoid[16], curveoid[16];
150 /*oid_st oid;*/
15126 int err;
15227
15328 if ((err = mp_init_multi(&prime, &order, &a, &b, &gx, &gy, NULL)) != CRYPT_OK) return err;
15833 err = der_decode_subject_public_key_info_ex(in, inlen, PKA_EC, bin_xy, &len_xy, LTC_ASN1_OBJECT_IDENTIFIER, curveoid, 16UL, &len_oid);
15934 if (err == CRYPT_OK) {
16035 /* 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; }
16237 /* load public key */
16338 if ((err = ecc_import_raw(bin_xy, len_xy, key, dp)) != CRYPT_OK) { goto error; }
16439 goto success;
18560 /* try to load public key */
18661 len_xy = sizeof(bin_xy);
18762 err = der_decode_subject_public_key_info(in, inlen, PKA_EC, bin_xy, &len_xy, LTC_ASN1_SEQUENCE, seq_ecparams, 6);
63
18864 if (err == CRYPT_OK) {
18965 len_a = seq_curve[0].size;
19066 len_b = seq_curve[1].size;
19470 if ((err = mp_read_unsigned_bin(b, bin_b, len_b)) != CRYPT_OK) { goto error; }
19571 if ((err = ecc_import_point(bin_g, len_g, prime, a, b, gx, gy)) != CRYPT_OK) { goto error; }
19672 /* 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; }
19874 /* load public key */
19975 if ((err = ecc_import_raw(bin_xy, len_xy, key, dp)) != CRYPT_OK) { goto error; }
20076 goto success;
21187 seq_priv[3].tag = 0xA1; /* context specific 1 */
21288 /* try to load private key */
21389 err = der_decode_sequence(in, inlen, seq_priv, 4);
90
21491 if (err == CRYPT_OK) {
21592 /* 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; }
21794 /* load private+public key */
21895 if ((err = ecc_import_raw(bin_k, seq_priv[1].size, key, dp)) != CRYPT_OK) { goto error; }
21996 goto success;
257134 if ((err = mp_read_unsigned_bin(b, bin_b, len_b)) != CRYPT_OK) { goto error; }
258135 if ((err = ecc_import_point(bin_g, len_g, prime, a, b, gx, gy)) != CRYPT_OK) { goto error; }
259136 /* 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; }
261138 /* load private+public key */
262139 if ((err = ecc_import_raw(bin_k, len_k, key, dp)) != CRYPT_OK) { goto error; }
263140 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
9898 return CRYPT_MEM;
9999 }
100100
101 if (inlen == (unsigned long)dp->size) {
101 if (inlen <= (unsigned long)dp->size) {
102102 /* read PRIVATE key */
103103 type = PK_PRIVATE;
104104 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"}
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-----
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-----
0 -----BEGIN PRIVATE KEY-----
1 MG8CAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQMEVTBTAgEBBBjFP/caeQV4WO3fnWWS
2 f917PGzwtypd/t+hNAMyAATSg6pBT7RO6l/p+aKcrFsGuthUdfwJWS5V3NGcVt1b
3 lEHQYjWya2YnHaPq/iMFa7A=
4 -----END PRIVATE KEY-----
0 -----BEGIN ENCRYPTED PRIVATE KEY-----
1 MIGYMBwGCiqGSIb3DQEMAQMwDgQINApjTa6oFl0CAggABHi+59l4d4e6KtG9yci2
2 BSC65LEsQSnrnFAExfKptNU1zMFsDLCRvDeDQDbxc6HlfoxyqFL4SmH1g3RvC/Vv
3 NfckdL5O2L8MRnM+ljkFtV2Te4fszWcJFdd7KiNOkPpn+7sWLfzQdvhHChLKUzmz
4 4INKZyMv/G7VpZ0=
5 -----END ENCRYPTED PRIVATE KEY-----
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-----
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 MIIJKAIBAAKCAgEAo6FKkV/bSemFY/hO2NA/aMtkglLaC5jaqLzDnP21gfhYPBoB
2 EDaffV7x+qfv1wyGODJvdUPaNa8nVpwJxyrP/SzskqTlDW235Q7BbLTfGa6qsrj4
3 iKGamsEL2HsZNP9GcjXJAPX1gCmQyaJtTeQ7rQSueQ4KuNMh5KQAep5anVi2PCGm
4 9FeCyk7TQRsna3T0fANdCOeJA5BccfNjTmTSfYau0GGCQ7C+S3v3wfj6iJLD+aqN
5 pX2jyXvcbce5uPhSCUUEDi6xXn/ytLTtWb9FOXVTR5llockzeLZ8KBF+KWe2JBx3
6 pnARYl+Mbe9P86bxuXLiDzMCSAOT+9sOwOYnykqEy65EBsu8lv3s8sa5uNjYOYzU
7 G/o7IrkIXJ1PyCoqe8TtSts8Uj4XMA0USDxhsJAnzK6+TxuBFZ/TyQnlv8nUKTpu
8 MrCWsvAGcckKIT9Y0WrLrPqlBqLzhw+q44g64NJQ6SWOwn+hLT1P2dBhcn+VmOPe
9 dpUYmsCFy4tFTgHsRv7P5/niIsE4hTrZ5lEY0Yyyd05ZFcvwvSMOkwWibBfQ1vzD
10 eAXmDEgFaHVY6lici0HO7pW8poLjLjZ5IQ40NV0dElzcPX80/ZRPjQvhDsMcrDrv
11 svRK1epQPJhMcLZrv2vcx1J8rp11M/GVRYeplIT9E3O1/xf0Nl008c8wuI8CAwEA
12 AQKCAgBwIwwIPqn4qEma7kOSwHyEI8dYrNDzW6iWNO7VuuVWEczeO2/5HYYFlDi+
13 77IlLVcaUi4iLgLwAX4zE7J7xLJPLidehBTZNBTvrEIQbo/qeNJQswTYFe/vGFc2
14 332x3TP49zUuLGE3mMS5+k9wLvZapzeujFn6ue6jU2Vkovs0k+Qnp2RUVVizrnuG
15 RcapFLir+F4cyRgT0i4YhZTL17qM/ez1r61nGEwBTQ7I5wlC6VnW0vRJsqW5YeH5
16 dgOoaL1Hzv1tfsBdI9A/2TJD7BnTu7z793s3+bwFgQHrL7nHRGUFsGCrNmgjg5mo
17 iXXAY+uKjNmxUuLAWXtkAYbF2bTwC57/kaNDv7fjlHmzxwgyLq/SguNU3c72Y7rv
18 oz4jmoi9794NfcUoj8RTyBfvIB6rtRVX3sTOhz8P3d4Lh8xepitE5ysU4TdCMWvs
19 A0IX/r1yilmj+CPESM3ziSwUd31QHkBgDYFxRfkDp0ildTUfDYf6tLs7k55ejsCF
20 ddn8PvbzMvhRDLmStjdUBCfGDuOAhjmighuwkS26w/AQ9ndZ6iAAVgDEk1ZgMQhf
21 V1daWNN5ixh60QVZgXP/c5IpyikPKUMt2qmemmlJDuyuN5rAHnFPnpl/NGvlLaQt
22 FnFxXn24NsMus3qHSfL8TJkXEV8ZXiBXR7qsaMZ/m5xB/bz9kQKCAQEA02z7kwi4
23 /GshGZcSZ5IUk2OnxBnwmImpYocG3kELZAwoLGqYerVw8JFvGmPkGwlXbrHg34tm
24 OCmPxpcd6A8lBhuTmDO8OW+S1rWqLuYhfV/1PYOWj1YetnKAoRmEqa7PnPZPf2uk
25 eYq0gDzCOQ4tBwKBqpwa0rrGxahIGwCWh84yKgon/pZ6tjm4hr0GaZF+yK13Cy74
26 IiAOVXYoC3qsVvju5Qql6zk4NsX1pj8EkLmQc44T53RBowskBlX/e6/H42zSxbFn
27 rnZq+cEh9bTYcHZPhyMggzetx18dlZil5B1gKhvDpKo5XYiFGuc8S8/4IXxdsKNw
28 S2BiKNCB6OsrmQKCAQEAxiCxOfGXLGfNbdakQxDboSZWS7kyOIBBDwspj0Jobyif
29 o/S9D0hJmaU4QwT7c3zXCBzjicUmjKMgM9feeN7rDOWdBiRkdqOZAGC204Vf9jKm
30 XAf9gwbs0o/35Xy7t7QZlA+PJQxr56virlsPiENIGcMZhbrC9Pnvpv2dNh8BbBbD
31 Amif7NNbe6Ry9KvQ0wo5nRI3Bdl2ybFswpnpbTY69ytxHNzYtyqYByT27cYsY+fS
32 kRfa85e9TcxIC8BPTQToTnm72uh1UNbPy/hmz1/TkiILSQzxNXbxEQ21LUQmM+wa
33 BeQpvrK+uu7F/naFV0nX9QdfrQaHvACtiqNvTRBeZwKCAQAr5m02UpFWmEf/MEc6
34 CjMLh53GMjyq76qkMrVSYN8knwGYd2nB0PrqeMhBCozKsF3fNkAjKqbG8ppP+gDT
35 tpFRe1hiOhvTMT+kJYR4yIAbsFkTtMcGbDNkXtImoU3SjeG+DcbkBk3Yjtx75CHQ
36 BwmCcxrJejB3oSC02gRe1vhqqn3wDLvROR2xyLpv/7/dG8DfmmUlhVMwgsd3J1mZ
37 SJeQV5ADLvrUpMTvWptvMZaZFm7QD6hCXvliCWYpiqHJ5O30YxxAwF1u9FeyFFAg
38 3LQ0ZdyNitWtaVpEE5PpBBEuFItrMuikwFO5ACfjNjBm7X/wNAqgKs+eVx0KrIDN
39 BEfBAoIBADsszIIX7CTxI+QodYsqX86z2pZnS96gP840cUc+eF6q7XNUx5rm5kSj
40 mjg6JrgJk1fy+OrPHYJnvlh9ow7K1b1WXx3UhMUCe9InELQAY/bujc1y/X7C9Ly3
41 Dz1VkeN+QR19wC06loftSJj2zZ7PKZu4L8lHTK9Kbw+bM/dUL2KPMdNoWEutnOdC
42 6Kq3HnnJ1gdZx2FR4C7BdVByE8vwpI/qQ7BxLbEXYazQl4fQ5rU4KiX30AdtTLcN
43 yn7oA0dnrdKyfS8WuuNYJVwwZtSNNG2zCVfaK7jiO4HybCiG8DoVzHfx+53fWSQP
44 6Mbls1Gs1nlyqFrPVn8KXMrJoZaMywUCggEBAMJ+udqN5hEiDHE5wMgrI9Dwdn9I
45 zHFfN9/gn/ffRvsIN9MvYxcK0UhPPQ/PH+GXgPYJDEYrRC9+HJmkIs+x/xzWysft
46 0+PyFmlA5BEg8tXsPqBpDlKLpd8PWomwfN497ZLdv3geEHzcdZOc+7isX60Q9h0R
47 J0FH9pCwAXTuhihdbRKnRoFIVySSxYbK644k6TW53LO/jxG6rpRHIzj2n2TMs9kR
48 wp5A3ON2DM7n9gS7fI8k4+X9YGlTBfsO0VJ2Y4ZSFZbV3cAK6RIU8cpAs/2dwyet
49 1TjK3J88LTcwrvu4Q5vBRjjyg4t/wRzq+qSCfC1BKvwYo/LTdXL4v0T5oXA=
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;
00 ###########################
11 TYPEMAP
22
3 Crypt::Cipher T_PTROBJ
4 Crypt::Digest T_PTROBJ
3 Crypt::Cipher T_PTROBJ
4 Crypt::Digest T_PTROBJ
55
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
1010
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
1717
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
2626
27 Crypt::PRNG T_PTROBJ
27 Crypt::PRNG T_PTROBJ
2828
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
3333
3434 #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
3638
3739 #perl 5.6.2 hack
3840 STRLEN T_UV
4143 INPUT
4244
4345 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;
4550
4651 ###########################
4752 OUTPUT
4853
4954 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);