diff usr/src/lib/libkmsagent/common/KMSAgentPKICommon.h @ 12720:3db6e0082404

PSARC 2010/195 PKCS11 KMS Provider 6944296 Solaris needs a PKCS#11 provider to allow access to KMS keystore functionality
author Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
date Mon, 28 Jun 2010 16:04:11 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/lib/libkmsagent/common/KMSAgentPKICommon.h	Mon Jun 28 16:04:11 2010 -0700
@@ -0,0 +1,293 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ */
+
+/*-------------------------------------------------------------------------*/
+/**
+ * \file KMSAgentPKICommon.h
+ *
+ * X.509 Certificate and Private Key Support Interface
+ *
+ * This module provides simple interfaces to support SSL communication
+ * for the KMS Agent enrollment protocol.  Basic classes supporting 
+ * X.509 certificates, private key management are provided and hide
+ * specific implementations from users of these classes.
+ */
+/*-------------------------------------------------------------------------*/
+
+#ifndef K_KMSAgentPKICommon_h
+#define K_KMSAgentPKICommon_h
+
+#ifdef WIN32
+#pragma warning(disable: 4786)
+#endif
+
+#define MAX_CERT_SIZE                                       4096
+#define MAX_KEY_SIZE                                        4096
+
+#define DEFAULT_KEY_SIZE                                    2048
+
+#ifdef KMSUSERPKCS12
+enum EnumPKIFileFormat { FILE_FORMAT_DER, FILE_FORMAT_PEM, FILE_FORMAT_PKCS12 };
+#else
+enum EnumPKIFileFormat { FILE_FORMAT_DER, FILE_FORMAT_PEM };
+#endif
+
+/**
+ *   This class provides a simple interface for the management of
+ *   public keys.  Simple load and store operations are provided for
+ *   storage and retrieval from memory buffers.
+ */
+class CPublicKey
+{
+
+public:
+
+	CPublicKey();
+
+	/**
+     * This method saves public key into a buffer,
+     * it also returns the actual used buffer length.
+     * @param i_pcBuffer Buffer to receive public key
+     * @param i_iBufferLength length of the buffer provided
+     * @param o_pActualLength actual length of the public key stored into the buffer
+     * @param i_iFormat key format, @see EnumPKIFileFormat
+     */
+    bool Save(unsigned char * const i_pcBuffer, 
+            int                     i_iBufferLength, 
+            int * const             o_pActualLength,
+			int                     i_iFormat);
+   /**
+     *  This method loads the public key from a buffer
+     *  @param i_pcBuffer
+     *  @param i_iLength
+     *  @param i_iFormat   one of the enums from EnumPKIFileFormat,
+     *                     only FILE_FORMAT_PEM is supported.
+     *  @return true for success, false otherwise
+     */
+    bool Load (unsigned char * const i_pcBuffer,
+               int i_iLength,
+               int i_iFormat);
+    
+   /**
+     *   use this object's public key to encrypt plaintext buffer
+     */
+    bool Encrypt (int i_iLength,
+                  const unsigned char * const i_pcPlainText,
+                  unsigned char * const o_pcCypherText,
+                  int * const o_pActualLength);
+    
+    ~CPublicKey();
+
+private:
+   void *m_pPublicKeyImpl;
+};
+
+/**
+ *   This class provides a simple interface for the management of
+ *   private keys.  Simple load and store operations are provided for
+ *   storage and retrieval from memory buffers.
+ *
+ */
+class CPrivateKey
+{
+
+  public:
+
+   CPrivateKey();
+    
+   /**
+    *   Saves the private key to a memory buffer specified by
+    *   i_pcBuffer. Currently just the PEM format is supported.
+    *   Specification of a passphrase allows encryption of the private
+    *   key subject to the choice of the implementation.
+    *
+    *   @param[in]   i_pcBuffer
+    *   @param[in]   i_iBufferLength
+    *   @param[out]  o_pActualLength
+    *   @param[in]   i_pPassphrase optional, if non-null the private key is
+    *   wrapped using this passphrase
+    *   @param[in]   i_iFormat   one of the enums from EnumPKIFileFormat,
+    *                      only FILE_FORMAT_PEM is supported.
+    *   @return true for success, false otherwise
+    */
+   bool Save( unsigned char * const      i_pcBuffer, 
+              int                        i_iBufferLength,
+              int * const                o_pActualLength,
+              const char * const         i_pPassphrase, 
+              int                        i_iFormat );
+
+   /**
+    *  This method loads the private key from a buffer
+    *  @param i_pcBuffer
+    *  @param i_iLength
+    *  @param i_pPassphrase optional, if non-null the private key is
+    *   unwrapped using this passphrase
+    *  @param i_iFormat   one of the enums from EnumPKIFileFormat,
+    *                     only FILE_FORMAT_PEM is supported.
+    *  @return true for success, false otherwise
+    */
+   bool Load(unsigned char * const i_pcBuffer,
+             int                   i_iLength,
+             const char * const    i_pPassphrase,
+             int                   i_iFormat);
+
+   ~CPrivateKey();
+
+#ifdef KMSUSERPKCS12
+	void *GetNative();
+	void SetNative(void *);
+#endif
+  private:
+   void *m_pPKeyImpl;
+
+};
+
+/**
+ *   This class provides a simple interface for managing X.509
+ *   certificates providing only simple load and save operations for
+ *   storage and retrieval.
+ *
+ */
+class CCertificate
+{
+
+public:
+	CCertificate();
+
+	~CCertificate();
+    
+    /**
+     *   save the certificate to the specified file name. Currently,
+     *   only FILE_FORMAT_PEM is supported.
+     */
+	bool Save(  const char * const  i_pcFileName, 
+                int                 i_iFormat);
+
+    /**
+     *  save the certificate to the specified buffer. Currently, only
+     *  FILE_FORMAT_PEM is supported.
+     */      
+	bool Save( unsigned char * const i_pcBuffer,
+               int                   i_iBufferLength,
+               int * const           o_pActualLength,
+               int                   i_iFormat);
+
+    /**
+     *   load a certificate from the specified filename. Currently,
+     *   only FILE_FORMAT_PEM is supported.
+     */      
+    bool Load( const char * const i_pcFileName, 
+               int                i_iFormat );
+
+    /**
+     *   load a certificate from the specified buffer. Currently, only
+     *   FILE_FORMAT_PEM is supported.
+     */          
+    bool Load( unsigned char * const i_pcBuffer,
+               int                   i_iLength,
+               int                   i_iFormat );
+
+    /**
+     *   prints the certificate to stdout
+     */          
+    bool Dump();
+        
+#ifdef KMSUSERPKCS12
+	bool LoadPKCS12CertAndKey(char *filename,
+		int i_iFormat,
+		CPrivateKey *i_pPrivateKey,
+		char *i_pPassphrase);
+
+	bool SavePKCS12(
+	    unsigned char *i_pcBuffer,
+	    int i_iBufferLength,
+	    int *o_pActualLength,
+	    CPrivateKey* i_pPrivateKey,
+	    char* i_sPassphrase );
+#endif
+
+private:
+    /**
+     *  an opague pointer to implementation specific resources to be
+     *  freed by the Destructor.
+     */
+    void    *m_pCertImpl;
+#ifdef KMSUSERPKCS12
+    /**
+     * saves certificate to PKCS#12 memory BIO
+     * @param i_pPrivateKey
+     * @param i_sPassphrase
+     * @return pointer to the Memory BIO
+     */
+    void* SaveCertToPKCS12MemoryBIO(
+            CPrivateKey* i_pPrivateKey,
+            char *i_sPassphrase);
+#endif
+
+};
+
+
+/**
+ *  This class provides a method for storing an X.509 certificate and
+ *  private key to a file.  The private key is appended to the
+ *  certificate and optionally encrypted with the specified passphrase
+ *  for encoding and storage in PEM format.
+ */
+class CPKI
+{
+  public:
+   CPKI();
+   ~CPKI();
+
+  public:
+
+      /**
+       *   exports a certificate and associated private key to the
+       *   specified file.
+       *   @param i_pCertificate a pointer to an instance of a certificate
+       *   @param i_pPrivateKey  a pointer to an instance of a private key 
+       *   @param i_pcFileName  the name of the file to store the cert and private key
+       *   @param i_sPassphrase optional but when provided supplies a
+       *   pass phrase to use for encrypting the private key.  The cipher
+       *   used for encryption is determined by the underlying implementation 
+       *   which for the reference implementation uses triple DES by default.
+       *   @param i_eFileFormat the encoding format to use for the certificate and private key
+       */
+      bool ExportCertAndKeyToFile(
+            CCertificate* const         i_pCertificate,  
+            CPrivateKey*  const         i_pPrivateKey,
+            const char* const           i_pcFileName,
+            const char* const           i_sPassphrase,
+            EnumPKIFileFormat           i_eFileFormat );
+
+  private:
+
+   int m_iKeyLength;
+
+   CCertificate *m_pCACertificate;
+   CPrivateKey *m_pCAPrivateKey;
+ };
+
+#endif  //K_KMSAgentPKICommon_h