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"
35 #include "SSLRecordInternal.h"
40 #include <utilities/SecIOFormat.h>
43 * Lots of servers fail to provide closure alerts when they disconnect.
44 * For now we'll just accept it as long as it occurs on a clean record boundary
45 * (and the handshake is complete).
47 #define SSL_ALLOW_UNNOTICED_DISCONNECT 1
50 static OSStatus
errorTranslate(int recordErr
)
55 case errSSLRecordInternal
:
56 return errSSLInternal
;
57 case errSSLRecordWouldBlock
:
58 return errSSLWouldBlock
;
59 case errSSLRecordProtocol
:
60 return errSSLProtocol
;
61 case errSSLRecordNegotiation
:
62 return errSSLNegotiation
;
63 case errSSLRecordClosedAbort
:
64 return errSSLClosedAbort
;
65 case errSSLRecordConnectionRefused
:
66 return errSSLConnectionRefused
;
67 case errSSLRecordDecryptionFail
:
68 return errSSLDecryptionFail
;
69 case errSSLRecordBadRecordMac
:
70 return errSSLBadRecordMac
;
71 case errSSLRecordRecordOverflow
:
72 return errSSLRecordOverflow
;
73 case errSSLRecordUnexpectedRecord
:
74 return errSSLUnexpectedRecord
;
76 sslErrorLog("unknown error code returned in sslErrorTranslate: %d\n", recordErr
);
82 * Attempt to encrypt and queue an SSL record.
85 SSLWriteRecord(SSLRecord rec
, SSLContext
*ctx
)
89 err
=errorTranslate(ctx
->recFuncs
->write(ctx
->recCtx
, rec
));
95 sslErrorLog("unexpected error code returned in SSLWriteRecord: %d\n", (int)err
);
103 * Free a record returned by SSLReadRecord.
106 SSLFreeRecord(SSLRecord rec
, SSLContext
*ctx
)
108 return ctx
->recFuncs
->free(ctx
->recCtx
, rec
);
112 * Attempt to read & decrypt an SSL record.
113 * Record content should be freed using SSLFreeRecord
116 SSLReadRecord(SSLRecord
*rec
, SSLContext
*ctx
)
118 return errorTranslate(ctx
->recFuncs
->read(ctx
->recCtx
, rec
));
121 OSStatus
SSLServiceWriteQueue(SSLContext
*ctx
)
123 return errorTranslate(ctx
->recFuncs
->serviceWriteQueue(ctx
->recCtx
));