2 * Copyright (c) 2002,2005-2007,2010-2011 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
25 * tls_record.h - Declarations of record layer callout struct to provide indirect calls to
26 * SSLv3 and TLS routines.
29 #ifndef _TLS_RECORD_H_
30 #define _TLS_RECORD_H_
36 // #include "sslRecord.h"
39 #include "cryptType.h"
40 #include "sslMemory.h"
41 #include "SSLRecordInternal.h"
43 struct SSLRecordInternalContext
;
46 *** Each of {TLS, SSLv3} implements each of these functions.
49 /* unpack, decrypt, validate one record */
50 typedef int (*decryptRecordFcn
) (
53 struct SSLRecordInternalContext
*ctx
);
55 /* pack, encrypt, mac, queue one outgoing record */
56 typedef int (*writeRecordFcn
) (
58 struct SSLRecordInternalContext
*ctx
);
60 /* initialize a per-CipherContext HashHmacContext for use in MACing each record */
61 typedef int (*initMacFcn
) (
62 CipherContext
*cipherCtx
// macRef, macSecret valid on entry
63 // macCtx valid on return
66 /* free per-CipherContext HashHmacContext */
67 typedef int (*freeMacFcn
) (
68 CipherContext
*cipherCtx
);
70 /* compute MAC on one record */
71 typedef int (*computeMacFcn
) (
74 SSLBuffer mac
, // caller mallocs data
75 CipherContext
*cipherCtx
, // assumes macCtx, macRef
77 struct SSLRecordInternalContext
*ctx
);
80 typedef struct _SslRecordCallouts
{
81 decryptRecordFcn decryptRecord
;
82 writeRecordFcn writeRecord
;
85 computeMacFcn computeMac
;
89 /* From ssl3RecordCallouts.c and tls1RecordCallouts.c */
90 extern const SslRecordCallouts Ssl3RecordCallouts
;
91 extern const SslRecordCallouts Tls1RecordCallouts
;
93 /* one callout routine used in common (for now) */
96 struct SSLRecordInternalContext
*ctx
);
99 typedef struct WaitingRecord
100 { struct WaitingRecord
*next
;
103 * These two fields replace a dynamically allocated SSLBuffer;
104 * the payload to write is contained in the variable-length
112 const HashHmacReference
*macAlgorithm
;
113 const SSLSymmetricCipher
*cipher
;
114 } SSLRecordCipherSpec
;
118 struct SSLRecordInternalContext
122 SSLIOWriteFunc write
;
123 SSLIOConnectionRef ioRef
;
126 SSLBuffer partialReadBuffer
;
128 WaitingRecord
*recordWriteQueue
;
131 uint16_t selectedCipher
; /* currently selected */
132 SSLRecordCipherSpec selectedCipherSpec
; /* ditto */
133 CipherContext readCipher
;
134 CipherContext writeCipher
;
135 CipherContext readPending
;
136 CipherContext writePending
;
137 CipherContext prevCipher
; /* previous write cipher context, used for retransmit */
141 SSLProtocolVersion negProtocolVersion
; /* negotiated */
142 const SslRecordCallouts
*sslTslCalls
;
146 /* Function called from the ssl3/tls1 callouts */
152 struct SSLRecordInternalContext
*ctx
);
158 #endif /* _TLS_SSL_H_ */