X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/80e2389990082500d76eb566d4946be3e786c3ef..d8f41ccd20de16f8ebe2ccc84d47bf1cb2b26bbb:/Security/libsecurity_ssl/lib/symCipher.h diff --git a/Security/libsecurity_ssl/lib/symCipher.h b/Security/libsecurity_ssl/lib/symCipher.h new file mode 100644 index 00000000..01016edf --- /dev/null +++ b/Security/libsecurity_ssl/lib/symCipher.h @@ -0,0 +1,148 @@ +/* + * Copyright (c) 1999-2001,2005-2008,2010-2012,2014 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * symCipher.h - symmetric cipher module + */ + +#ifndef _SYM_CIPHER_H_ +#define _SYM_CIPHER_H_ + +#include +#include +#include "cipherSpecs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define MASTER_SECRET_LEN 48 /* master secret = 3 x MD5 hashes concatenated */ + +/* SSL V2 - mac secret is the size of symmetric key, not digest */ +#define MAX_SYMKEY_SIZE 24 + +typedef enum +{ + streamCipherType, + blockCipherType, + aeadCipherType +} CipherType; + +typedef struct { + SSL_CipherAlgorithm keyAlg; + CipherType cipherType; + uint8_t keySize; /* Sizes are in bytes */ + uint8_t ivSize; + uint8_t blockSize; +} SSLSymmetricCipherParams; + + +/* All symmetric ciphers go thru these callouts. */ +struct SymCipherContext; +typedef struct SymCipherContext *SymCipherContext; + +typedef int (*SSLKeyFunc)( + const SSLSymmetricCipherParams *params, + int encrypting, + uint8_t *key, + uint8_t *iv, + SymCipherContext *cipherCtx); +typedef int (*SSLSetIVFunc)( + const uint8_t *iv, + size_t len, + SymCipherContext cipherCtx); +typedef int (*SSLAddADD)( + const uint8_t *src, + size_t len, + SymCipherContext cipherCtx); +typedef int (*SSLCryptFunc)( + const uint8_t *src, + uint8_t *dest, + size_t len, + SymCipherContext cipherCtx); +typedef int (*SSLFinishFunc)( + SymCipherContext cipherCtx); +typedef int (*SSLAEADDoneFunc)( + uint8_t *mac, + size_t *macLen, + SymCipherContext cipherCtx); + +/* Statically defined description of a symmetric cipher. */ +typedef struct { + SSLKeyFunc initialize; + SSLCryptFunc encrypt; + SSLCryptFunc decrypt; +} Cipher; + +typedef struct { + SSLKeyFunc initialize; + SSLSetIVFunc setIV; + SSLAddADD update; + SSLCryptFunc encrypt; + SSLCryptFunc decrypt; + SSLAEADDoneFunc done; + uint8_t macSize; +} AEADCipher; + + +typedef struct SSLSymmetricCipher { + const SSLSymmetricCipherParams *params; + SSLFinishFunc finish; + union { + const Cipher cipher; /* stream or block cipher type */ + const AEADCipher aead; /* aeadCipherType */ + } c; +} SSLSymmetricCipher; + +extern const SSLSymmetricCipher SSLCipherNull; +extern const SSLSymmetricCipher SSLCipherRC2_40; +extern const SSLSymmetricCipher SSLCipherRC2_128; +extern const SSLSymmetricCipher SSLCipherRC4_40; +extern const SSLSymmetricCipher SSLCipherRC4_128; +extern const SSLSymmetricCipher SSLCipherDES40_CBC; +extern const SSLSymmetricCipher SSLCipherDES_CBC; +extern const SSLSymmetricCipher SSLCipher3DES_CBC; +extern const SSLSymmetricCipher SSLCipherAES_128_CBC; +extern const SSLSymmetricCipher SSLCipherAES_256_CBC; +extern const SSLSymmetricCipher SSLCipherAES_128_GCM; +extern const SSLSymmetricCipher SSLCipherAES_256_GCM; + +/* Those are defined in symCipherParams.c */ +extern const SSLSymmetricCipherParams SSLCipherNullParams; +extern const SSLSymmetricCipherParams SSLCipherRC2_40Params; +extern const SSLSymmetricCipherParams SSLCipherRC2_128Params; +extern const SSLSymmetricCipherParams SSLCipherRC4_40Params; +extern const SSLSymmetricCipherParams SSLCipherRC4_128Params; +extern const SSLSymmetricCipherParams SSLCipherDES40_CBCParams; +extern const SSLSymmetricCipherParams SSLCipherDES_CBCParams; +extern const SSLSymmetricCipherParams SSLCipher3DES_CBCParams; +extern const SSLSymmetricCipherParams SSLCipherAES_128_CBCParams; +extern const SSLSymmetricCipherParams SSLCipherAES_256_CBCParams; +extern const SSLSymmetricCipherParams SSLCipherAES_128_GCMParams; +extern const SSLSymmetricCipherParams SSLCipherAES_256_GCMParams; + +#ifdef __cplusplus +} +#endif + +#endif /* _SYM_CIPHER_H_ */