v0.022
Karel Miko
8 years ago
6 | 6 | my $flags = '-Isrc/ltc/headers -Isrc/ltm -DLTC_SOURCE -DLTC_NO_TEST -DLTC_NO_PROTOTYPES -DLTM_DESC'; |
7 | 7 | #$flags .= ' -Wall'; |
8 | 8 | #$flags .= ' -DLTC_NO_ASM' if $ENV{CRYPTX_NO_ASM} || $Config{archname} !~ /(MSWin32-(x86|x64)|(i.86|x86_64)-linux|(i.86|amd64)-(freebsd|openbsd)|cygwin|darwin)/; |
9 | #$flags .= ' -DLTC_NO_ASM' if $^O eq 'cygwin' && $Config{cc} =~ /gcc/ && $Config{gccversion} =~ /^3\./; | |
9 | 10 | |
10 | 11 | my $class = Module::Build->subclass( |
11 | 12 | class => 'My::Builder', |
0 | 0 | Changes for CryptX |
1 | 1 | |
2 | 2 | TODO: |
3 | - [MUST] update documentation: ECC+RSA+DSA | |
4 | 3 | - add support for PKCS#8 encrypted RSA+ECC private keys "-----BEGIN ENCRYPTED PRIVATE KEY-----" |
5 | - disable LTC_FAST for gcc 3 | |
4 | - gcc v3 is now unsupported | |
6 | 5 | - add CCM interface for new-add-add-done mode |
7 | 6 | - switch yarrow > fortuna for Crypt::PK::* |
8 | 7 | - RSA|DSA|ECC: verify_key($level) (basic check + extented primality test) |
12 | 11 | - DH: key2hash should dump $base and $prime as well (perhasp add base, prime to dh_key struct) |
13 | 12 | - XS croaks should report the "real caller" (Crypt::Mac::*, Crypt::Mode::*, ...) |
14 | 13 | |
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) | |
21 | - new: SHA512_224 + SHA512_256 | |
14 | 0.022 2015/05/22 | |
15 | - new: Crypt::PK::ECC+RSA export_key_jwk() - exporting JWK format | |
16 | - new: Crypt::Digest::SHA512_224 | |
17 | - new: Crypt::Digest::SHA512_256 | |
18 | - Crypt::PK::ECC+RSA import_key() - support for: | |
19 | * public/private keys in JWK format | |
20 | * private keys in PKCS8 PEM/DER format (unencrypted only) | |
21 | - Crypt::PK::ECC+RSA+DSA import_key() - support for: | |
22 | * public keys in SSH format | |
23 | * public/private keys as a hashref exported via key2hash | |
22 | 24 | - libtomcrypt updated to the latest develop branch, commit aeaa6d4a51 Apr 17 08:59:35 2015 +0200 |
23 | 25 | - libtommath updated to the latest develop branch, commit 0fd5e6c17f Dec 11 14:59:35 2014 +0100 |
24 | 26 | - documentation fixes |
63 | 63 | under the same terms as Perl itself. |
64 | 64 | |
65 | 65 | COPYRIGHT |
66 | Copyright (c) 2013 DCIT, a.s. <http://www.dcit.cz> / Karel Miko | |
66 | Copyright (c) 2013-2015 DCIT, a.s. <http://www.dcit.cz> / Karel Miko | |
67 | 67 |
263 | 263 | $pk->import_key($pem_filename, $password); |
264 | 264 | #or |
265 | 265 | $pk->import_key(\$buffer_containing_pem_key, $password); |
266 | ||
267 | Loading private or public keys form perl hash: | |
268 | ||
269 | $pk->import_key($hashref); | |
270 | ||
271 | # where $hashref is a key exported via key2hash | |
272 | $pk->import_key({ | |
273 | p => "AAF839A764E04D80824B79FA1F0496C093...", #prime modulus | |
274 | q => "D05C4CB45F29D353442F1FEC43A6BE2BE8...", #prime divisor | |
275 | g => "847E8896D12C9BF18FE283AE7AD58ED7F3...", #generator of a subgroup of order q in GF(p) | |
276 | x => "6C801901AC74E2DC714D75A9F6969483CF...", #private key, random 0 < x < q | |
277 | y => "8F7604D77FA62C7539562458A63C7611B7...", #public key, where y = g^x mod p | |
278 | }); | |
279 | ||
280 | Supported key formats: | |
281 | ||
282 | =over | |
283 | ||
284 | =item * DSA public keys | |
285 | ||
286 | -----BEGIN PUBLIC KEY----- | |
287 | MIIBtjCCASsGByqGSM44BAEwggEeAoGBAJKyu+puNMGLpGIhbD1IatnwlI79ePr4 | |
288 | YHe2KBhRkheKxWUZRpN1Vd/+usS2IHSJ9op5cSWETiP05d7PMtJaitklw7jhudq3 | |
289 | GxNvV/GRdCQm3H6d76FHP88dms4vcDYc6ry6wKERGfNEtZ+4BAKrMZK+gDYsF4Aw | |
290 | U6WVR969kYZhAhUA6w25FgSRmJ8W4XkvC60n8Wv3DpMCgYA4ZFE+3tLOM24PZj9Z | |
291 | rxuqUzZZdR+kIzrsIYpWN9ustbmdKLKwsqIaUIxc5zxHEhbAjAIf8toPD+VEQIpY | |
292 | 7vgJgDhXuPq45BgN19iLTzOJwIhAFXPZvnAdIo9D/AnMw688gT6g6U8QCZwX2XYg | |
293 | ICiVcriYVNcjVKHSFY/X0Oi7CgOBhAACgYB4ZTn4OYT/pjUd6tNhGPtOS3CE1oaj | |
294 | 5ScbetXg4ZDpceEyQi8VG+/ZTbs8var8X77JdEdeQA686cAxpOaVgW8V4odvcmfA | |
295 | BfueiGnPXjqGfppiHAyL1Ngyd+EsXKmKVXZYAVFVI0WuJKiZBSVURU7+ByxOfpGa | |
296 | fZhibr0SggWixQ== | |
297 | -----END PUBLIC KEY----- | |
298 | ||
299 | =item * DSA private keys | |
300 | ||
301 | -----BEGIN DSA PRIVATE KEY----- | |
302 | MIIBuwIBAAKBgQCSsrvqbjTBi6RiIWw9SGrZ8JSO/Xj6+GB3tigYUZIXisVlGUaT | |
303 | dVXf/rrEtiB0ifaKeXElhE4j9OXezzLSWorZJcO44bnatxsTb1fxkXQkJtx+ne+h | |
304 | Rz/PHZrOL3A2HOq8usChERnzRLWfuAQCqzGSvoA2LBeAMFOllUfevZGGYQIVAOsN | |
305 | uRYEkZifFuF5LwutJ/Fr9w6TAoGAOGRRPt7SzjNuD2Y/Wa8bqlM2WXUfpCM67CGK | |
306 | VjfbrLW5nSiysLKiGlCMXOc8RxIWwIwCH/LaDw/lRECKWO74CYA4V7j6uOQYDdfY | |
307 | i08zicCIQBVz2b5wHSKPQ/wJzMOvPIE+oOlPEAmcF9l2ICAolXK4mFTXI1Sh0hWP | |
308 | 19DouwoCgYB4ZTn4OYT/pjUd6tNhGPtOS3CE1oaj5ScbetXg4ZDpceEyQi8VG+/Z | |
309 | Tbs8var8X77JdEdeQA686cAxpOaVgW8V4odvcmfABfueiGnPXjqGfppiHAyL1Ngy | |
310 | d+EsXKmKVXZYAVFVI0WuJKiZBSVURU7+ByxOfpGafZhibr0SggWixQIVAL7Sia03 | |
311 | 8bvANjjL9Sitk8slrM6P | |
312 | -----END DSA PRIVATE KEY----- | |
313 | ||
314 | =item * DSA private keys in password protected PEM format: | |
315 | ||
316 | -----BEGIN DSA PRIVATE KEY----- | |
317 | Proc-Type: 4,ENCRYPTED | |
318 | DEK-Info: DES-CBC,227ADC3AA0299491 | |
319 | ||
320 | UISxBYAxPQMl2eK9LMAeHsssF6IxO+4G2ta2Jn8VE+boJrrH3iSTKeMXGjGaXl0z | |
321 | DwcLGV+KMR70y+cxtTb34rFy+uSpBy10dOQJhxALDbe1XfCDQIUfaXRfMNA3um2I | |
322 | JdZixUD/zcxBOUzao+MCr0V9XlJDgqBhJ5EEr53XHH07Eo5fhiBfbbR9NzdUPFrQ | |
323 | p2ASyZtFh7RXoIBUCQgg21oeLddcNWV7gd/Y46kghO9s0JbJ8C+IsuWEPRSq502h | |
324 | tSoDN6B0sxbVvOUICLLbQaxt7yduTAhRxVIJZ1PWATTVD7CZBVz9uIDZ7LOv+er2 | |
325 | 1q3vkwb8E9spPsA240+BnfD571XEop4jrawxC0VKQZ+3cPVLc6jhIsxvzzFQUt67 | |
326 | g66v8GUgt7KF3KhVV7qEtntybQWDWb+K/uTIH9Ra8nP820d3Rnl61pPXDPlluteT | |
327 | WSLOvEMN2zRmkaxQNv/tLdT0SYpQtdjw74G3A6T7+KnvinKrjtp1a/AXkCF9hNEx | |
328 | DGbxOYo1UOmk8qdxWCrab34nO+Q8oQc9wjXHG+ZtRYIMoGMKREK8DeL4H1RPNkMf | |
329 | rwXWk8scd8QFmJAb8De1VQ== | |
330 | -----END DSA PRIVATE KEY----- | |
331 | ||
332 | =item * SSH public DSA keys | |
333 | ||
334 | ssh-dss AAAAB3NzaC1kc3MAAACBAKU8/avmk...4XOwuEssAVhmwA== | |
335 | ||
336 | =item * SSH public DSA keys (RFC-4716 format) | |
337 | ||
338 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
339 | Comment: "1024-bit DSA, converted from OpenSSH" | |
340 | AAAAB3NzaC1kc3MAAACBAKU8/avmkFeGnSqwYG7dZnQlG+01QNaxu3F5v0NcL/SRUW7Idp | |
341 | Uq8t14siK0mA6yjphLhOf5t8gugTEVBllP86ANSbFigH7WN3v6ydJWqm60pNhNHN//50cn | |
342 | NtIsXbxeq3VtsI64pkH1OJqeZDHLmu73k4T0EKOzsylSfF/wtVBJAAAAFQChpubLHViwPB | |
343 | +jSvUb8e4THS7PBQAAAIAJD1PMCiTCQa1xyD/NCWOajCufTOIzKAhm6l+nlBVPiKI+262X | |
344 | pYt127Ke4mPL8XJBizoTjSQN08uHMg/8L6W/cdO2aZ+mhkBnS1xAm83DAwqLrDraR1w/4Q | |
345 | RFxr5Vbyy8qnejrPjTJobBN1BGsv84wHkjmoCn6pFIfkGYeATlJgAAAIAHYPU1zMVBTDWr | |
346 | u7SNC4G2UyWGWYYLjLytBVHfQmBa51CmqrSs2kCfGLGA1ynfYENsxcJq9nsXrb4i17H5BH | |
347 | JFkH0g7BUDpeBeLr8gsK3WgfqWwtZsDkltObw9chUD/siK6q/dk/fSIB2Ho0inev7k68Z5 | |
348 | ZkNI4XOwuEssAVhmwA== | |
349 | ---- END SSH2 PUBLIC KEY ---- | |
350 | ||
351 | =back | |
266 | 352 | |
267 | 353 | =head2 export_key_der |
268 | 354 |
534 | 534 | } |
535 | 535 | elsif ($data =~ /---- BEGIN SSH2 PUBLIC KEY ----(.*?)---- END SSH2 PUBLIC KEY ----/sg) { |
536 | 536 | $data = Crypt::PK::_pem_to_binary($data); |
537 | my ($typ, $xxx, $pubkey) = Crypt::PK::_ssh_parse($data); | |
537 | my ($typ, $skip, $pubkey) = Crypt::PK::_ssh_parse($data); | |
538 | 538 | return $self->import_key_raw($pubkey, "$2") if $pubkey && $typ =~ /^ecdsa-(.+?)-(.*)$/; |
539 | 539 | } |
540 | 540 | elsif ($data =~ /(ecdsa-\S+)\s+(\S+)/) { |
541 | 541 | $data = decode_base64($2); |
542 | my ($typ, $xxx, $pubkey) = Crypt::PK::_ssh_parse($data); | |
542 | my ($typ, $skip, $pubkey) = Crypt::PK::_ssh_parse($data); | |
543 | 543 | return $self->import_key_raw($pubkey, "$2") if $pubkey && $typ =~ /^ecdsa-(.+?)-(.*)$/; |
544 | 544 | } |
545 | 545 | else { |
706 | 706 | |
707 | 707 | =head2 new |
708 | 708 | |
709 | my $pk = Crypt::PK::ECC->new(); | |
710 | #or | |
711 | my $pk = Crypt::PK::ECC->new($priv_or_pub_key_filename); | |
712 | #or | |
713 | my $pk = Crypt::PK::ECC->new(\$buffer_containing_priv_or_pub_key); | |
709 | my $pk = Crypt::PK::ECC->new(); | |
710 | #or | |
711 | my $pk = Crypt::PK::ECC->new($priv_or_pub_key_filename); | |
712 | #or | |
713 | my $pk = Crypt::PK::ECC->new(\$buffer_containing_priv_or_pub_key); | |
714 | 714 | |
715 | 715 | Support for password protected PEM keys |
716 | 716 | |
717 | my $pk = Crypt::PK::ECC->new($priv_pem_key_filename, $password); | |
718 | #or | |
719 | my $pk = Crypt::PK::ECC->new(\$buffer_containing_priv_pem_key, $password); | |
717 | my $pk = Crypt::PK::ECC->new($priv_pem_key_filename, $password); | |
718 | #or | |
719 | my $pk = Crypt::PK::ECC->new(\$buffer_containing_priv_pem_key, $password); | |
720 | 720 | |
721 | 721 | =head2 generate_key |
722 | 722 | |
784 | 784 | |
785 | 785 | Loads private or public key in DER or PEM format. |
786 | 786 | |
787 | $pk->import_key($filename); | |
788 | #or | |
789 | $pk->import_key(\$buffer_containing_key); | |
790 | ||
791 | Support for password protected PEM keys | |
792 | ||
793 | $pk->import_key($pem_filename, $password); | |
794 | #or | |
795 | $pk->import_key(\$buffer_containing_pem_key, $password); | |
787 | $pk->import_key($filename); | |
788 | #or | |
789 | $pk->import_key(\$buffer_containing_key); | |
790 | ||
791 | Support for password protected PEM keys: | |
792 | ||
793 | $pk->import_key($filename, $password); | |
794 | #or | |
795 | $pk->import_key(\$buffer_containing_key, $password); | |
796 | ||
797 | Loading private or public keys form perl hash: | |
798 | ||
799 | $pk->import_key($hashref); | |
800 | ||
801 | # the $hashref is either a key exported via key2hash | |
802 | $pk->import_key({ | |
803 | curve_A => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", | |
804 | curve_B => "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", | |
805 | curve_bits => 160, | |
806 | curve_bytes => 20, | |
807 | curve_cofactor => 1, | |
808 | curve_Gx => "4A96B5688EF573284664698968C38BB913CBFC82", | |
809 | curve_Gy => "23A628553168947D59DCC912042351377AC5FB32", | |
810 | curve_order => "0100000000000000000001F4C8F927AED3CA752257", | |
811 | curve_prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", | |
812 | k => "B0EE84A749FE95DF997E33B8F333E12101E824C3", | |
813 | pub_x => "5AE1ACE3ED0AEA9707CE5C0BCE014F6A2F15023A", | |
814 | pub_y => "895D57E992D0A15F88D6680B27B701F615FCDC0F", | |
815 | }); | |
816 | ||
817 | # or with the curve defined just by name | |
818 | $pk->import_key({ | |
819 | curve_name => "secp160r1", | |
820 | k => "B0EE84A749FE95DF997E33B8F333E12101E824C3", | |
821 | pub_x => "5AE1ACE3ED0AEA9707CE5C0BCE014F6A2F15023A", | |
822 | pub_y => "895D57E992D0A15F88D6680B27B701F615FCDC0F", | |
823 | }); | |
824 | ||
825 | # or a hash with items corresponding to JWK (JSON Web Key) | |
826 | $pk->import_key({ | |
827 | kty => "EC", | |
828 | crv => "P-256", | |
829 | x => "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4", | |
830 | y => "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM", | |
831 | d => "870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE", | |
832 | }); | |
833 | ||
834 | Supported key formats: | |
835 | ||
836 | =over | |
837 | ||
838 | =item * EC private keys with with all curve parameters | |
839 | ||
840 | -----BEGIN EC PRIVATE KEY----- | |
841 | MIIB+gIBAQQwCKEAcA6cIt6CGfyLKm57LyXWv2PgTjydrHSbvhDJTOl+7bzUW8DS | |
842 | rgSdtSPONPq1oIIBWzCCAVcCAQEwPAYHKoZIzj0BAQIxAP////////////////// | |
843 | ///////////////////////+/////wAAAAAAAAAA/////zB7BDD///////////// | |
844 | /////////////////////////////v////8AAAAAAAAAAP////wEMLMxL6fiPufk | |
845 | mI4Fa+P4LRkYHZxu/oFBEgMUCI9QE4daxlY5jYou0Z0qhcjt0+wq7wMVAKM1kmqj | |
846 | GaJ6HQCJamdzpIJ6zaxzBGEEqofKIr6LBTeOscce8yCtdG4dO2KLp5uYWfdB4IJU | |
847 | KjhVAvJdv1UpbDpUXjhydgq3NhfeSpYmLG9dnpi/kpLcKfj0Hb0omhR86doxE7Xw | |
848 | uMAKYLHOHX6BnXpDHXyQ6g5fAjEA////////////////////////////////x2NN | |
849 | gfQ3Ld9YGg2ySLCneuzsGWrMxSlzAgEBoWQDYgAEeGyHPLmHcszPQ9MIIYnznpzi | |
850 | QbvuJtYSjCqtIGxDfzgcLcc3nCc5tBxo+qX6OJEzcWdDAC0bwplY+9Z9jHR3ylNy | |
851 | ovlHoK4ItdWkVO8NH89SLSRyVuOF8N5t3CHIo93B | |
852 | -----END EC PRIVATE KEY----- | |
853 | ||
854 | =item * EC private keys with curve defined by OID (short form) | |
855 | ||
856 | -----BEGIN EC PRIVATE KEY----- | |
857 | MHcCAQEEIBG1c3z52T8XwMsahGVdOZWgKCQJfv+l7djuJjgetdbDoAoGCCqGSM49 | |
858 | AwEHoUQDQgAEoBUyo8CQAFPeYPvv78ylh5MwFZjTCLQeb042TjiMJxG+9DLFmRSM | |
859 | lBQ9T/RsLLc+PmpB1+7yPAR+oR5gZn3kJQ== | |
860 | -----END EC PRIVATE KEY----- | |
861 | ||
862 | =item * EC private keys in password protected PEM format | |
863 | ||
864 | -----BEGIN EC PRIVATE KEY----- | |
865 | Proc-Type: 4,ENCRYPTED | |
866 | DEK-Info: AES-128-CBC,98245C830C9282F7937E13D1D5BA11EC | |
867 | ||
868 | 0Y85oZ2+BKXYwrkBjsZdj6gnhOAfS5yDVmEsxFCDug+R3+Kw3QvyIfO4MVo9iWoA | |
869 | D7wtoRfbt2OlBaLVl553+6QrUoa2DyKf8kLHQs1x1/J7tJOMM4SCXjlrOaToQ0dT | |
870 | o7fOnjQjHne16pjgBVqGilY/I79Ab85AnE4uw7vgEucBEiU0d3nrhwuS2Opnhzyx | |
871 | 009q9VLDPwY2+q7tXjTqnk9mCmQgsiaDJqY09wlauSukYPgVuOJFmi1VdkRSDKYZ | |
872 | rUUsQvz6Q6Q+QirSlfHna+NhUgQ2eyhGszwcP6NU8iqIxI+NCwfFVuAzw539yYwS | |
873 | 8SICczoC/YRlaclayXuomQ== | |
874 | -----END EC PRIVATE KEY----- | |
875 | ||
876 | =item * EC public keys with all curve parameters | |
877 | ||
878 | -----BEGIN PUBLIC KEY----- | |
879 | MIH1MIGuBgcqhkjOPQIBMIGiAgEBMCwGByqGSM49AQECIQD///////////////// | |
880 | ///////////////////+///8LzAGBAEABAEHBEEEeb5mfvncu6xVoGKVzocLBwKb | |
881 | /NstzijZWfKBWxb4F5hIOtp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuAIh | |
882 | AP////////////////////66rtzmr0igO7/SXozQNkFBAgEBA0IABITjF/nKK3jg | |
883 | pjmBRXKWAv7ekR1Ko/Nb5FFPHXjH0sDrpS7qRxFALwJHv7ylGnekgfKU3vzcewNs | |
884 | lvjpBYt0Yg4= | |
885 | -----END PUBLIC KEY----- | |
886 | ||
887 | =item * EC public keys with curve defined by OID (short form) | |
888 | ||
889 | -----BEGIN PUBLIC KEY----- | |
890 | MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoBUyo8CQAFPeYPvv78ylh5MwFZjT | |
891 | CLQeb042TjiMJxG+9DLFmRSMlBQ9T/RsLLc+PmpB1+7yPAR+oR5gZn3kJQ== | |
892 | -----END PUBLIC KEY----- | |
893 | ||
894 | =item * PKCS#8 private keys with all curve parameters | |
895 | ||
896 | -----BEGIN PRIVATE KEY----- | |
897 | MIIBMAIBADCB0wYHKoZIzj0CATCBxwIBATAkBgcqhkjOPQEBAhkA//////////// | |
898 | /////////v//////////MEsEGP////////////////////7//////////AQYIhI9 | |
899 | wjlaBcqnQj2uzMlHYKfUYiVr1WkWAxUAxGloRDXes3jEtlypWR4qV2MFmi4EMQR9 | |
900 | KXeBAMZaHaF4NxZYjc4ri0rujiKPGJY4qQ8iY3M3M0tJ3LZqbcj5l4rKdkipQ7AC | |
901 | GQD///////////////96YtAxyD9ClPZA7BMCAQEEVTBTAgEBBBiKolTGIsTgOCtl | |
902 | 6dpdos0LvuaExCDFyT6hNAMyAAREwaCX0VY1LZxLW3G75tmft4p9uhc0J7/+NGaP | |
903 | DN3Tr7SXkT9+co2a+8KPJhQy10k= | |
904 | -----END PRIVATE KEY----- | |
905 | ||
906 | =item * PKCS#8 private keys with curve defined by OID (short form) | |
907 | ||
908 | -----BEGIN PRIVATE KEY----- | |
909 | MG8CAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQMEVTBTAgEBBBjFP/caeQV4WO3fnWWS | |
910 | f917PGzwtypd/t+hNAMyAATSg6pBT7RO6l/p+aKcrFsGuthUdfwJWS5V3NGcVt1b | |
911 | lEHQYjWya2YnHaPq/iMFa7A= | |
912 | -----END PRIVATE KEY----- | |
913 | ||
914 | =item * PKCS#8 encrypted private keys ARE NOT SUPPORTED YET! | |
915 | ||
916 | -----BEGIN ENCRYPTED PRIVATE KEY----- | |
917 | MIGYMBwGCiqGSIb3DQEMAQMwDgQINApjTa6oFl0CAggABHi+59l4d4e6KtG9yci2 | |
918 | BSC65LEsQSnrnFAExfKptNU1zMFsDLCRvDeDQDbxc6HlfoxyqFL4SmH1g3RvC/Vv | |
919 | NfckdL5O2L8MRnM+ljkFtV2Te4fszWcJFdd7KiNOkPpn+7sWLfzQdvhHChLKUzmz | |
920 | 4INKZyMv/G7VpZ0= | |
921 | -----END ENCRYPTED PRIVATE KEY----- | |
922 | ||
923 | =item * SSH public EC keys | |
924 | ||
925 | ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNT...T3xYfJIs= | |
926 | ||
927 | =item * SSH public EC keys (RFC-4716 format) | |
928 | ||
929 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
930 | Comment: "521-bit ECDSA, converted from OpenSSH" | |
931 | AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAFk35srteP9twCwYK | |
932 | vU9ovMBi77Dd6lEBPrFaMEb0CZdZ5MC3nSqflGHRWkSbUpjdPdO7cYQNpK9YXHbNSO5hbU | |
933 | 1gFZgyiGFxwJYYz8NAjedBXMgyH4JWplK5FQm5P5cvaglItC9qkKioUXhCc67YMYBtivXl | |
934 | Ue0PgIq6kbHTqbX6+5Nw== | |
935 | ---- END SSH2 PUBLIC KEY ---- | |
936 | ||
937 | =item * EC private keys in JSON Web Key (JWK) format | |
938 | ||
939 | See L<http://tools.ietf.org/html/draft-ietf-jose-json-web-key> | |
940 | ||
941 | { | |
942 | "kty":"EC", | |
943 | "crv":"P-256", | |
944 | "x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4", | |
945 | "y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM", | |
946 | "d":"870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE", | |
947 | } | |
948 | ||
949 | =item * EC public keys in JSON Web Key (JWK) format | |
950 | ||
951 | { | |
952 | "kty":"EC", | |
953 | "crv":"P-256", | |
954 | "x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4", | |
955 | "y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM", | |
956 | } | |
957 | ||
958 | =back | |
796 | 959 | |
797 | 960 | =head2 import_key_raw |
798 | 961 | |
829 | 992 | # 'AES-128-CBC' |
830 | 993 | # 'AES-192-CBC' |
831 | 994 | # 'AES-256-CBC' (DEFAULT) |
995 | ||
996 | =head2 export_key_jwk | |
997 | ||
998 | Exports public/private keys as a JSON Web Key. | |
999 | ||
1000 | my $private_json_text = $pk->export_key_jwk('private'); | |
1001 | #or | |
1002 | my $public_json_text = $pk->export_key_jwk('public'); | |
832 | 1003 | |
833 | 1004 | =head2 export_key_raw |
834 | 1005 |
334 | 334 | #or |
335 | 335 | $pk->import_key(\$buffer_containing_pem_key, $password); |
336 | 336 | |
337 | Loading private or public keys form perl hash: | |
338 | ||
339 | $pk->import_key($hashref); | |
340 | ||
341 | # the $hashref is either a key exported via key2hash | |
342 | $pk->import_key({ | |
343 | e => "10001", #public exponent | |
344 | d => "9ED5C3D3F866E06957CA0E9478A273C39BBDA4EEAC5B...", #private exponent | |
345 | N => "D0A5CCCAE03DF9C2F5C4C8C0CE840D62CDE279990DC6...", #modulus | |
346 | p => "D3EF0028FFAB508E2773C659E428A80FB0E9211346B4...", #p factor of N | |
347 | q => "FC07E46B163CAB6A83B8E467D169534B2077DCDEECAE...", #q factor of N | |
348 | qP => "88C6D406F833DF73C8B734548E0385261AD51F4187CF...", #1/q mod p CRT param | |
349 | dP => "486F142FEF0A1F53269AC43D2EE4D263E2841B60DA36...", #d mod (p - 1) CRT param | |
350 | dQ => "4597284B2968B72C4212DB7E8F24360B987B80514DA9...", #d mod (q - 1) CRT param | |
351 | }); | |
352 | ||
353 | # or a hash with items corresponding to JWK (JSON Web Key) | |
354 | $pk->import_key({ | |
355 | { | |
356 | kty => "RSA", | |
357 | n => "0vx7agoebGcQSuuPiLJXZpt...eZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw", | |
358 | e => "AQAB", | |
359 | d => "X4cTteJY_gn4FYPsXB8rdXi...FLN5EEaG6RoVH-HLKD9Mdx5ooGURknhnrRwUkC7h5fJLMWbFAKLWY2v7B6NqSzUvx0_YSf", | |
360 | p => "83i-7IvMGXoMXCskv73TKr8...Z27zvoj6pbUQyLPBQxtPnwD20-60eTmD2ujMt5PoMrm8RmNhVWtjjMmMjOpSicFHjXOuVI", | |
361 | q => "3dfOR9cuYq-0S-mkFLzgItg...q3hWeMuG0ouqnb3obLyuqjVZQ1dIrdgTnCdYzBcOW5r37AFXjift_NGiovonzhKpoVVS78", | |
362 | dp => "G4sPXkc6Ya9y8oJW9_ILj4...zi_H7TkS8x5SdX3oE0oiYwxIiemTAu0UOa5pgFGyJ4c8t2VF40XRugKTP8akhFo5tA77Qe", | |
363 | dq => "s9lAH9fggBsoFR8Oac2R_E...T2kGOhvIllTE1efA6huUvMfBcpn8lqW6vzzYY5SSF7pMd_agI3G8IbpBUb0JiraRNUfLhc", | |
364 | qi => "GyM_p6JrXySiz1toFgKbWV...4ypu9bMWx3QJBfm0FoYzUIZEVEcOqwmRN81oDAaaBk0KWGDjJHDdDmFW3AN7I-pux_mHZG", | |
365 | }); | |
366 | ||
367 | Supported key formats: | |
368 | ||
369 | =over | |
370 | ||
371 | =item * RSA public keys | |
372 | ||
373 | -----BEGIN PUBLIC KEY----- | |
374 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHlYKg9DeHB3/dY1D9WCyJTnl5 | |
375 | vEzAXpUOL9tDtdPUl96brIbbdMLooO1hKjsq98kLs1q4vOn/pxvzk0BRwhiu7Vvb | |
376 | VUjAn/2HHDDL0U1utqqlMJhaffeLI3HEq5o/lSMFY7sSkZU/E4YX1yqAN0SE7xfK | |
377 | B2uzcNq60sMIfp6siQIDAQAB | |
378 | -----END PUBLIC KEY----- | |
379 | ||
380 | =item * RSA private keys | |
381 | ||
382 | -----BEGIN RSA PRIVATE KEY----- | |
383 | MIICXQIBAAKBgQDHlYKg9DeHB3/dY1D9WCyJTnl5vEzAXpUOL9tDtdPUl96brIbb | |
384 | dMLooO1hKjsq98kLs1q4vOn/pxvzk0BRwhiu7VvbVUjAn/2HHDDL0U1utqqlMJha | |
385 | ffeLI3HEq5o/lSMFY7sSkZU/E4YX1yqAN0SE7xfKB2uzcNq60sMIfp6siQIDAQAB | |
386 | AoGBAI5+GgNcGQDYw9uF+t7FwxZM5sGZRJrbbEPyuvL+sDxKKW6voKCyHi4EJzaF | |
387 | 9jRZMDqgVJcsmUwjPPuMGBHHJ+MI5Zb3L0jbZkyx8u+U5gf88oy9eZmfGOjmHcMB | |
388 | oCgzyoLmJETuyADg2onLanuY3jggFb3tq/jimKjO8xM2R6zhAkEA7uXWWyJI9cCN | |
389 | zrVt5R5v6oosjZ4r5VILGMqBRLrzfTvH+WDMK6Rl/2MHE+YDeLajzunaM8qY2456 | |
390 | GTYEXQsIdQJBANXfMEtXocSdPtoVj3ME8Do/0r+ApgTdcDPCwXOzkmkEJW/UFMSn | |
391 | b8CYF5G6sZQN9L5z3s2nvi55PaFV8Q0LMUUCQBh9GvIQm6YFbQPpeTBpZFOIgnSp | |
392 | 6BoDxPtvlryy5U7LF/6qO4OlwIbjYdBaXbS8FCKbujBg7jZjboSzEtNu1BkCQDGT | |
393 | w0Yz0jQZn3A+fzpScr2N/fSWheWqz0+wXdfMUKw3YdZCe236wlUK7KvDc1a2xX1A | |
394 | ru1NbTCoujikC3TSm2ECQQDKQshchJlZJmFv9vCFQlGCA/EX+4406xvOOiixbPYC | |
395 | pIB4Ee2cmvEdAqSaOjrvgs5zvaCCFBO0MecPStCAxUX6 | |
396 | -----END RSA PRIVATE KEY----- | |
397 | ||
398 | =item * RSA private keys in password protected PEM format | |
399 | ||
400 | -----BEGIN RSA PRIVATE KEY----- | |
401 | Proc-Type: 4,ENCRYPTED | |
402 | DEK-Info: DES-EDE3-CBC,4D697440FF5AEF18 | |
403 | ||
404 | C09H49Gn99o8b8O2r4+Hqao4r3udvC+QSSfsk20sXatyuZSEmbhyqKAB+13NRj+3 | |
405 | KIsRTqnL9VkeibIGgLHuekOFKAqeSVZ0PmR4bGWEFxUPAYUvg9N9pIa6hGtNZG+y | |
406 | TEpOAfFITb1pbHQhp3j8y7qmKc5kY5LrZSFE8WwA24NTG773E07wJgRxKDkXNGOl | |
407 | kki6oYArNEps0DdtHFxzgdRg0+yaotXuFJRuC5V4YzKGG/oSRcgYyXKTwCndb3xt | |
408 | aHgI2WprQAPg+qOpLABzoi7bEjCqbHWrwkvnAngylbim2Uyvw1e1xKnzlgIHU7pv | |
409 | e/J+s00pTItfqW1IpY2mh4C9nkfkfVKBKaAv7jO0s6aPySATqsdlrzv2kpF6Ub4J | |
410 | kgaZDOfZ4K3qkyAYVLWcQeDqg4glv9Ah2J05bTm4qrIMmthYnThyQlGvcjUfCMXs | |
411 | 0t+mEQbsRY7xKt0o6HzzvQlJ+JsFlLORoslAubJX9iLqpEdnlrj1lD9bo6uIClZ5 | |
412 | 5+aoLcAyz1D4OsauuP5i8VFu+Is+QG4SN/vHVuArjkqi3VpLwSAjNDY+KWbq042l | |
413 | CqlM2mwm6FIGUZQFxiLHJD7WDmk1xmae++m+XG9CEDTfrUQ5v+l0O6BTrl80XUfU | |
414 | w3gzAWbSjz3UK0FpKeABVFPE9fjNP9fTcS6qL5YJWBPflwxCAbVgsBOW4bOMpDGK | |
415 | BJDQTeShWn4BlYCe/vgThI9ERdgZhRz4NcFeDgVA/CqQzVqptvz4PSqH46fqUN2n | |
416 | 4PtJgKE5cASYUBuAjlD71FecSVVM/OTzL1uxYzXBilzvVn2vSHgo9g== | |
417 | -----END RSA PRIVATE KEY----- | |
418 | ||
419 | =item * PKCS#8 encoded private keys | |
420 | ||
421 | -----BEGIN PRIVATE KEY----- | |
422 | MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANPN17xW4EkH5PXG | |
423 | 1i/i3rE1EXFcCHyxmz95VRBDs1p3MuYf9mxntbfYAmuzS3KrRWh3IyX/Eh80N/v9 | |
424 | OXPlwZbVqSTX+L3pCEJtRtsWn0zmswGThjMZiwle0oWuap63L35F1QN8EDaSPSBC | |
425 | yGELNRr6rwVYq0w5b+LOcaCZ+/H1AgMBAAECgYEApfu3aGpww+rC3HUhX0+ckyTy | |
426 | cXLdV9LbxidwqRlVEb0+DyfXNucjelp2sy5EHy3na9GJovo8mmWSxhCRGKliRkQ6 | |
427 | XgrEMZdCSaWI2AazuHAGlUJRFEVkvdla3AuBAn6y0YdDp/3kbg0yahmKyD8Gq74z | |
428 | nUYbDL3R5JtR2Ad/KlUCQQDvSEICTHbO/BF7hVmlKRYZSNHKEPrv8X/OlppS14Kv | |
429 | QRwc+CZ5+l6T1Y+l5cHJQUXrXZoWS1K741TXdUhjjUd7AkEA4pod804Ex8sttdWi | |
430 | pHMfeyj+IbPAk5XnBc91jT7AYIeL8ccjtfl99xhMsGFaxrh3wA/4SGEvwzWkbxcq | |
431 | H8G5TwJAKNG+0P2SVwURRm0dOdukdXPCtiHnbP9Zujhe4zr4hEUrMpXymmRntfh8 | |
432 | pORpBpgoAVraams3Fe5WDttnGfSD+QJAOOC6V9HjfUrQhG3FT0XeRwm5EDiQQ/tC | |
433 | a8DxHqz7mL8tL1ju68ReC+G7jiJBqNOwqzLW/UP3uyYByiikWChGHQJAHUau7jIM | |
434 | 45ErO096n94Vh95p76ANxOroWszOt39TyvJOykIfoPwFagLrBWV9Jjos2/D54KE+ | |
435 | fyoy4t3yHT+/nw== | |
436 | -----END PRIVATE KEY----- | |
437 | ||
438 | =item * PKCS#8 encrypted private keys ARE NOT SUPPORTED YET! | |
439 | ||
440 | -----BEGIN ENCRYPTED PRIVATE KEY----- | |
441 | MIICojAcBgoqhkiG9w0BDAEDMA4ECCQk+Rr1yzzcAgIIAASCAoD/mgpUFjxxM/Ty | |
442 | Yt+NeT0Fo4echgoGksqs6+rYhO16oshG664emZfkuNoFGGzJ38X6GVuqIXhlPnYQ | |
443 | biKvL37dN/KnoGytFHq9Wnk8dDwjGHPtwajhW5WuIV3NuhW/AO1PF/cRZKFjWrPt | |
444 | NWY5CrpfH6t6zojoe+5uyXpH29lQy4OqvSRdPIt/12UcB+tzV7XzSWEuXh8HAi8a | |
445 | sYUu6tuCFnq4GrD2ffM4KWFmL5GqBAwN6m0KkyrNni9XT+RaA6zEhv/lVcwg2esa | |
446 | 4/EzRs0ixzzZDKaml8oCMl9RHtFAbQmdlfV7Ip4rGK9BwY6UFiDMIVru6HynOVQK | |
447 | vvZ+j//bgO+3ubrv7psX+vC9Fy/MoH2Tc7MIwDN/QVTciPZlzjWBnBNxMfeFKtEn | |
448 | d7NFiapgfLuRQIiDTMrW/clcqvO54NphxhrcgUEoxos4twKZARntqPZHtf8nEM2x | |
449 | 2sEF5kI65aEF/5Yy16qvP0vZAA2B1kcIdXZ8XLZCp4c3olhkIrmgUpo1gyFXdCoC | |
450 | 7dT5Cz7/YLkq5hkcFrtp4V9BZMR24fSttc4p24N5xuZ+JneGnGkLX6B+nJAtm9vw | |
451 | bZA6P+23GI0qeMzL3HJXwCOTSsWfm/H9W5+2Zmw851aAmE+pZLni/pk3e3iNSWgs | |
452 | 946x/doA5O0uCFsU7oxme+WAIp2SjhxGoe808Lf1CCFMPboFi1O/E0NsX8SIEX+i | |
453 | U+UHi4kxZqVkr3Q5SB/9kiSv8K1bE787yueQOT/dsTYYaMsjAbkEZo0o/47F32T6 | |
454 | A2ioXHOV/pr5zNHqE5tL+qKEcLYbAUF1O+WvmdqYz+vHQjRQBatAqTmncvLDYr/j | |
455 | 1HPwZX2d | |
456 | -----END ENCRYPTED PRIVATE KEY----- | |
457 | ||
458 | =item * SSH public RSA keys | |
459 | ||
460 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQA...6mdYs5iJNGu/ltUdc= | |
461 | ||
462 | =item * SSH public RSA keys (RFC-4716 format) | |
463 | ||
464 | ---- BEGIN SSH2 PUBLIC KEY ---- | |
465 | Comment: "768-bit RSA, converted from OpenSSH" | |
466 | AAAAB3NzaC1yc2EAAAADAQABAAAAYQDYebeGQFCnlQiNRE7r9UEbjr+DQMTdw1ZHGB2w6x | |
467 | D/DzKem8761GdCpqsLrGaw2D7aSIoP1B5Sz870YoVWHn6Ao7Hvm17V3Kxfn4B01GNQTM5+ | |
468 | L26mdYs5iJNGu/ltUdc= | |
469 | ---- END SSH2 PUBLIC KEY ---- | |
470 | ||
471 | =item * RSA private keys in JSON Web Key (JWK) format | |
472 | ||
473 | See L<http://tools.ietf.org/html/draft-ietf-jose-json-web-key> | |
474 | ||
475 | { | |
476 | "kty":"RSA", | |
477 | "n":"0vx7agoebGcQSuuPiLJXZpt...eZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw", | |
478 | "e":"AQAB", | |
479 | "d":"X4cTteJY_gn4FYPsXB8rdXi...FLN5EEaG6RoVH-HLKD9Mdx5ooGURknhnrRwUkC7h5fJLMWbFAKLWY2v7B6NqSzUvx0_YSf", | |
480 | "p":"83i-7IvMGXoMXCskv73TKr8...Z27zvoj6pbUQyLPBQxtPnwD20-60eTmD2ujMt5PoMrm8RmNhVWtjjMmMjOpSicFHjXOuVI", | |
481 | "q":"3dfOR9cuYq-0S-mkFLzgItg...q3hWeMuG0ouqnb3obLyuqjVZQ1dIrdgTnCdYzBcOW5r37AFXjift_NGiovonzhKpoVVS78", | |
482 | "dp":"G4sPXkc6Ya9y8oJW9_ILj4...zi_H7TkS8x5SdX3oE0oiYwxIiemTAu0UOa5pgFGyJ4c8t2VF40XRugKTP8akhFo5tA77Qe", | |
483 | "dq":"s9lAH9fggBsoFR8Oac2R_E...T2kGOhvIllTE1efA6huUvMfBcpn8lqW6vzzYY5SSF7pMd_agI3G8IbpBUb0JiraRNUfLhc", | |
484 | "qi":"GyM_p6JrXySiz1toFgKbWV...4ypu9bMWx3QJBfm0FoYzUIZEVEcOqwmRN81oDAaaBk0KWGDjJHDdDmFW3AN7I-pux_mHZG", | |
485 | } | |
486 | ||
487 | =item * RSA public keys in JSON Web Key (JWK) format | |
488 | ||
489 | { | |
490 | "kty":"RSA", | |
491 | "n": "0vx7agoebGcQSuuPiLJXZp...tN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECP", | |
492 | "e":"AQAB", | |
493 | } | |
494 | ||
495 | =back | |
496 | ||
337 | 497 | =head2 export_key_der |
338 | 498 | |
339 | 499 | my $private_der = $pk->export_key_der('private'); |
373 | 533 | # 'AES-128-CBC' |
374 | 534 | # 'AES-192-CBC' |
375 | 535 | # 'AES-256-CBC' (DEFAULT) |
536 | ||
537 | =head2 export_key_jwk | |
538 | ||
539 | Exports public/private keys as a JSON Web Key. | |
540 | ||
541 | my $private_json_text = $pk->export_key_jwk('private'); | |
542 | #or | |
543 | my $public_json_text = $pk->export_key_jwk('public'); | |
376 | 544 | |
377 | 545 | =head2 encrypt |
378 | 546 |
2 | 2 | use strict; |
3 | 3 | use warnings ; |
4 | 4 | |
5 | our $VERSION = '0.021_7'; | |
5 | our $VERSION = '0.022'; | |
6 | 6 | |
7 | 7 | require XSLoader; |
8 | 8 | XSLoader::load('CryptX', $VERSION); |
67 | 67 | |
68 | 68 | =head1 COPYRIGHT |
69 | 69 | |
70 | Copyright (c) 2013 DCIT, a.s. L<http://www.dcit.cz> / Karel Miko⏎ | |
70 | Copyright (c) 2013-2015 DCIT, a.s. L<http://www.dcit.cz> / Karel Miko⏎ |
129 | 129 | |
130 | 130 | /* p */ |
131 | 131 | if ((err = mp_read_unsigned_bin(seedinc, sbuf, seedbytes)) != CRYPT_OK) { goto cleanup; } |
132 | /* printf("seed="); mp_fwrite(seedinc, 16, stdout); printf("\n"); //XXX-DEBUG */ | |
133 | 132 | if ((err = mp_add(q, q, t2q)) != CRYPT_OK) { goto cleanup; } |
134 | 133 | for(counter=0; counter < 4*L && !found_p; counter++) { |
135 | 134 | for(j=0; j<=n; j++) { |
55 | 55 | if (err != CRYPT_OK) { return err; } |
56 | 56 | |
57 | 57 | /* try to decode encrypted priv key */ |
58 | LTC_SET_ASN1(key_seq_e, 0, LTC_ASN1_OCTET_STRING, buf1, 9000UL); | |
58 | LTC_SET_ASN1(key_seq_e, 0, LTC_ASN1_OCTET_STRING, buf1, buf1len); | |
59 | 59 | LTC_SET_ASN1(key_seq_e, 1, LTC_ASN1_INTEGER, iter, 1UL); |
60 | 60 | LTC_SET_ASN1(alg_seq_e, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL); |
61 | 61 | LTC_SET_ASN1(alg_seq_e, 1, LTC_ASN1_SEQUENCE, key_seq_e, 2UL); |
62 | 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); | |
63 | LTC_SET_ASN1(top_seq_e, 1, LTC_ASN1_OCTET_STRING, buf2, buf2len); | |
64 | 64 | err=der_decode_sequence(in, inlen, top_seq_e, 2UL); |
65 | 65 | if (err == CRYPT_OK) { |
66 | 66 | /* unsigned long icount = mp_get_int(iter); */ |
32 | 32 | ecc_point *test_output = NULL; |
33 | 33 | test_output = malloc(sizeof(ecc_point)); |
34 | 34 | |
35 | /* XXX test_output->infinity = 0; */ | |
36 | 35 | if (mp_init_multi(&(test_output->x), &(test_output->y), &(test_output->z), &order, &prime, NULL) != CRYPT_OK) { |
37 | 36 | return CRYPT_MEM; |
38 | 37 | } |
62 | 61 | goto error; |
63 | 62 | } |
64 | 63 | |
65 | /* XXX | |
66 | if(!test_output->infinity){ | |
67 | err = CRYPT_INVALID_PACKET; | |
68 | goto error; | |
69 | } | |
70 | */ | |
71 | ||
72 | 64 | err = CRYPT_OK; |
73 | 65 | error: |
74 | 66 | mp_clear_multi(prime, order, test_output->z, test_output->y, test_output->x, NULL); |
89 | 89 | if (err != CRYPT_OK) { return err; } |
90 | 90 | |
91 | 91 | /* try to decode encrypted priv key */ |
92 | LTC_SET_ASN1(key_seq_e, 0, LTC_ASN1_OCTET_STRING, buf1, 9000UL); | |
92 | LTC_SET_ASN1(key_seq_e, 0, LTC_ASN1_OCTET_STRING, buf1, buf1len); | |
93 | 93 | LTC_SET_ASN1(key_seq_e, 1, LTC_ASN1_INTEGER, iter, 1UL); |
94 | 94 | LTC_SET_ASN1(alg_seq_e, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL); |
95 | 95 | LTC_SET_ASN1(alg_seq_e, 1, LTC_ASN1_SEQUENCE, key_seq_e, 2UL); |
96 | 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); | |
97 | LTC_SET_ASN1(top_seq_e, 1, LTC_ASN1_OCTET_STRING, buf2, buf2len); | |
98 | 98 | err=der_decode_sequence(in, inlen, top_seq_e, 2UL); |
99 | 99 | if (err == CRYPT_OK) { |
100 | 100 | /* unsigned long icount = mp_get_int(iter); */ |