2 * Copyright (c) 1999-2001,2005-2007,2010-2014 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 * sslRecord.c - Encryption, decryption and MACing of data
28 #include <SecureTransport.h>
30 #include "sslRecord.h"
31 #include "sslMemory.h"
32 #include "sslContext.h"
34 #include "SSLRecordInternal.h"
38 #include <utilities/SecIOFormat.h>
41 * Lots of servers fail to provide closure alerts when they disconnect.
42 * For now we'll just accept it as long as it occurs on a clean record boundary
43 * (and the handshake is complete).
45 #define SSL_ALLOW_UNNOTICED_DISCONNECT 1
48 static OSStatus
errorTranslate(int recordErr
)
53 case errSSLRecordInternal
:
54 return errSSLInternal
;
55 case errSSLRecordWouldBlock
:
56 return errSSLWouldBlock
;
57 case errSSLRecordProtocol
:
58 return errSSLProtocol
;
59 case errSSLRecordNegotiation
:
60 return errSSLNegotiation
;
61 case errSSLRecordClosedAbort
:
62 return errSSLClosedAbort
;
63 case errSSLRecordConnectionRefused
:
64 return errSSLConnectionRefused
;
65 case errSSLRecordDecryptionFail
:
66 return errSSLDecryptionFail
;
67 case errSSLRecordBadRecordMac
:
68 return errSSLBadRecordMac
;
69 case errSSLRecordRecordOverflow
:
70 return errSSLRecordOverflow
;
71 case errSSLRecordUnexpectedRecord
:
72 return errSSLUnexpectedRecord
;
74 sslErrorLog("unknown error code returned in sslErrorTranslate: %d\n", recordErr
);
80 * Attempt to encrypt and queue an SSL record.
83 SSLWriteRecord(SSLRecord rec
, SSLContext
*ctx
)
87 err
=errorTranslate(ctx
->recFuncs
->write(ctx
->recCtx
, rec
));
93 sslErrorLog("unexpected error code returned in SSLWriteRecord: %d\n", (int)err
);
101 * Free a record returned by SSLReadRecord.
104 SSLFreeRecord(SSLRecord rec
, SSLContext
*ctx
)
106 return ctx
->recFuncs
->free(ctx
->recCtx
, rec
);
110 * Attempt to read & decrypt an SSL record.
111 * Record content should be freed using SSLFreeRecord
114 SSLReadRecord(SSLRecord
*rec
, SSLContext
*ctx
)
116 return errorTranslate(ctx
->recFuncs
->read(ctx
->recCtx
, rec
));
119 OSStatus
SSLServiceWriteQueue(SSLContext
*ctx
)
121 return errorTranslate(ctx
->recFuncs
->serviceWriteQueue(ctx
->recCtx
));