DES3_cbc_encrypt with fragmentary size

This commit is contained in:
Takashi Kojo
2017-07-29 12:54:45 +09:00
committed by Jacob Barthelmeh
parent a19813eab2
commit dbad348537

View File

@ -14345,16 +14345,33 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
WOLFSSL_DES_cblock* ivec, int enc) WOLFSSL_DES_cblock* ivec, int enc)
{ {
Des myDes; Des myDes;
byte lastblock[DES_BLOCK_SIZE];
int lb_sz;
long blk;
WOLFSSL_ENTER("DES_cbc_encrypt"); WOLFSSL_ENTER("DES_cbc_encrypt");
/* OpenSSL compat, no ret */ /* OpenSSL compat, no ret */
wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc); wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc);
lb_sz = length%DES_BLOCK_SIZE;
blk = length/DES_BLOCK_SIZE;
if (enc) if (enc){
wc_Des_CbcEncrypt(&myDes, output, input, (word32)length); wc_Des_CbcEncrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
else if(lb_sz){
wc_Des_CbcDecrypt(&myDes, output, input, (word32)length); XMEMSET(lastblock, DES_BLOCK_SIZE, 0);
XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
wc_Des_CbcEncrypt(&myDes, output+blk*DES_BLOCK_SIZE,
lastblock, (word32)DES_BLOCK_SIZE);
}
}
else {
wc_Des_CbcDecrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
if(lb_sz){
wc_Des_CbcDecrypt(&myDes, lastblock, input+length-lb_sz, (word32)DES_BLOCK_SIZE);
XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
}
}
} }
@ -14368,6 +14385,9 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
{ {
Des3 des; Des3 des;
byte key[24];/* EDE uses 24 size key */ byte key[24];/* EDE uses 24 size key */
byte lastblock[DES_BLOCK_SIZE];
int lb_sz;
long blk;
WOLFSSL_ENTER("wolfSSL_DES_ede3_cbc_encrypt"); WOLFSSL_ENTER("wolfSSL_DES_ede3_cbc_encrypt");
@ -14375,14 +14395,25 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
XMEMCPY(key, *ks1, DES_BLOCK_SIZE); XMEMCPY(key, *ks1, DES_BLOCK_SIZE);
XMEMCPY(&key[DES_BLOCK_SIZE], *ks2, DES_BLOCK_SIZE); XMEMCPY(&key[DES_BLOCK_SIZE], *ks2, DES_BLOCK_SIZE);
XMEMCPY(&key[DES_BLOCK_SIZE * 2], *ks3, DES_BLOCK_SIZE); XMEMCPY(&key[DES_BLOCK_SIZE * 2], *ks3, DES_BLOCK_SIZE);
lb_sz = sz%DES_BLOCK_SIZE;
blk = sz/DES_BLOCK_SIZE;
if (enc) { if (enc) {
wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_ENCRYPTION); wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_ENCRYPTION);
wc_Des3_CbcEncrypt(&des, output, input, (word32)sz); wc_Des3_CbcEncrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
if(lb_sz){
XMEMSET(lastblock, DES_BLOCK_SIZE, 0);
XMEMCPY(lastblock, input+sz-lb_sz, lb_sz);
wc_Des3_CbcEncrypt(&des, output+blk*DES_BLOCK_SIZE,
lastblock, (word32)DES_BLOCK_SIZE);
}
} }
else { else {
wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_DECRYPTION); wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_DECRYPTION);
wc_Des3_CbcDecrypt(&des, output, input, (word32)sz); wc_Des3_CbcDecrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
if(lb_sz){
wc_Des3_CbcDecrypt(&des, lastblock, input+sz-lb_sz, (word32)DES_BLOCK_SIZE);
XMEMCPY(output+sz-lb_sz, lastblock, lb_sz);
}
} }
} }
@ -14394,16 +14425,31 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
int enc) int enc)
{ {
Des myDes; Des myDes;
byte lastblock[DES_BLOCK_SIZE];
int lb_sz;
long blk;
WOLFSSL_ENTER("DES_ncbc_encrypt"); WOLFSSL_ENTER("DES_ncbc_encrypt");
/* OpenSSL compat, no ret */ /* OpenSSL compat, no ret */
wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc); wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc);
lb_sz = length%DES_BLOCK_SIZE;
if (enc) blk = length/DES_BLOCK_SIZE;
wc_Des_CbcEncrypt(&myDes, output, input, (word32)length); if (enc){
else wc_Des_CbcEncrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
wc_Des_CbcDecrypt(&myDes, output, input, (word32)length); if(lb_sz){
XMEMSET(lastblock, DES_BLOCK_SIZE, 0);
XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
wc_Des_CbcEncrypt(&myDes, output+blk*DES_BLOCK_SIZE,
lastblock, (word32)DES_BLOCK_SIZE);
}
} else {
wc_Des_CbcDecrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
if(lb_sz){
wc_Des_CbcDecrypt(&myDes, lastblock, input+length-lb_sz, (word32)DES_BLOCK_SIZE);
XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
}
}
XMEMCPY(ivec, output + length - sizeof(DES_cblock), sizeof(DES_cblock)); XMEMCPY(ivec, output + length - sizeof(DES_cblock), sizeof(DES_cblock));
} }