Codebase list libcryptx-perl / fdc5977
tuning RSA interoperability + small fixes Karel Miko 10 years ago
7 changed file(s) with 70 addition(s) and 39 deletion(s). Raw diff Collapse all Expand all
521521
522522 Create encrypted file (from commandline):
523523
524 echo 'secret message' | openssl rsautl -encrypt -inkey rsakey.pub.pem -pubin -out input.encrypted.rsa
524 openssl rsautl -encrypt -inkey rsakey.pub.pem -pubin -out input.encrypted.rsa -in input.data
525525
526526 Decrypt file (Perl code):
527527
557557
558558 Verify signature (Perl code):
559559
560 use Crypt::PK::RSA;
561 use Crypt::Digest 'digest_file';
562 use File::Slurp 'read_file';
560 use Crypt::PK::RSA;
561 use Crypt::Digest 'digest_file';
562 use File::Slurp 'read_file';
563563
564 my $pkrsa = Crypt::PK::RSA->new("rsakey.pub.pem");
565 my $signature = read_file("input.sha1-rsa.sig", binmode=>':raw');
566 my $valid = $pkrsa->verify_hash($signature, digest_file("SHA1", "input.data"), "SHA1", "v1.5");
567 print $valid ? "SUCCESS" : "FAILURE";
564 my $pkrsa = Crypt::PK::RSA->new("rsakey.pub.pem");
565 my $signature = read_file("input.sha1-rsa.sig", binmode=>':raw');
566 my $valid = $pkrsa->verify_hash($signature, digest_file("SHA1", "input.data"), "SHA1", "v1.5");
567 print $valid ? "SUCCESS" : "FAILURE";
568568
569569 =head2 Sign by Crypt::PK::RSA, verify by OpenSSL
570570
571571 Create signature (Perl code):
572572
573 use Crypt::PK::RSA;
574 use Crypt::Digest 'digest_file';
575 use File::Slurp 'write_file';
573 use Crypt::PK::RSA;
574 use Crypt::Digest 'digest_file';
575 use File::Slurp 'write_file';
576576
577 my $pkrsa = Crypt::PK::RSA->new("rsakey.priv.pem");
578 my $signature = $pkrsa->sign_hash(digest_file("SHA1", "input.data"), "SHA1", "v1.5");
579 write_file("input.sha1-rsa.sig", {binmode=>':raw'}, $signature);
577 my $pkrsa = Crypt::PK::RSA->new("rsakey.priv.pem");
578 my $signature = $pkrsa->sign_hash(digest_file("SHA1", "input.data"), "SHA1", "v1.5");
579 write_file("input.sha1-rsa.sig", {binmode=>':raw'}, $signature);
580580
581581 Verify signature (from commandline):
582582
583583 openssl dgst -sha1 -verify rsakey.pub.pem -signature input.sha1-rsa.sig input.data
584584
585 =head2 Keys generated by Crypt::PK::RSA
586
587 Generate keys (Perl code):
588
589 use Crypt::PK::RSA;
590 use File::Slurp 'write_file';
591
592 my $pkrsa = Crypt::PK::RSA->new;
593 $pkrsa->generate_key(256, 65537);
594 write_file("rsakey.pub.der", {binmode=>':raw'}, $pkrsa->export_key_der('public'));
595 write_file("rsakey.priv.der", {binmode=>':raw'}, $pkrsa->export_key_der('private'));
596 write_file("rsakey.pub.pem", $pkrsa->export_key_pem('public_x509'));
597 write_file("rsakey.priv.pem", $pkrsa->export_key_pem('private'));
598 write_file("rsakey-passwd.priv.pem", $pkrsa->export_key_pem('private', 'secret'));
599
600 Use keys by OpenSSL:
601
602 openssl rsa -in rsakey.priv.der -text -inform der
603 openssl rsa -in rsakey.priv.pem -text
604 openssl rsa -in rsakey-passwd.priv.pem -text -inform pem -passin pass:secret
605 openssl rsa -in rsakey.pub.der -pubin -text -inform der
606 openssl rsa -in rsakey.pub.pem -pubin -text
607
608 =head2 Keys generated by OpenSSL
609
610 Generate keys:
611
612 openssl genrsa -out rsakey.priv.pem 1024
613 openssl rsa -in rsakey.priv.pem -out rsakey.priv.der -outform der
614 openssl rsa -in rsakey.priv.pem -out rsakey.pub.pem -pubout
615 openssl rsa -in rsakey.priv.pem -out rsakey.pub.der -outform der -pubout
616 openssl rsa -in rsakey.priv.pem -passout pass:secret -des3 -out rsakey-passwd.priv.pem
617
618 Load keys (Perl code):
619
620 use Crypt::PK::RSA;
621 use File::Slurp 'write_file';
622
623 my $pkrsa = Crypt::PK::RSA->new;
624 $pkrsa->import_key("rsakey.pub.der");
625 $pkrsa->import_key("rsakey.priv.der");
626 $pkrsa->import_key("rsakey.pub.pem");
627 $pkrsa->import_key("rsakey.priv.pem");
628 $pkrsa->import_key("rsakey-passwd.priv.pem", "secret");
629
585630 =head1 SEE ALSO
586631
587632 =over
5353 sub _pem_to_asn1 {
5454 my ($data, $password) = @_;
5555
56 my ($begin, $object, $headers, $content, $end) = $data =~ m/(-----BEGIN ([^\n\-]+KEY)-----)\n(.*?\n\n)?(.+)(-----END .*?-----)/s;
56 my ($begin, $object, $headers, $content, $end) = $data =~ m/(-----BEGIN ([^\r\n\-]+KEY)-----)\r?\n(.*?\r?\n\r?\n)?(.+)(-----END [^\r\n\-]*-----)/s;
57
5758 return $content unless $content;
5859 $content = decode_base64($content);
5960
293293 #endif
294294
295295 int
296 CryptX_test(s)
297 int s
296 CryptX_test(int s)
298297 CODE:
299298 RETVAL = s+1; /*xxx*/
300299 OUTPUT:
110110 case LTC_ASN1_SEQUENCE:
111111 case LTC_ASN1_SET:
112112 case LTC_ASN1_SETOF:
113 case LTC_ASN1_RAW_BIT_STRING:
113114 case LTC_ASN1_CHOICE:
114 list[x].type = type;
115 list[x].size = size;
116 list[x++].data = data;
115 LTC_SET_ASN1(list, x++, type, data, size);
117116 break;
118117
119118 default:
112112 case LTC_ASN1_SET:
113113 case LTC_ASN1_SETOF:
114114 case LTC_ASN1_RAW_BIT_STRING:
115 list[x].type = type;
116 list[x].size = size;
117 list[x++].data = data;
115 LTC_SET_ASN1(list, x++, type, data, size);
118116 break;
119117
120118 default:
4848 return err;
4949 }
5050
51 alg_id[0].data = oid.OID;
52 alg_id[0].size = oid.OIDlen;
53 alg_id[0].type = LTC_ASN1_OBJECT_IDENTIFIER;
54
55 alg_id[1].data = parameters;
56 alg_id[1].size = parameters_len;
57 alg_id[1].type = parameters_type;
51 LTC_SET_ASN1(alg_id, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid.OID, oid.OIDlen);
52 LTC_SET_ASN1(alg_id, 1, parameters_type, parameters, parameters_len);
5853
5954 return der_encode_sequence_multi(out, outlen,
6055 LTC_ASN1_SEQUENCE, (unsigned long)sizeof(alg_id)/sizeof(alg_id[0]), alg_id,
7070 goto error;
7171 }
7272
73 int_list[0].data = key->p;
74 int_list[0].size = 1UL;
75 int_list[0].type = LTC_ASN1_INTEGER;
76 int_list[1].data = key->q;
77 int_list[1].size = 1UL;
78 int_list[1].type = LTC_ASN1_INTEGER;
79 int_list[2].data = key->g;
80 int_list[2].size = 1UL;
81 int_list[2].type = LTC_ASN1_INTEGER;
73 LTC_SET_ASN1(int_list, 0, LTC_ASN1_INTEGER, key->p, 1UL);
74 LTC_SET_ASN1(int_list, 1, LTC_ASN1_INTEGER, key->q, 1UL);
75 LTC_SET_ASN1(int_list, 2, LTC_ASN1_INTEGER, key->g, 1UL);
8276
8377 err = der_encode_subject_public_key_info(out, outlen,
8478 PKA_DSA, tmp, tmplen,