BeRTOS
|
00001 00038 #include "cipher.h" 00039 #include <sec/util.h> 00040 00041 void cipher_cbc_encrypt(BlockCipher *c, void *block) 00042 { 00043 xor_block(c->buf, c->buf, block, c->block_len); 00044 c->enc_block(c, c->buf); 00045 memcpy(block, c->buf, c->block_len); 00046 } 00047 00048 void cipher_cbc_decrypt(BlockCipher *c, void *block) 00049 { 00050 uint8_t temp[c->block_len]; 00051 memcpy(temp, block, c->block_len); 00052 00053 c->dec_block(c, block); 00054 xor_block(block, block, c->buf, c->block_len); 00055 00056 memcpy(c->buf, temp, c->block_len); 00057 } 00058 00059 static void ctr_increment(void *buf, size_t len) 00060 { 00061 uint8_t *data = (uint8_t*)buf; 00062 while (len--) 00063 if (LIKELY(++data[len] != 0)) 00064 return; 00065 } 00066 00067 void cipher_ctr_step(BlockCipher *c, void *block) 00068 { 00069 memcpy(block, c->buf, c->block_len); 00070 c->enc_block(c, block); 00071 ctr_increment(c->buf, c->block_len); 00072 } 00073 00074 void cipher_ctr_encrypt(BlockCipher *c, void *block) 00075 { 00076 uint8_t temp[c->block_len]; 00077 00078 cipher_ctr_step(c, temp); 00079 xor_block(block, block, temp, c->block_len); 00080 00081 PURGE(temp); 00082 } 00083 00084 void cipher_ctr_decrypt(BlockCipher *c, void *block) 00085 { 00086 cipher_ctr_encrypt(c, block); 00087 } 00088 00089 static void ofb_step(BlockCipher *c) 00090 { 00091 c->enc_block(c, c->buf); 00092 } 00093 00094 void cipher_ofb_encrypt(BlockCipher *c, void *block) 00095 { 00096 ofb_step(c); 00097 xor_block(block, block, c->buf, c->block_len); 00098 } 00099 00100 void cipher_ofb_decrypt(BlockCipher *c, void *block) 00101 { 00102 cipher_ofb_encrypt(c, block); 00103 }