summaryrefslogtreecommitdiff
path: root/lib/Crypt/OpenSSL/PKCS10.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Crypt/OpenSSL/PKCS10.pm')
-rw-r--r--lib/Crypt/OpenSSL/PKCS10.pm240
1 files changed, 240 insertions, 0 deletions
diff --git a/lib/Crypt/OpenSSL/PKCS10.pm b/lib/Crypt/OpenSSL/PKCS10.pm
new file mode 100644
index 0000000..c066ed9
--- /dev/null
+++ b/lib/Crypt/OpenSSL/PKCS10.pm
@@ -0,0 +1,240 @@
+package Crypt::OpenSSL::PKCS10;
+
+use 5.008000;
+use strict;
+use warnings;
+require Exporter;
+
+our @ISA = qw(Exporter);
+
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+
+# This allows declaration use Crypt::OpenSSL::PKCS10 ':all';
+# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
+# will save memory.
+our @NIDS = qw(
+ NID_key_usage NID_subject_alt_name NID_netscape_cert_type NID_netscape_comment
+ NID_ext_key_usage
+);
+
+our %EXPORT_TAGS = (
+ 'all' => [ @NIDS ],
+ 'const' => [ @NIDS ],
+);
+
+our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
+
+#our @EXPORT = qw(
+
+#);
+
+our $VERSION = '0.25';
+
+require XSLoader;
+XSLoader::load('Crypt::OpenSSL::PKCS10', $VERSION);
+
+# Preloaded methods go here.
+
+sub new_from_rsa {
+ my $self = shift;
+ my $rsa = shift;
+
+ my $priv = $rsa->get_private_key_string();
+ $self->_new_from_rsa($rsa, $priv);
+
+}
+
+1;
+__END__
+
+# ABSTRACT: Perl extension to OpenSSL's PKCS10 API.
+
+=head1 NAME
+
+Crypt::OpenSSL::PKCS10 - Perl extension to OpenSSL's PKCS10 API.
+
+=head1 SYNOPSIS
+
+ use Crypt::OpenSSL::PKCS10 qw( :const );
+
+ my $req = Crypt::OpenSSL::PKCS10->new;
+ $req->set_subject("/C=RO/O=UTI/OU=ssi");
+ $req->add_ext(Crypt::OpenSSL::PKCS10::NID_key_usage,"critical,digitalSignature,keyEncipherment");
+ $req->add_ext(Crypt::OpenSSL::PKCS10::NID_ext_key_usage,"serverAuth, nsSGC, msSGC, 1.3.4");
+ $req->add_ext(Crypt::OpenSSL::PKCS10::NID_subject_alt_name,"email:steve@openssl.org");
+ $req->add_custom_ext('1.2.3.3',"My new extension");
+ $req->add_ext_final();
+ $req->sign();
+ $req->write_pem_req('request.pem');
+ $req->write_pem_pk('pk.pem');
+ print $req->get_pem_pubkey();
+ print $req->pubkey_type();
+ print $req->get_pem_req();
+
+=head1 ABSTRACT
+
+ Crypt::OpenSSL::PKCS10 - Perl extension to OpenSSL's PKCS10 API.
+
+=head1 DESCRIPTION
+
+Crypt::OpenSSL::PKCS10 provides the ability to create PKCS10 certificate requests using RSA key pairs.
+
+=head1 Class Methods
+
+=over
+
+=item new
+
+Create a new Crypt::OpenSSL::PKCS10 object by generating a new RSA key pair. There is one optional argument, the key size,
+which has the default value of 1024 if omitted.
+
+=item new_from_rsa( $rsa_object )
+
+Create a new Crypt::OpenSSL::PKCS10 object by using key information from a Crypt::OpenSSL::RSA object. Here is an example:
+
+ my $rsa = Crypt::OpenSSL::RSA->generate_key(512);
+ my $req = Crypt::OpenSSL::PKCS10->new_from_rsa($rsa);
+
+OpenSSL 3.0 has deprecated the RSA object which Crypt::OpenSSL::RSA creates. new_from_rsa() is now a perl sub which obtains the private key as a string that is also passed to the _new_from_rsa() XS function.
+
+=item new_from_file( $filename )
+
+Create a new Crypt::OpenSSL::PKCS10 object by reading the request and key information from a PEM formatted file. Here is an example:
+
+ my $req = Crypt::OpenSSL::PKCS10->new_from_file("CSR.csr");
+
+=back
+
+=head1 Instance Methods
+
+=over 2
+
+=item set_subject($subject, [ $utf8 ])
+
+Sets the subject DN of the request.
+Note: $subject is expected to be in the format /type0=value0/type1=value1/type2=... where characters may be escaped by \.
+If $utf8 is non-zero integer, $subject is interpreted as UTF-8 string.
+
+=item add_ext($nid, $extension)
+
+Adds a new extension to the request. The first argument $nid is one of the exported constants (see below).
+The second one $extension is a string (for more info read C<openssl(3)>).
+
+ $req->add_ext(Crypt::OpenSSL::PKCS10::NID_key_usage,"critical,digitalSignature,keyEncipherment");
+ $req->add_ext(Crypt::OpenSSL::PKCS10::NID_ext_key_usage,"serverAuth, nsSGC, msSGC, 1.3.4");
+ $req->add_ext(Crypt::OpenSSL::PKCS10::NID_subject_alt_name,"email:steve@openssl.org");
+
+=item add_custom_ext($oid, $desc)
+
+Adds a new custom extension to the request. The value is added as a text string, using ASN.1 encoding rules inherited from the Netscape Comment OID.
+
+ $req->add_custom_ext('1.2.3.3',"My new extension");
+
+=item add_custom_ext_raw($oid, $bytes)
+
+Adds a new custom extension to the request. The value is added as a raw DER octet string. Use this if you are packing your own ASN.1 structures and need to set the extension value directly.
+
+ $req->add_custom_ext_raw($oid, pack('H*','1E06006100620063')) # BMPString 'abc'
+
+=item add_ext_final()
+
+This must be called after all extensions has been added. It actually copies the extension stack to request structure.
+
+ $req->add_ext(Crypt::OpenSSL::PKCS10::NID_subject_alt_name,"email:my@email.org");
+ $req->add_ext_final();
+
+=item sign()
+
+This adds the signature to the PKCS10 request.
+
+ $req->sign();
+
+=item pubkey_type()
+
+Returns the type of the PKCS10 public key - one of (rsa|dsa|ec).
+
+ $req->pubkey_type();
+
+=item get_pubkey()
+
+Returns the PEM encoding of the PKCS10 public key.
+
+ $req->get_pubkey();
+
+=item get_pem_req()
+
+Returns the PEM encoding of the PKCS10 request.
+
+ $req->get_pem_req();
+
+=item write_pem_req($filename)
+
+Writes the PEM encoding of the PKCS10 request to a given file.
+
+ $req->write_pem_req('request.pem');
+
+=item get_pem_pk()
+
+Returns the PEM encoding of the private key.
+
+ $req->get_pem_pk();
+
+=item write_pem_pk($filename)
+
+Writes the PEM encoding of the private key to a given file.
+
+ $req->write_pem_pk('request.pem');
+
+=item subject()
+
+returns the subject of the PKCS10 request
+
+ $subject = $req->subject();
+
+=item keyinfo()
+
+returns the human readable info about the key of the PKCS10 request
+
+ $keyinfo = $req->keyinfo();
+
+=back
+
+=head2 EXPORT
+
+None by default.
+
+On request:
+
+ NID_key_usage NID_subject_alt_name NID_netscape_cert_type NID_netscape_comment
+ NID_ext_key_usage
+
+=head1 BUGS
+
+If you destroy $req object that is linked to a Crypt::OpenSSL::RSA object, the RSA private key is also freed,
+thus you can't use latter object anymore. Avoid this:
+
+ my $rsa = Crypt::OpenSSL::RSA->generate_key(512);
+ my $req = Crypt::OpenSSL::PKCS10->new_from_rsa($rsa);
+ undef $req;
+ print $rsa->get_private_key_string();
+
+=head1 SEE ALSO
+
+C<Crypt::OpenSSL::RSA>, C<Crypt::OpenSSL::X509>.
+
+=head1 AUTHOR
+
+JoNO, E<lt>jonozzz@yahoo.comE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2006 by JoNO
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.8.2 or,
+at your option, any later version of Perl 5 you may have available.
+
+
+=cut