mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2026-01-31 07:29:16 +01:00
initial cfb1/cfb8 support added
This commit is contained in:
committed by
Eric Blankenhorn
parent
9c4e0807e2
commit
9d61ba6c62
@@ -7476,6 +7476,196 @@ int wc_AesCfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
return wc_AesFeedbackDecrypt(aes, out, in, sz, AES_CFB_MODE);
|
||||
}
|
||||
#endif /* HAVE_AES_DECRYPT */
|
||||
|
||||
|
||||
/* shift the whole AES_BLOCK_SIZE array left by 8 or 1 bits */
|
||||
static void shiftLeftArray(byte* ary, byte shift)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (shift == WOLFSSL_BIT_SIZE) {
|
||||
/* shifting over by 8 bits */
|
||||
for (i = 0; i < AES_BLOCK_SIZE - 1; i++) {
|
||||
ary[i] = ary[i+1];
|
||||
}
|
||||
ary[i] = 0;
|
||||
}
|
||||
else {
|
||||
byte carry = 0;
|
||||
|
||||
/* shifting over by 7 or less bits */
|
||||
for (i = 0; i < AES_BLOCK_SIZE - 1; i++) {
|
||||
carry = ary[i+1] & (0XFF << (WOLFSSL_BIT_SIZE - shift));
|
||||
carry >>= (WOLFSSL_BIT_SIZE - shift);
|
||||
ary[i] = (ary[i] << shift) + carry;
|
||||
}
|
||||
ary[i] = ary[i] << shift;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* returns 0 on success and negative values on failure */
|
||||
static int wc_AesFeedbackCFB8(Aes* aes, byte* out, const byte* in,
|
||||
word32 sz, byte dir)
|
||||
{
|
||||
byte *pt;
|
||||
|
||||
if (aes == NULL || out == NULL || in == NULL) {
|
||||
return BAD_FUNC_ARG;
|
||||
}
|
||||
|
||||
while (sz > 0) {
|
||||
wc_AesEncryptDirect(aes, (byte*)aes->tmp, (byte*)aes->reg);
|
||||
if (dir == AES_DECRYPTION) {
|
||||
pt = (byte*)aes->reg;
|
||||
|
||||
/* LSB + CAT */
|
||||
shiftLeftArray(pt, WOLFSSL_BIT_SIZE);
|
||||
pt[AES_BLOCK_SIZE - 1] = in[0];
|
||||
}
|
||||
|
||||
/* MSB + XOR */
|
||||
out[0] = aes->tmp[0] ^ in[0];
|
||||
if (dir == AES_ENCRYPTION) {
|
||||
pt = (byte*)aes->reg;
|
||||
|
||||
/* LSB + CAT */
|
||||
shiftLeftArray(pt, WOLFSSL_BIT_SIZE);
|
||||
pt[AES_BLOCK_SIZE - 1] = out[0];
|
||||
}
|
||||
|
||||
out += 1;
|
||||
in += 1;
|
||||
sz -= 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* returns 0 on success and negative values on failure */
|
||||
static int wc_AesFeedbackCFB1(Aes* aes, byte* out, const byte* in,
|
||||
word32 sz, byte dir)
|
||||
{
|
||||
byte tmp;
|
||||
byte* pt;
|
||||
int bit = 7;
|
||||
|
||||
if (aes == NULL || out == NULL || in == NULL) {
|
||||
return BAD_FUNC_ARG;
|
||||
}
|
||||
|
||||
out[0] = 0;
|
||||
while (sz > 0) {
|
||||
wc_AesEncryptDirect(aes, (byte*)aes->tmp, (byte*)aes->reg);
|
||||
if (dir == AES_DECRYPTION) {
|
||||
pt = (byte*)aes->reg;
|
||||
|
||||
/* LSB + CAT */
|
||||
tmp = (0X01 << bit) & in[0];
|
||||
tmp = tmp >> bit;
|
||||
shiftLeftArray((byte*)aes->reg, 1);
|
||||
pt[AES_BLOCK_SIZE - 1] |= tmp;
|
||||
}
|
||||
|
||||
/* MSB + XOR */
|
||||
tmp = (0X01 << bit) & in[0];
|
||||
pt = (byte*)aes->tmp;
|
||||
tmp = pt[0] ^ (tmp >> bit);
|
||||
tmp &= 0x01;
|
||||
out[0] |= (tmp << bit);
|
||||
|
||||
|
||||
if (dir == AES_ENCRYPTION) {
|
||||
pt = (byte*)aes->reg;
|
||||
|
||||
/* LSB + CAT */
|
||||
shiftLeftArray((byte*)aes->reg, 1);
|
||||
pt[AES_BLOCK_SIZE - 1] |= tmp;
|
||||
}
|
||||
|
||||
bit--;
|
||||
if (bit < 0) {
|
||||
out += 1;
|
||||
in += 1;
|
||||
sz -= 1;
|
||||
bit = 7;
|
||||
if (sz > 0) {
|
||||
out[0] = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
sz -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* CFB 1
|
||||
*
|
||||
* aes structure holding key to use for encryption
|
||||
* out buffer to hold result of encryption (must be at least as large as input
|
||||
* buffer)
|
||||
* in buffer to encrypt
|
||||
* sz size of input buffer
|
||||
*
|
||||
* returns 0 on success and negative values on failure
|
||||
*/
|
||||
int wc_AesCfb1Encrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
return wc_AesFeedbackCFB1(aes, out, in, sz, AES_ENCRYPTION);
|
||||
}
|
||||
|
||||
|
||||
/* CFB 8
|
||||
*
|
||||
* aes structure holding key to use for encryption
|
||||
* out buffer to hold result of encryption (must be at least as large as input
|
||||
* buffer)
|
||||
* in buffer to encrypt
|
||||
* sz size of input buffer
|
||||
*
|
||||
* returns 0 on success and negative values on failure
|
||||
*/
|
||||
int wc_AesCfb8Encrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
return wc_AesFeedbackCFB8(aes, out, in, sz, AES_ENCRYPTION);
|
||||
}
|
||||
#ifdef HAVE_AES_DECRYPT
|
||||
|
||||
/* CFB 1
|
||||
*
|
||||
* aes structure holding key to use for encryption
|
||||
* out buffer to hold result of encryption (must be at least as large as input
|
||||
* buffer)
|
||||
* in buffer to encrypt
|
||||
* sz size of input buffer
|
||||
*
|
||||
* returns 0 on success and negative values on failure
|
||||
*/
|
||||
int wc_AesCfb1Decrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
return wc_AesFeedbackCFB1(aes, out, in, sz, AES_DECRYPTION);
|
||||
}
|
||||
|
||||
|
||||
/* CFB 8
|
||||
*
|
||||
* aes structure holding key to use for encryption
|
||||
* out buffer to hold result of encryption (must be at least as large as input
|
||||
* buffer)
|
||||
* in buffer to encrypt
|
||||
* sz size of input buffer
|
||||
*
|
||||
* returns 0 on success and negative values on failure
|
||||
*/
|
||||
int wc_AesCfb8Decrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
return wc_AesFeedbackCFB8(aes, out, in, sz, AES_DECRYPTION);
|
||||
}
|
||||
#endif /* HAVE_AES_DECRYPT */
|
||||
#endif /* WOLFSSL_AES_CFB */
|
||||
|
||||
#ifdef WOLFSSL_AES_OFB
|
||||
@@ -7513,7 +7703,7 @@ int wc_AesOfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
return wc_AesFeedbackDecrypt(aes, out, in, sz, AES_OFB_MODE);
|
||||
}
|
||||
#endif /* HAVE_AES_DECRYPT */
|
||||
#endif /* WOLFSSL_AES_CFB */
|
||||
#endif /* WOLFSSL_AES_OFB */
|
||||
|
||||
|
||||
#ifdef HAVE_AES_KEYWRAP
|
||||
|
||||
Reference in New Issue
Block a user