Codebase list libcryptx-perl / 796ee0d
v0.022 Karel Miko 8 years ago
11 changed file(s) with 463 addition(s) and 44 deletion(s). Raw diff Collapse all Expand all
66 my $flags = '-Isrc/ltc/headers -Isrc/ltm -DLTC_SOURCE -DLTC_NO_TEST -DLTC_NO_PROTOTYPES -DLTM_DESC';
77 #$flags .= ' -Wall';
88 #$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\./;
910
1011 my $class = Module::Build->subclass(
1112 class => 'My::Builder',
00 Changes for CryptX
11
22 TODO:
3 - [MUST] update documentation: ECC+RSA+DSA
43 - 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
65 - add CCM interface for new-add-add-done mode
76 - switch yarrow > fortuna for Crypt::PK::*
87 - RSA|DSA|ECC: verify_key($level) (basic check + extented primality test)
1211 - DH: key2hash should dump $base and $prime as well (perhasp add base, prime to dh_key struct)
1312 - XS croaks should report the "real caller" (Crypt::Mac::*, Crypt::Mode::*, ...)
1413
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
2224 - libtomcrypt updated to the latest develop branch, commit aeaa6d4a51 Apr 17 08:59:35 2015 +0200
2325 - libtommath updated to the latest develop branch, commit 0fd5e6c17f Dec 11 14:59:35 2014 +0100
2426 - documentation fixes
6363 under the same terms as Perl itself.
6464
6565 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
6767
263263 $pk->import_key($pem_filename, $password);
264264 #or
265265 $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
266352
267353 =head2 export_key_der
268354
534534 }
535535 elsif ($data =~ /---- BEGIN SSH2 PUBLIC KEY ----(.*?)---- END SSH2 PUBLIC KEY ----/sg) {
536536 $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);
538538 return $self->import_key_raw($pubkey, "$2") if $pubkey && $typ =~ /^ecdsa-(.+?)-(.*)$/;
539539 }
540540 elsif ($data =~ /(ecdsa-\S+)\s+(\S+)/) {
541541 $data = decode_base64($2);
542 my ($typ, $xxx, $pubkey) = Crypt::PK::_ssh_parse($data);
542 my ($typ, $skip, $pubkey) = Crypt::PK::_ssh_parse($data);
543543 return $self->import_key_raw($pubkey, "$2") if $pubkey && $typ =~ /^ecdsa-(.+?)-(.*)$/;
544544 }
545545 else {
706706
707707 =head2 new
708708
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);
714714
715715 Support for password protected PEM keys
716716
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);
720720
721721 =head2 generate_key
722722
784784
785785 Loads private or public key in DER or PEM format.
786786
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
796959
797960 =head2 import_key_raw
798961
829992 # 'AES-128-CBC'
830993 # 'AES-192-CBC'
831994 # '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');
8321003
8331004 =head2 export_key_raw
8341005
334334 #or
335335 $pk->import_key(\$buffer_containing_pem_key, $password);
336336
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
337497 =head2 export_key_der
338498
339499 my $private_der = $pk->export_key_der('private');
373533 # 'AES-128-CBC'
374534 # 'AES-192-CBC'
375535 # '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');
376544
377545 =head2 encrypt
378546
22 use strict;
33 use warnings ;
44
5 our $VERSION = '0.021_7';
5 our $VERSION = '0.022';
66
77 require XSLoader;
88 XSLoader::load('CryptX', $VERSION);
6767
6868 =head1 COPYRIGHT
6969
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
129129
130130 /* p */
131131 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 */
133132 if ((err = mp_add(q, q, t2q)) != CRYPT_OK) { goto cleanup; }
134133 for(counter=0; counter < 4*L && !found_p; counter++) {
135134 for(j=0; j<=n; j++) {
5555 if (err != CRYPT_OK) { return err; }
5656
5757 /* 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);
5959 LTC_SET_ASN1(key_seq_e, 1, LTC_ASN1_INTEGER, iter, 1UL);
6060 LTC_SET_ASN1(alg_seq_e, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL);
6161 LTC_SET_ASN1(alg_seq_e, 1, LTC_ASN1_SEQUENCE, key_seq_e, 2UL);
6262 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);
6464 err=der_decode_sequence(in, inlen, top_seq_e, 2UL);
6565 if (err == CRYPT_OK) {
6666 /* unsigned long icount = mp_get_int(iter); */
3232 ecc_point *test_output = NULL;
3333 test_output = malloc(sizeof(ecc_point));
3434
35 /* XXX test_output->infinity = 0; */
3635 if (mp_init_multi(&(test_output->x), &(test_output->y), &(test_output->z), &order, &prime, NULL) != CRYPT_OK) {
3736 return CRYPT_MEM;
3837 }
6261 goto error;
6362 }
6463
65 /* XXX
66 if(!test_output->infinity){
67 err = CRYPT_INVALID_PACKET;
68 goto error;
69 }
70 */
71
7264 err = CRYPT_OK;
7365 error:
7466 mp_clear_multi(prime, order, test_output->z, test_output->y, test_output->x, NULL);
8989 if (err != CRYPT_OK) { return err; }
9090
9191 /* 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);
9393 LTC_SET_ASN1(key_seq_e, 1, LTC_ASN1_INTEGER, iter, 1UL);
9494 LTC_SET_ASN1(alg_seq_e, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL);
9595 LTC_SET_ASN1(alg_seq_e, 1, LTC_ASN1_SEQUENCE, key_seq_e, 2UL);
9696 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);
9898 err=der_decode_sequence(in, inlen, top_seq_e, 2UL);
9999 if (err == CRYPT_OK) {
100100 /* unsigned long icount = mp_get_int(iter); */