X-Git-Url: http://git.code-monkey.de/?p=umurmur.git;a=blobdiff_plain;f=src%2Fcrypt.c;h=4b1b4f4261af769c09cb7b741eb6c6b29ac5b64d;hp=7d370d0ee11c8f74d24a982ff9fdf9099f1eeba3;hb=6fb422b7cbb94a2b8063c6df630b04184414b633;hpb=5191e1cb38d24ebf5c180ac7911893ca8bc4031f diff --git a/src/crypt.c b/src/crypt.c index 7d370d0..4b1b4f4 100644 --- a/src/crypt.c +++ b/src/crypt.c @@ -1,5 +1,5 @@ -/* Copyright (C) 2010, Martin Johansson - Copyright (C) 2005-2010, Thorvald Natvig +/* Copyright (C) 2009-2014, Martin Johansson + Copyright (C) 2005-2014, Thorvald Natvig All rights reserved. @@ -41,7 +41,12 @@ #include #include #include "crypt.h" -#include "log.h" +#include "ssl.h" + +#if defined(USE_POLARSSL_HAVEGE) || defined(USE_MBEDTLS_HAVEGE) +extern havege_state hs; +#endif + static void CryptState_ocb_encrypt(cryptState_t *cs, const unsigned char *plain, unsigned char *encrypted, unsigned int len, const unsigned char *nonce, unsigned char *tag); static void CryptState_ocb_decrypt(cryptState_t *cs, const unsigned char *encrypted, unsigned char *plain, unsigned int len, const unsigned char *nonce, unsigned char *tag); @@ -63,12 +68,15 @@ bool_t CryptState_isValid(cryptState_t *cs) return cs->bInit; } -void CryptState_genKey(cryptState_t *cs) { - RAND_bytes(cs->raw_key, AES_BLOCK_SIZE); - RAND_bytes(cs->encrypt_iv, AES_BLOCK_SIZE); - RAND_bytes(cs->decrypt_iv, AES_BLOCK_SIZE); - AES_set_encrypt_key(cs->raw_key, 128, &cs->encrypt_key); - AES_set_decrypt_key(cs->raw_key, 128, &cs->decrypt_key); +void CryptState_genKey(cryptState_t *cs) +{ + CRYPT_RANDOM_BYTES(&cs->raw_key, AES_BLOCK_SIZE); + CRYPT_RANDOM_BYTES(&cs->encrypt_iv, AES_BLOCK_SIZE); + CRYPT_RANDOM_BYTES(&cs->decrypt_iv, AES_BLOCK_SIZE); + + CRYPT_SET_ENC_KEY(&cs->encrypt_key, cs->raw_key, 128); + CRYPT_SET_DEC_KEY(&cs->decrypt_key, cs->raw_key, 128); + cs->bInit = true; } @@ -77,8 +85,10 @@ void CryptState_setKey(cryptState_t *cs, const unsigned char *rkey, const unsign memcpy(cs->raw_key, rkey, AES_BLOCK_SIZE); memcpy(cs->encrypt_iv, eiv, AES_BLOCK_SIZE); memcpy(cs->decrypt_iv, div, AES_BLOCK_SIZE); - AES_set_encrypt_key(cs->raw_key, 128, &cs->encrypt_key); - AES_set_decrypt_key(cs->raw_key, 128, &cs->decrypt_key); + + CRYPT_SET_ENC_KEY(&cs->encrypt_key, cs->decrypt_iv, 128); + CRYPT_SET_DEC_KEY(&cs->decrypt_key, cs->raw_key, 128); + cs->bInit = true; } @@ -200,34 +210,6 @@ bool_t CryptState_decrypt(cryptState_t *cs, const unsigned char *source, unsigne return true; } -#if defined(__LP64__) -#define BLOCKSIZE 2 -#define SHIFTBITS 63 -typedef uint64_t subblock; - -#if __BYTE_ORDER == __BIG_ENDIAN -#define SWAPPED(x) (x) -#else -#ifdef __x86_64__ -#define SWAPPED(x) ({register uint64_t __out, __in = (x); __asm__("bswap %q0" : "=r"(__out) : "0"(__in)); __out;}) -#else -#include -#define SWAPPED(x) bswap_64(x) -#endif -#endif - -#else - -#define BLOCKSIZE 4 -#define SHIFTBITS 31 -typedef uint32_t subblock; -#define SWAPPED(x) htonl(x) - -#endif - -#define HIGHBIT (1<encrypt_key); + CRYPT_AES_ENCRYPT(nonce, delta, cs); ZERO(checksum); while (len > AES_BLOCK_SIZE) { S2(delta); XOR(tmp, delta, (const subblock *)(plain)); - AESencrypt(tmp, tmp, &cs->encrypt_key); + CRYPT_AES_ENCRYPT(tmp, tmp, cs); XOR((subblock *)(encrypted), delta, tmp); XOR(checksum, checksum, (subblock *)(plain)); len -= AES_BLOCK_SIZE; @@ -282,7 +261,7 @@ void CryptState_ocb_encrypt(cryptState_t *cs, const unsigned char *plain, unsign ZERO(tmp); tmp[BLOCKSIZE - 1] = SWAPPED(len * 8); XOR(tmp, tmp, delta); - AESencrypt(tmp, pad, &cs->encrypt_key); + CRYPT_AES_ENCRYPT(tmp, pad, cs); memcpy(tmp, plain, len); memcpy((unsigned char *)tmp + len, (unsigned char *)pad + len, AES_BLOCK_SIZE - len); XOR(checksum, checksum, tmp); @@ -291,20 +270,19 @@ void CryptState_ocb_encrypt(cryptState_t *cs, const unsigned char *plain, unsign S3(delta); XOR(tmp, delta, checksum); - AESencrypt(tmp, tag, &cs->encrypt_key); + CRYPT_AES_ENCRYPT(tmp, tag, cs); } void CryptState_ocb_decrypt(cryptState_t *cs, const unsigned char *encrypted, unsigned char *plain, unsigned int len, const unsigned char *nonce, unsigned char *tag) { subblock checksum[BLOCKSIZE], delta[BLOCKSIZE], tmp[BLOCKSIZE], pad[BLOCKSIZE]; - // Initialize - AESencrypt(nonce, delta, &cs->encrypt_key); + CRYPT_AES_ENCRYPT(nonce, delta, cs); ZERO(checksum); while (len > AES_BLOCK_SIZE) { S2(delta); XOR(tmp, delta, (const subblock *)(encrypted)); - AESdecrypt(tmp, tmp, &cs->decrypt_key); + CRYPT_AES_DECRYPT(tmp, tmp, cs); XOR((subblock *)(plain), delta, tmp); XOR(checksum, checksum, (const subblock *)(plain)); len -= AES_BLOCK_SIZE; @@ -316,7 +294,7 @@ void CryptState_ocb_decrypt(cryptState_t *cs, const unsigned char *encrypted, un ZERO(tmp); tmp[BLOCKSIZE - 1] = SWAPPED(len * 8); XOR(tmp, tmp, delta); - AESencrypt(tmp, pad, &cs->encrypt_key); + CRYPT_AES_ENCRYPT(tmp, pad, cs); memset(tmp, 0, AES_BLOCK_SIZE); memcpy(tmp, encrypted, len); XOR(tmp, tmp, pad); @@ -325,5 +303,5 @@ void CryptState_ocb_decrypt(cryptState_t *cs, const unsigned char *encrypted, un S3(delta); XOR(tmp, delta, checksum); - AESencrypt(tmp, tag, &cs->encrypt_key); + CRYPT_AES_ENCRYPT(tmp, tag, cs); }