BeRTOS
cipher.c
Go to the documentation of this file.
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 }