change rabbit and hc128 to return values for key and process, will add error rets for alignment issues
This commit is contained in:
parent
f601b7bfda
commit
14b4bb3b0f
@ -259,7 +259,7 @@ static void Hc128_SetIV(HC128* ctx, const byte* iv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Hc128_SetKey(HC128* ctx, const byte* key, const byte* iv)
|
int Hc128_SetKey(HC128* ctx, const byte* key, const byte* iv)
|
||||||
{
|
{
|
||||||
word32 i;
|
word32 i;
|
||||||
|
|
||||||
@ -270,11 +270,13 @@ void Hc128_SetKey(HC128* ctx, const byte* key, const byte* iv)
|
|||||||
for ( ; i < 8 ; i++) ctx->key[i] = ctx->key[i-4];
|
for ( ; i < 8 ; i++) ctx->key[i] = ctx->key[i-4];
|
||||||
|
|
||||||
Hc128_SetIV(ctx, iv);
|
Hc128_SetIV(ctx, iv);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The following defines the encryption of data stream */
|
/* The following defines the encryption of data stream */
|
||||||
void Hc128_Process(HC128* ctx, byte* output, const byte* input, word32 msglen)
|
int Hc128_Process(HC128* ctx, byte* output, const byte* input, word32 msglen)
|
||||||
{
|
{
|
||||||
word32 i, keystream[16];
|
word32 i, keystream[16];
|
||||||
|
|
||||||
@ -318,6 +320,7 @@ void Hc128_Process(HC128* ctx, byte* output, const byte* input, word32 msglen)
|
|||||||
output[i] = input[i] ^ ((byte*)keystream)[i];
|
output[i] = input[i] ^ ((byte*)keystream)[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ static void RabbitSetIV(Rabbit* ctx, const byte* iv)
|
|||||||
|
|
||||||
|
|
||||||
/* Key setup */
|
/* Key setup */
|
||||||
void RabbitSetKey(Rabbit* ctx, const byte* key, const byte* iv)
|
int RabbitSetKey(Rabbit* ctx, const byte* key, const byte* iv)
|
||||||
{
|
{
|
||||||
/* Temporary variables */
|
/* Temporary variables */
|
||||||
word32 k0, k1, k2, k3, i;
|
word32 k0, k1, k2, k3, i;
|
||||||
@ -182,12 +182,14 @@ void RabbitSetKey(Rabbit* ctx, const byte* key, const byte* iv)
|
|||||||
}
|
}
|
||||||
ctx->workCtx.carry = ctx->masterCtx.carry;
|
ctx->workCtx.carry = ctx->masterCtx.carry;
|
||||||
|
|
||||||
if (iv) RabbitSetIV(ctx, iv);
|
if (iv) RabbitSetIV(ctx, iv);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Encrypt/decrypt a message of any size */
|
/* Encrypt/decrypt a message of any size */
|
||||||
void RabbitProcess(Rabbit* ctx, byte* output, const byte* input, word32 msglen)
|
int RabbitProcess(Rabbit* ctx, byte* output, const byte* input, word32 msglen)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Encrypt/decrypt all full blocks */
|
/* Encrypt/decrypt all full blocks */
|
||||||
@ -239,6 +241,8 @@ void RabbitProcess(Rabbit* ctx, byte* output, const byte* input, word32 msglen)
|
|||||||
output[i] = input[i] ^ buffer[i]; /* scan-build thinks buffer[i] */
|
output[i] = input[i] ^ buffer[i]; /* scan-build thinks buffer[i] */
|
||||||
/* is garbage, it is not! */
|
/* is garbage, it is not! */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,8 +47,8 @@ typedef struct HC128 {
|
|||||||
} HC128;
|
} HC128;
|
||||||
|
|
||||||
|
|
||||||
CYASSL_API void Hc128_Process(HC128*, byte*, const byte*, word32);
|
CYASSL_API int Hc128_Process(HC128*, byte*, const byte*, word32);
|
||||||
CYASSL_API void Hc128_SetKey(HC128*, const byte* key, const byte* iv);
|
CYASSL_API int Hc128_SetKey(HC128*, const byte* key, const byte* iv);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -52,8 +52,8 @@ typedef struct Rabbit {
|
|||||||
} Rabbit;
|
} Rabbit;
|
||||||
|
|
||||||
|
|
||||||
CYASSL_API void RabbitProcess(Rabbit*, byte*, const byte*, word32);
|
CYASSL_API int RabbitProcess(Rabbit*, byte*, const byte*, word32);
|
||||||
CYASSL_API void RabbitSetKey(Rabbit*, const byte* key, const byte* iv);
|
CYASSL_API int RabbitSetKey(Rabbit*, const byte* key, const byte* iv);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -3522,17 +3522,20 @@ static INLINE int Encrypt(CYASSL* ssl, byte* out, const byte* input, word32 sz)
|
|||||||
case hc128:
|
case hc128:
|
||||||
#ifdef XSTREAM_ALIGNMENT
|
#ifdef XSTREAM_ALIGNMENT
|
||||||
if ((word)input % 4) {
|
if ((word)input % 4) {
|
||||||
|
int hcRet;
|
||||||
byte* tmp = (byte*)XMALLOC(sz, ssl->heap,
|
byte* tmp = (byte*)XMALLOC(sz, ssl->heap,
|
||||||
DYNAMIC_TYPE_TMP_BUFFER);
|
DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
if (tmp == NULL) return MEMORY_E;
|
if (tmp == NULL) return MEMORY_E;
|
||||||
XMEMCPY(tmp, input, sz);
|
XMEMCPY(tmp, input, sz);
|
||||||
Hc128_Process(ssl->encrypt.hc128, tmp, tmp, sz);
|
ret = Hc128_Process(ssl->encrypt.hc128, tmp, tmp, sz);
|
||||||
XMEMCPY(out, tmp, sz);
|
XMEMCPY(out, tmp, sz);
|
||||||
XFREE(tmp, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(tmp, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
|
||||||
|
return ret;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
Hc128_Process(ssl->encrypt.hc128, out, input, sz);
|
return Hc128_Process(ssl->encrypt.hc128, out, input, sz);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -3540,13 +3543,16 @@ static INLINE int Encrypt(CYASSL* ssl, byte* out, const byte* input, word32 sz)
|
|||||||
case rabbit:
|
case rabbit:
|
||||||
#ifdef XSTREAM_ALIGNMENT
|
#ifdef XSTREAM_ALIGNMENT
|
||||||
if ((word)input % 4) {
|
if ((word)input % 4) {
|
||||||
|
int rabRet;
|
||||||
byte* tmp = (byte*)XMALLOC(sz, ssl->heap,
|
byte* tmp = (byte*)XMALLOC(sz, ssl->heap,
|
||||||
DYNAMIC_TYPE_TMP_BUFFER);
|
DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
if (tmp == NULL) return MEMORY_E;
|
if (tmp == NULL) return MEMORY_E;
|
||||||
XMEMCPY(tmp, input, sz);
|
XMEMCPY(tmp, input, sz);
|
||||||
RabbitProcess(ssl->encrypt.rabbit, tmp, tmp, sz);
|
rabRet = RabbitProcess(ssl->encrypt.rabbit, tmp, tmp, sz);
|
||||||
XMEMCPY(out, tmp, sz);
|
XMEMCPY(out, tmp, sz);
|
||||||
XFREE(tmp, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(tmp, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
|
||||||
|
return ret;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -3682,7 +3688,7 @@ static INLINE int Decrypt(CYASSL* ssl, byte* plain, const byte* input,
|
|||||||
|
|
||||||
#ifdef HAVE_HC128
|
#ifdef HAVE_HC128
|
||||||
case hc128:
|
case hc128:
|
||||||
Hc128_Process(ssl->decrypt.hc128, plain, input, sz);
|
return Hc128_Process(ssl->decrypt.hc128, plain, input, sz);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
38
src/keys.c
38
src/keys.c
@ -1452,6 +1452,7 @@ static int SetKeys(Ciphers* enc, Ciphers* dec, Keys* keys, CipherSpecs* specs,
|
|||||||
|
|
||||||
#ifdef HAVE_HC128
|
#ifdef HAVE_HC128
|
||||||
if (specs->bulk_cipher_algorithm == hc128) {
|
if (specs->bulk_cipher_algorithm == hc128) {
|
||||||
|
int hcRet;
|
||||||
enc->hc128 = (HC128*)XMALLOC(sizeof(HC128), heap, DYNAMIC_TYPE_CIPHER);
|
enc->hc128 = (HC128*)XMALLOC(sizeof(HC128), heap, DYNAMIC_TYPE_CIPHER);
|
||||||
if (enc->hc128 == NULL)
|
if (enc->hc128 == NULL)
|
||||||
return MEMORY_E;
|
return MEMORY_E;
|
||||||
@ -1459,16 +1460,20 @@ static int SetKeys(Ciphers* enc, Ciphers* dec, Keys* keys, CipherSpecs* specs,
|
|||||||
if (dec->hc128 == NULL)
|
if (dec->hc128 == NULL)
|
||||||
return MEMORY_E;
|
return MEMORY_E;
|
||||||
if (side == CLIENT_END) {
|
if (side == CLIENT_END) {
|
||||||
Hc128_SetKey(enc->hc128, keys->client_write_key,
|
hcRet = Hc128_SetKey(enc->hc128, keys->client_write_key,
|
||||||
keys->client_write_IV);
|
keys->client_write_IV);
|
||||||
Hc128_SetKey(dec->hc128, keys->server_write_key,
|
if (hcRet != 0) return hcRet;
|
||||||
keys->server_write_IV);
|
hcRet = Hc128_SetKey(dec->hc128, keys->server_write_key,
|
||||||
|
keys->server_write_IV);
|
||||||
|
if (hcRet != 0) return hcRet;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Hc128_SetKey(enc->hc128, keys->server_write_key,
|
hcRet = Hc128_SetKey(enc->hc128, keys->server_write_key,
|
||||||
keys->server_write_IV);
|
keys->server_write_IV);
|
||||||
Hc128_SetKey(dec->hc128, keys->client_write_key,
|
if (hcRet != 0) return hcRet;
|
||||||
keys->client_write_IV);
|
hcRet = Hc128_SetKey(dec->hc128, keys->client_write_key,
|
||||||
|
keys->client_write_IV);
|
||||||
|
if (hcRet != 0) return hcRet;
|
||||||
}
|
}
|
||||||
enc->setup = 1;
|
enc->setup = 1;
|
||||||
dec->setup = 1;
|
dec->setup = 1;
|
||||||
@ -1477,6 +1482,7 @@ static int SetKeys(Ciphers* enc, Ciphers* dec, Keys* keys, CipherSpecs* specs,
|
|||||||
|
|
||||||
#ifdef BUILD_RABBIT
|
#ifdef BUILD_RABBIT
|
||||||
if (specs->bulk_cipher_algorithm == rabbit) {
|
if (specs->bulk_cipher_algorithm == rabbit) {
|
||||||
|
int rabRet;
|
||||||
enc->rabbit = (Rabbit*)XMALLOC(sizeof(Rabbit),heap,DYNAMIC_TYPE_CIPHER);
|
enc->rabbit = (Rabbit*)XMALLOC(sizeof(Rabbit),heap,DYNAMIC_TYPE_CIPHER);
|
||||||
if (enc->rabbit == NULL)
|
if (enc->rabbit == NULL)
|
||||||
return MEMORY_E;
|
return MEMORY_E;
|
||||||
@ -1484,16 +1490,20 @@ static int SetKeys(Ciphers* enc, Ciphers* dec, Keys* keys, CipherSpecs* specs,
|
|||||||
if (dec->rabbit == NULL)
|
if (dec->rabbit == NULL)
|
||||||
return MEMORY_E;
|
return MEMORY_E;
|
||||||
if (side == CLIENT_END) {
|
if (side == CLIENT_END) {
|
||||||
RabbitSetKey(enc->rabbit, keys->client_write_key,
|
rabRet = RabbitSetKey(enc->rabbit, keys->client_write_key,
|
||||||
keys->client_write_IV);
|
keys->client_write_IV);
|
||||||
RabbitSetKey(dec->rabbit, keys->server_write_key,
|
if (rabRet != 0) return rabRet;
|
||||||
keys->server_write_IV);
|
rabRet = RabbitSetKey(dec->rabbit, keys->server_write_key,
|
||||||
|
keys->server_write_IV);
|
||||||
|
if (rabRet != 0) return rabRet;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
RabbitSetKey(enc->rabbit, keys->server_write_key,
|
rabRet = RabbitSetKey(enc->rabbit, keys->server_write_key,
|
||||||
keys->server_write_IV);
|
keys->server_write_IV);
|
||||||
RabbitSetKey(dec->rabbit, keys->client_write_key,
|
if (rabRet != 0) return rabRet;
|
||||||
|
rabRet = RabbitSetKey(dec->rabbit, keys->client_write_key,
|
||||||
keys->client_write_IV);
|
keys->client_write_IV);
|
||||||
|
if (rabRet != 0) return rabRet;
|
||||||
}
|
}
|
||||||
enc->setup = 1;
|
enc->setup = 1;
|
||||||
dec->setup = 1;
|
dec->setup = 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user