xref: /onnv-gate/usr/src/lib/libkmsagent/common/KMSAgentPKICommon.cpp (revision 12720:3db6e0082404)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 /**
27  * \file KMSAgentPKICommon.cpp
28  */
29 #include <stdio.h>
30 
31 #include "SYSCommon.h"
32 #include "KMSAgentPKICommon.h"
33 #include "KMSAgentStringUtilities.h"
34 
35 #include "KMSAgent_direct.h"
36 
37 
38 //////////////////////////////////////////////////////////////////////
39 // Construction/Destruction
40 //////////////////////////////////////////////////////////////////////
41 
CPKI()42 CPKI::CPKI()
43 {
44    m_iKeyLength = DEFAULT_KEY_SIZE;
45 
46    // used for CA
47    m_pCACertificate = NULL;
48    m_pCAPrivateKey = NULL;
49 }
50 
51 // BEN - make these
52 // global lengths
53 int iLength1 = 0;
54 int iLength2 = 0;
55 
56 // THIS CAN'T BE STACK DATA - TOO BIG
57 static unsigned char aTempBuffer[MAX_CERT_SIZE + MAX_KEY_SIZE];
58 #ifdef METAWARE
59 static char aNotherTempBuffer[50];
60 #endif
61 
62 // used by StoreAgentPKI - KMSAgentStorage.cpp
63 
ExportCertAndKeyToFile(CCertificate * const i_pCertificate,CPrivateKey * const i_pPrivateKey,const char * const i_pcFileName,const char * const i_sPassphrase,EnumPKIFileFormat i_eFileFormat)64 bool CPKI::ExportCertAndKeyToFile(
65    CCertificate* const         i_pCertificate,
66    CPrivateKey*  const         i_pPrivateKey,
67    const char* const           i_pcFileName,
68    const char* const           i_sPassphrase,
69    EnumPKIFileFormat           i_eFileFormat )
70 {
71    FATAL_ASSERT( i_pCertificate && i_pPrivateKey && i_pcFileName );
72 
73 
74    memset( aTempBuffer, 0, MAX_CERT_SIZE + MAX_KEY_SIZE );
75 
76 #ifdef KMSUSERPKCS12
77     if ( i_eFileFormat == FILE_FORMAT_PKCS12 )
78     {
79         if ( !i_pCertificate->SavePKCS12(aTempBuffer,
80                                 MAX_CERT_SIZE,
81                                 &iLength1,
82                                 i_pPrivateKey,
83                                 (char*)i_sPassphrase ) )
84         {
85             return false;
86         }
87     } else {
88 #endif
89 
90    // Overloaded Save method implemented in KMSAgentPKICert.cpp
91    // this method saves Certificate to the temporary buffer, not a file
92    // but a side effect is to get the actual file length
93    if ( !i_pCertificate->Save(aTempBuffer,
94                               MAX_CERT_SIZE,
95                               &iLength1,          /* returned - actual length
96                                                      written */
97                               i_eFileFormat) )
98    {
99       return false;
100    }
101 
102    // Overloaded Save method implemented in KMSAgentPKIKey.cpp
103    // this method saves keys to the temporary buffer, not a file,
104    // but a side effect is to get the actual file length
105    if ( !i_pPrivateKey->Save(aTempBuffer + iLength1,
106                              MAX_KEY_SIZE,
107                              &iLength2,          /* returned - actual length
108                                                     written */
109                              i_sPassphrase,
110                              i_eFileFormat) )
111    {
112       return false;
113    }
114 
115 #ifdef KMSUSERPKCS12
116 	}
117 #endif
118 
119    // now write the temporary buffer to a file
120    myFILE* pFile = fopen( i_pcFileName, "wb" );
121    if ( pFile == NULL )
122    {
123       return false;
124    }
125 
126 #ifdef KMSUSERPKCS12
127 #ifdef K_SOLARIS_PLATFORM
128 	int fd = fileno(pFile);
129 
130 	/* Make sure this file is read/write for the OWNER only! */
131 	(void) fchmod(fd, 0600);
132 #endif
133 #endif
134 
135 #ifdef METAWARE
136    // write out the two file lengths
137    snprintf(aNotherTempBuffer, sizeof(aNotherTempBuffer), "iLength1=%x\n", iLength1);
138    fputs((const char*)aNotherTempBuffer, pFile);
139 
140    snprintf(aNotherTempBuffer, sizeof(aNotherTempBuffer), "iLength2=%x\n", iLength2);
141    fputs((const char*)aNotherTempBuffer, pFile);
142 #endif
143 
144    int iBytesWritten = fwrite( (const char*)aTempBuffer,  // from
145                                1,                         // size
146                                iLength1+iLength2,         // actual file length
147                                pFile );                   // to-file
148 
149    fclose( pFile );
150 
151    return ( iBytesWritten == (iLength1+iLength2) );
152 }
153 
154 
~CPKI()155 CPKI::~CPKI()
156 {
157    // empty
158 }
159 
160