#ifndef _SYM_CIPHER_H_
#define _SYM_CIPHER_H_
#include <sys/types.h>
#include <stdint.h>
#include "cipherSpecs.h"
#ifdef __cplusplus
extern "C" {
#endif
#define MASTER_SECRET_LEN 48
#define MAX_SYMKEY_SIZE 24
typedef enum
{
streamCipherType,
blockCipherType,
aeadCipherType
} CipherType;
typedef struct {
SSL_CipherAlgorithm keyAlg;
CipherType cipherType;
uint8_t keySize;
uint8_t ivSize;
uint8_t blockSize;
} SSLSymmetricCipherParams;
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);
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;
const AEADCipher aead;
} 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;
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