mbedTLS 2.x support
[umurmur.git] / src / crypt.c
index a7eda5747e8922a21cae7e85667d17c2afffd235..4b1b4f4261af769c09cb7b741eb6c6b29ac5b64d 100644 (file)
@@ -1,5 +1,5 @@
-/* Copyright (C) 2009, Martin Johansson <martin@fatbob.nu>
-   Copyright (C) 2005-2009, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2014, Martin Johansson <martin@fatbob.nu>
+   Copyright (C) 2005-2014, Thorvald Natvig <thorvald@natvig.com>
 
    All rights reserved.
 
 #include <string.h>
 #include <arpa/inet.h>
 #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 <byteswap.h>
-#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<<SHIFTBITS);
-
-
 static void inline XOR(subblock *dst, const subblock *a, const subblock *b) {
        int i;
        for (i=0;i<BLOCKSIZE;i++) {
@@ -257,20 +239,17 @@ static void inline ZERO(subblock *block) {
                block[i]=0;
 }
 
-#define AESencrypt(src,dst,key) AES_encrypt((unsigned char *)(src),(unsigned char *)(dst), key);
-#define AESdecrypt(src,dst,key) AES_decrypt((unsigned char *)(src),(unsigned char *)(dst), key);
-
 void CryptState_ocb_encrypt(cryptState_t *cs, const unsigned char *plain, unsigned char *encrypted, 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 *)(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);
 }