SEC: add OFB mode to symmetric ciphers.
[bertos.git] / bertos / sec / cipher.c
index 22bebe605de4a736cb409b4d1976b8464cdb7a23..ba4ae981d6da8298447671086022d77927fac872 100644 (file)
@@ -64,19 +64,40 @@ static void ctr_increment(void *buf, size_t len)
                        return;
 }
 
+void cipher_ctr_step(BlockCipher *c, void *block)
+{
+       memcpy(block, c->buf, c->block_len);
+       c->enc_block(c, block);
+       ctr_increment(c->buf, c->block_len);
+}
+
 void cipher_ctr_encrypt(BlockCipher *c, void *block)
 {
        uint8_t temp[c->block_len];
 
-       memcpy(temp, c->buf, c->block_len);
-       c->enc_block(c, temp);
+       cipher_ctr_step(c, temp);
        xor_block(block, block, temp, c->block_len);
 
        PURGE(temp);
-       ctr_increment(c->buf, c->block_len);
 }
 
 void cipher_ctr_decrypt(BlockCipher *c, void *block)
 {
        cipher_ctr_encrypt(c, block);
 }
+
+static void ofb_step(BlockCipher *c)
+{
+       c->enc_block(c, c->buf);
+}
+
+void cipher_ofb_encrypt(BlockCipher *c, void *block)
+{
+       ofb_step(c);
+       xor_block(block, block, c->buf, c->block_len);
+}
+
+void cipher_ofb_decrypt(BlockCipher *c, void *block)
+{
+       cipher_ofb_encrypt(c, block);
+}