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