*nix Documentation Project
·  Home
 +   man pages
·  Linux HOWTOs
·  FreeBSD Tips
·  *niX Forums

  man pages->Tru64 Unix man pages -> pem (3)              
Title
Content
Arch
Section
 

pem(3)

Contents


NAME    [Toc]    [Back]

       pem - PEM routines

SYNOPSIS    [Toc]    [Back]

       #include <openssl/pem.h>

       EVP_PKEY *PEM_read_bio_PrivateKey(
               BIO *bp,
               EVP_PKEY **x,
               pem_password_cb *cb,
               void *u ); EVP_PKEY *PEM_read_PrivateKey(
               FILE *fp,
               EVP_PKEY **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_PrivateKey(
               BIO *bp,
               EVP_PKEY *x,
               const EVP_CIPHER *enc,
               unsigned char *kstr,
               int klen,
               pem_password_cb *cb,
               void *u ); int PEM_write_PrivateKey(
               FILE *fp,
               EVP_PKEY *x,
               const EVP_CIPHER *enc,
               unsigned char *kstr,
               int klen,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_PKCS8PrivateKey(
               BIO *bp,
               EVP_PKEY *x,
               const EVP_CIPHER *enc,
               char *kstr,
               int klen,
               pem_password_cb *cb,
               void *u ); int PEM_write_PKCS8PrivateKey(
               FILE *fp,
               EVP_PKEY *x,
               const EVP_CIPHER *enc,
               char *kstr,
               int klen,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_PKCS8PrivateKey_nid(
               BIO *bp,
               EVP_PKEY *x,
               int nid,
               char *kstr,
               int klen,
               pem_password_cb *cb,
               void *u ); int PEM_write_PKCS8PrivateKey_nid(
               FILE *fp,
               EVP_PKEY *x,
               int nid,
               char *kstr,
               int klen,
               pem_password_cb *cb,
               void *u ); EVP_PKEY *PEM_read_bio_PUBKEY(
               BIO *bp,
               EVP_PKEY **x,
               pem_password_cb *cb,
               void *u ); EVP_PKEY *PEM_read_PUBKEY(
               FILE *fp,
               EVP_PKEY **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_PUBKEY(
               BIO *bp,
               EVP_PKEY *x ); int PEM_write_PUBKEY(
               FILE *fp,
               EVP_PKEY *x ); RSA *PEM_read_bio_RSAPrivateKey(
               BIO *bp,
               RSA **x,
               pem_password_cb *cb,
               void *u ); RSA *PEM_read_RSAPrivateKey(
               FILE *fp,
               RSA **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_RSAPrivateKey(
               BIO *bp,
               RSA *x,
               const EVP_CIPHER *enc,
               int klen,
               unsigned char *kstr,
               pem_password_cb *cb,
               void *u ); int PEM_write_RSAPrivateKey(
               FILE *fp,
               RSA *x,
               const EVP_CIPHER *enc,
               unsigned char *kstr,
               int klen,
               pem_password_cb *cb,
               void *u ); RSA *PEM_read_bio_RSAPublicKey(
               BIO *bp,
               RSA **x,
               pem_password_cb *cb,
               void *u ); RSA *PEM_read_RSAPublicKey(
               FILE *fp,
               RSA **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_RSAPublicKey(
               BIO *bp,
               RSA *x ); int PEM_write_RSAPublicKey(
               FILE *fp,
               RSA *x ); RSA *PEM_read_bio_RSA_PUBKEY(
               BIO *bp,
               RSA **x,
               pem_password_cb *cb,
               void *u ); RSA *PEM_read_RSA_PUBKEY(
               FILE *fp,
               RSA **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_RSA_PUBKEY(
               BIO *bp,
               RSA *x ); int PEM_write_RSAPublicKey(
               FILE *fp,
               RSA *x ); RSA *PEM_read_bio_RSA_PUBKEY(
               BIO *bp,
               RSA **x,
               pem_password_cb *cb,
               void *u ); RSA *PEM_read_RSA_PUBKEY(
               FILE *fp,
               RSA **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_RSA_PUBKEY(
               BIO *bp,
               RSA *x ); int PEM_write_RSA_PUBKEY(
               FILE *fp,
               RSA *x ); DSA *PEM_read_bio_DSAPrivateKey(
               BIO *bp,
               DSA **x,
               pem_password_cb *cb,
               void *u ); DSA *PEM_read_DSAPrivateKey(
               FILE *fp,
               DSA **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_DSAPrivateKey(
               BIO *bp,
               DSA *x, const EVP_CIPHER *enc,
               unsigned char *kstr,
               int klen,
               pem_password_cb *cb,
               void *u ); int PEM_write_DSAPrivateKey(
               FILE *fp,
               DSA *x,
               const EVP_CIPHER *enc,
               unsigned char *kstr,
               int klen,
               pem_password_cb *cb,
               void *u ); DSA *PEM_read_bio_DSA_PUBKEY(
               BIO *bp,
               DSA **x,
               pem_password_cb *cb,
               void *u ); DSA *PEM_read_DSA_PUBKEY(
               FILE *fp,
               DSA **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_DSA_PUBKEY(
               BIO *bp,
               DSA *x ); int PEM_write_DSA_PUBKEY(
               FILE *fp,
               DSA *x ); DSA *PEM_read_bio_DSAparams(
               BIO *bp,
               DSA **x,
               pem_password_cb *cb,
               void *u ); DSA *PEM_read_DSAparams(
               FILE *fp,
               DSA **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_DSAparams(
               BIO *bp,
               DSA *x ); int PEM_write_DSAparams(
               FILE *fp,
               DSA *x ); DH *PEM_read_bio_DHparams(
               BIO *bp,
               DH **x,
               pem_password_cb *cb,
               void *u ); DH *PEM_read_DHparams(
               FILE *fp,
               DH **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_DHparams(
               BIO *bp,
               DH *x ); int PEM_write_DHparams(
               FILE *fp,
               DH *x ); X509_CRL *PEM_read_bio_X509_CRL(
               BIO *bp,
               X509_CRL **x,
               pem_password_cb *cb,
               void *u ); X509_CRL *PEM_read_X509_CRL(
               FILE *fp,
               X509_CRL **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_X509_CRL(
               BIO *bp,
               X509_CRL *x ); int PEM_write_X509_CRL(
               FILE *fp,
               X509_CRL *x ); PKCS7 *PEM_read_bio_PKCS7(
               BIO *bp,
               PKCS7 **x,
               pem_password_cb *cb,
               void *u ); PKCS7 *PEM_read_PKCS7(
               ILE *fp,
               PKCS7 **x,
               pem_password_cb *cb,
               void *u ); int PEM_write_bio_PKCS7(
               BIO *bp,
               PKCS7 *x ); int PEM_write_PKCS7(
               FILE *fp,
               PKCS7       *x      );      NETSCAPE_CERT_SEQUENCE
       *PEM_read_bio_NETSCAPE_CERT_SEQUENCE(
               BIO *bp,
               NETSCAPE_CERT_SEQUENCE **x,
               pem_password_cb *cb,
               void      *u       );       NETSCAPE_CERT_SEQUENCE
       *PEM_read_NETSCAPE_CERT_SEQUENCE(
               FILE *fp,
               NETSCAPE_CERT_SEQUENCE **x,
               pem_password_cb *cb,
               void             *u             );             int
       PEM_write_bio_NETSCAPE_CERT_SEQUENCE(
               BIO *bp,
               NETSCAPE_CERT_SEQUENCE       *x       );       int
       PEM_write_NETSCAPE_CERT_SEQUENCE(
               FILE *fp,
               NETSCAPE_CERT_SEQUENCE *x );

DESCRIPTION    [Toc]    [Back]

       The  pem()  functions read or write structures in PEM format.
 In this sense PEM format  is  simply  base64  encoded
       data surrounded by header lines.

       Each  operation has four functions associated with it. For
       clarity the term foobar functions will be used to  collectively
  refer  to the PEM_read_bio_foobar(), PEM_read_foobar(),
  PEM_write_bio_foobar(),   and   PEM_write_foobar()
       functions.

       The  PrivateKey  functions  read or write a private key in
       PEM format using an EVP_PKEY structure. The write routines
       use traditional private key format and can handle both RSA
       and DSA private keys. The read functions can transparently
       handle PKCS#8 format encrypted and unencrypted keys too.

       The           PEM_write_bio_PKCS8PrivateKey()          and
       PEM_write_PKCS8PrivateKey() functions write a private  key
       in an EVP_PKEY structure in PKCS#8 EncryptedPrivateKeyInfo
       format using PKCS#5 v2.0 password based  encryption  algorithms.
 The cipher argument specifies the encryption algoritm
 to use. Unlike all other PEM routines the  encryption
       is applied at the PKCS#8 level and not in the PEM headers.
       If cipher is NULL then no encryption is used and a  PKCS#8
       PrivateKeyInfo structure is used instead.

       The         PEM_write_bio_PKCS8PrivateKey_nid()        and
       PEM_write_PKCS8PrivateKey_nid() functions also write out a
       private key as a PKCS#8 EncryptedPrivateKeyInfo however it
       uses PKCS#5 v1.5 or PKCS#12 encryption algorithms instead.
       The algorithm to use is specified in the nid parameter and
       should be the NID of the corresponding  OBJECT  IDENTIFIER
       (see Notes section).

       The  PUBKEY  functions  process  a  public  key  using  an
       EVP_PKEY structure.  The public key is encoded as  a  SubjectPublicKeyInfo
 structure.

       The  RSAPrivateKey  functions  process  an RSA private key
       using an RSA structure. It handles the same formats as the
       PrivateKey  functions  but  an error occurs if the private
       key is not RSA.

       The RSAPublicKey functions process an RSA public key using
       an  RSA  structure.   The  public  key  is encoded using a
       PKCS#1 RSAPublicKey structure.

       The RSA_PUBKEY functions also process an  RSA  public  key
       using  an RSA structure. However the public key is encoded
       using a SubjectPublicKeyInfo structure and an error occurs
       if the public key is not RSA.

       The  DSAPrivateKey  functions  process  a  DSA private key
       using a DSA structure.  It handles the same formats as the
       PrivateKey  functions  but  an error occurs if the private
       key is not DSA.

       The DSA_PUBKEY functions process a DSA public key using  a
       DSA structure.  The public key is encoded using a SubjectPublicKeyInfo
 structure and an error occurs if the  public
       key is not DSA.

       The DSAparams functions process DSA parameters using a DSA
       structure.  The parameters  are  encoded  using  a  foobar
       structure.

       The  DHparams  functions  process DH parameters using a DH
       structure. The parameters are encoded using a PKCS#3 DHparameter
 structure.

       The  X509  functions  process an X509 certificate using an
       X509 structure.  They will also  process  a  trusted  X509
       certificate but any trust settings are discarded.

       The  X509_AUX functions process a trusted X509 certificate
       using an X509 structure.

       The X509_REQ and X509_REQ_NEW functions process a  PKCS#10
       certificate  request  using  an  X509_REQ  structure.  The
       X509_REQ write functions use CERTIFICATE  REQUEST  in  the
       header whereas the X509_REQ_NEW functions use NEW CERTIFICATE
 REQUEST (as required by some CAs). The X509_REQ  read
       functions   will  handle  either  form  so  there  are  no
       X509_REQ_NEW read functions.

       The X509_CRL  functions  process  an  X509  CRL  using  an
       X509_CRL structure.

       The  PKCS7  functions process a PKCS#7 ContentInfo using a
       PKCS7 structure.

       The NETSCAPE_CERT_SEQUENCE functions  process  a  Netscape
       Certificate Sequence using a NETSCAPE_CERT_SEQUENCE structure.







PEM FUNCTION ARGUMENTS    [Toc]    [Back]

       The PEM functions have many common arguments.

       The bp IO parameter (if present) specifies the BIO to read
       from or write to.

       The  fp  FILE  parameter  (if  present) specifies the FILE
       pointer to read from or write to.

       The PEM read functions all take an argument TYPE  **x  and
       return  a TYPE * pointer. Where TYPE is whatever structure
       the function uses. If x is  NULL  then  the  parameter  is
       ignored.  If  x is not NULL but *x is NULL then the structure
 returned will be written to *x. If neither x  nor  *x
       is  NULL then an attempt is made to reuse the structure at
       *x (see NOTES and EXAMPLES sections). Irrespective of  the
       value  of x, a pointer to the structure is always returned
       (or NULL if an error occurred).

       The PEM functions which write private  keys  take  an  enc
       parameter which specifies the encryption algorithm to use.
       Encryption is done at the PEM level. If this parameter  is
       set to NULL then the private key is written in unencrypted
       form.

       The cb argument is the callback to use when  querying  for
       the  pass  phrase  used for encrypted PEM structures (normally
 only private keys).

       For the PEM write routines if the kstr  parameter  is  not
       NULL  then  klen  bytes at kstr are used as the passphrase
       and cb is ignored.

       If the cb parameter is set to NULL and the u parameter  is
       not  NULL  then  the  u parameter is interpreted as a null
       terminated string to use as the passphrase. If both cb and
       u are NULL then the default callback routine is used which
       will typically prompt for the passphrase  on  the  current
       terminal with echoing turned off.

       The default passphrase callback is sometimes inappropriate
       (for example in a GUI application) so an  alternative  can
       be  supplied. The callback routine has the following form:
       int cb(char *buf, int size, int rwflag, void *u);  buf  is
       the buffer to write the passphrase to. Size is the maximum
       length of the passphrase (i.e. the size of  buf).   rwflag
       is  a flag which is set to 0 when reading and 1 when writing.
  A typical routine will ask the user  to  verify  the
       passphrase  (for  example  by  prompting  for it twice) if
       rwflag is 1. The u parameter has the same value as  the  u
       parameter  passed  to the PEM routine. It allows arbitrary
       data to be passed to the callback by the application  (for
       example,  a window handle in a GUI application). The callback
  must  return  the  number  of  characters   in   the
       passphrase or 0 if an error occurred.

NOTES    [Toc]    [Back]

       The PEM read routines in some versions of OpenSSL will not
       correctly reuse an existing structure. Therefore the  following
  may not work where x already contains a valid certificate:
 PEM_read_bio(bp, &x, 0, NULL);

       However, the following  is guaranteed to work:

       X509_free(x); x =3D PEM_read_bio(bp, NULL, 0, NULL);

       The old PrivateKey write routines are retained for compatibility.
  New applications should write private keys using
       the PEM_write_bio_PKCS8PrivateKey() or PEM_write_PKCS8PrivateKey()
  routines  because they are more  secure, unless
       compatibility with older versions of OpenSSL is important.
       (They  use  an iteration count of 2048, whereas the traditional
 routines use a count of  1.)  The  PrivateKey  read
       routines can be used in all applications because they handle
 all formats transparently. A frequent cause  of  problems
  is attempting to use the PEM routines in the following
 manner:

       X509 *x; PEM_read_bio_X509(bp, &x, 0, NULL);

       This is a bug because an attempt will be made to reuse the
       data at x which is an uninitialized pointer.

RETURN VALUES    [Toc]    [Back]

       The read routines return either a pointer to the structure
       read or NULL is an error occurred.

       The write routines return 1 for success or 0 for  failure.

EXAMPLES    [Toc]    [Back]

       Although the PEM routines take several arguments in almost
       all applications most of them are set to 0 or NULL.

       Read a certificate in PEM format from a BIO:

       X509 *x; x = PEM_read_bio(bp, NULL, 0,  NULL);  if  (x  ==
       NULL)
              {

              }

       Alternative method:

       X509 *x = NULL; if (!PEM_read_bio_X509(bp, &x, 0, NULL))
              {

              }

       Write a certificate to a BIO:

       if (!PEM_write_bio_X509(bp, x))
              {

              }

       Write an unencrypted private key to a FILE pointer:

       if  (!PEM_write_PrivateKey(fp,  key,  NULL,  NULL,  0,  0,
       NULL))
              {

              }

       Write a private key (using traditional format)  to  a  BIO
       using  triple  DES encryption, the pass phrase is prompted
       for:

       if (!PEM_write_bio_PrivateKey(bp, key, EVP_des_ede3_cbc(),
       NULL, 0, 0, NULL))
              {

              }

       Write  a  private key (using PKCS#8 format) to a BIO using
       triple DES encryption, using the pass phrase ``hello'':

       if        (!PEM_write_bio_PKCS8PrivateKey(bp,         key,
       EVP_des_ede3_cbc(), NULL, 0, 0, "hello"))
              {

              }

       Read  a  private  key  from  a  BIO  using the pass phrase
       ``hello'':

       key = PEM_read_bio_PrivateKey(bp, NULL,  0,  "hello");  if
       (key == NULL)
               {

               }

       Read  a  private  key from a BIO using a pass phrase callback:


       key = PEM_read_bio_PrivateKey(bp, NULL, pass_cb, "My  Private
 Key"); if (key == NULL)
               {

               }

       Skeleton pass phrase callback:

       int pass_cb(char *buf, int size, int rwflag, void *u);
              {
              int len;
              char *tmp;

              printf("Enter pass phrase for \"%s\"\n", u);


              tmp = "hello";
              len = strlen(tmp);

              if (len <= 0) return 0;

              if (len > size) len = size;
              memcpy(buf, tmp, len);
              return len;
              }




                                                           pem(3)
[ Back ]
 Similar pages
Name OS Title
EVP_CIPHER_CTX_iv_length OpenBSD EVP cipher routines
EVP_CIPHER_CTX_iv_length Tru64 EVP cipher routines
EVP_CIPHER_CTX_key_length Tru64 EVP cipher routines
EVP_CIPHER_CTX_mode Tru64 EVP cipher routines
hid_locate NetBSD USB HID access routines
EVP_CIPHER_CTX_nid Tru64 EVP cipher routines
EVP_CIPHER_CTX_set_app_data Tru64 EVP cipher routines
EVP_CIPHER_CTX_set_key_length Tru64 EVP cipher routines
EVP_CIPHER_CTX_type Tru64 EVP cipher routines
EVP_CIPHER_asn1_to_param Tru64 EVP cipher routines
Copyright © 2004-2005 DeniX Solutions SRL
newsletter delivery service