2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
22 Contains: Private SSL typedefs: SSLContext and its components
24 Written by: Doug Mitchell
26 Copyright: (c) 1999 by Apple Computer, Inc., all rights reserved.
30 #ifndef _SSLCONTEXT_H_
31 #define _SSLCONTEXT_H_ 1
33 #include <Security/SecureTransport.h>
34 #include "sslBuildFlags.h"
35 #include <Security/cssmtype.h>
47 SSLConnectionRef ioRef
;
51 * An element in a certificate chain.
53 typedef struct SSLCertificate
55 struct SSLCertificate
*next
;
59 #include "cryptType.h"
62 * An SSLContext contains four of these - one for each of {read,write} and for
68 const HashHmacReference
*macRef
; /* HMAC (TLS) or digest (SSL) */
69 const SSLSymmetricCipher
*symCipher
;
71 /* this is a context which is reused once per record */
72 HashHmacContext macCtx
;
75 * symKey is obtained from the CSP at cspHand. Normally this
76 * cspHand is the same as ctx->cspHand; some day they might differ.
77 * Code which deals with this struct doesn't ever have to
78 * attach or detach from cspHand - that's taken care of at the
82 CSSM_CSP_HANDLE cspHand
;
83 CSSM_CC_HANDLE ccHand
;
85 /* needed in CDSASymmInit */
88 sslUint64 sequenceNum
;
91 /* in SSL2 mode, the macSecret is the same size as the
92 * cipher key - which is 24 bytes in the 3DES case. */
93 uint8 macSecret
[MAX_SYMKEY_SIZE
];
95 /* typedef in cryptType.h */
97 #include "sslHandshake.h"
99 typedef struct WaitingRecord
100 { struct WaitingRecord
*next
;
105 typedef struct DNListElem
106 { struct DNListElem
*next
;
115 * For the first two, SSL_Version_Undetermined means "get the best we
116 * can, up to macProtocolVersion".
118 SSLProtocolVersion reqProtocolVersion
; /* requested by app */
119 SSLProtocolVersion negProtocolVersion
; /* negotiated */
120 SSLProtocolVersion maxProtocolVersion
; /* max allowed by app */
121 SSLProtocolSide protocolSide
;
122 const struct _SslTlsCallouts
*sslTslCalls
; /* selects between SSLv3 and TLSv1 */
124 /* crypto state in CDSA-centric terms */
126 CSSM_KEY_PTR signingPrivKey
;/* our private signing key */
127 CSSM_KEY_PTR signingPubKey
; /* our public signing key */
128 CSSM_CSP_HANDLE signingKeyCsp
; /* associated DL/CSP */
129 #if ST_KC_KEYS_NEED_REF
130 SecKeychainRef signingKeyRef
; /* for signingPrivKey */
132 void *signingKeyRef
; /* TBD */
133 #endif /* ST_KC_KEYS_NEED_REF */
135 CSSM_KEY_PTR encryptPrivKey
;/* our private encrypt key, for
136 * server-initiated key exchange */
137 CSSM_KEY_PTR encryptPubKey
; /* public version of above */
138 CSSM_CSP_HANDLE encryptKeyCsp
;
139 #if ST_KC_KEYS_NEED_REF
140 SecKeychainRef encryptKeyRef
; /* for signingPrivKey */
142 void *encryptKeyRef
; /* TBD */
143 #endif /* ST_KC_KEYS_NEED_REF */
145 CSSM_KEY_PTR peerPubKey
;
146 CSSM_CSP_HANDLE peerPubKeyCsp
; /* may not be needed, we figure this
147 * one out by trial&error, right? */
150 * Various cert chains.
151 * For all three, the root is the first in the chain.
153 SSLCertificate
*localCert
;
154 SSLCertificate
*encryptCert
;
155 SSLCertificate
*peerCert
;
158 * trusted root certs; specific to this implementation, we'll store
159 * them conveniently...these will be used as AnchorCerts in a TP
162 uint32 numTrustedCerts
;
163 CSSM_DATA_PTR trustedCerts
;
166 * Keychain to which newly encountered root certs are attempted
167 * to be added. AccessCreds untyped for now.
169 #if ST_MANAGES_TRUSTED_ROOTS
170 SecKeychainRef newRootCertKc
;
172 #endif /* ST_MANAGES_TRUSTED_ROOTS */
174 /* for symmetric cipher and RNG */
175 CSSM_CSP_HANDLE cspHand
;
177 /* session-wide handles for Apple TP, CL */
178 CSSM_TP_HANDLE tpHand
;
179 CSSM_CL_HANDLE clHand
;
181 /* FIXME - how will we represent this? */
185 Boolean allowExpiredCerts
;
186 Boolean allowExpiredRoots
;
187 Boolean enableCertVerify
;
191 SSLBuffer dhPeerPublic
;
192 SSLBuffer dhExchangePublic
;
196 SSLBuffer resumableSession
;
198 char *peerDomainName
;
199 UInt32 peerDomainNameLen
;
201 CipherContext readCipher
;
202 CipherContext writeCipher
;
203 CipherContext readPending
;
204 CipherContext writePending
;
206 uint16 selectedCipher
; /* currently selected */
207 const SSLCipherSpec
*selectedCipherSpec
; /* ditto */
208 SSLCipherSpec
*validCipherSpecs
; /* context's valid specs */
209 unsigned numValidCipherSpecs
; /* size of validCipherSpecs */
210 SSLHandshakeState state
;
212 /* server-side only */
213 SSLAuthenticate clientAuth
; /* kNeverAuthenticate, etc. */
214 Boolean tryClientAuth
;
216 /* client and server */
217 SSLClientCertificateState clientCertState
;
219 DNListElem
*acceptableDNList
;
226 uint8 clientRandom
[SSL_CLIENT_SRVR_RAND_SIZE
];
227 uint8 serverRandom
[SSL_CLIENT_SRVR_RAND_SIZE
];
228 SSLBuffer preMasterSecret
;
229 uint8 masterSecret
[SSL_MASTER_SECRET_SIZE
];
231 /* running digests of all handshake messages */
232 SSLBuffer shaState
, md5State
;
234 SSLBuffer fragmentedMessageCache
;
236 unsigned ssl2ChallengeLength
;
237 unsigned ssl2ConnectionIDLength
;
238 unsigned ssl2SessionMatch
;
240 /* Record layer fields */
241 SSLBuffer partialReadBuffer
;
244 /* Transport layer fields */
245 WaitingRecord
*recordWriteQueue
;
246 SSLBuffer receivedDataBuffer
;
247 uint32 receivedDataPos
;
249 Boolean allowAnyRoot
; // don't require known roots
256 #endif /* _SSLCONTEXT_H_ */