BeRTOS
cipher.h
Go to the documentation of this file.
00001 
00038 #ifndef SEC_CIPHER_H
00039 #define SEC_CIPHER_H
00040 
00041 #include <cfg/compiler.h>
00042 #include <cfg/debug.h>
00043 
00044 typedef struct BlockCipher
00045 {
00046     void (*set_key)(struct BlockCipher *c, const void *key, size_t len);
00047     void (*enc_block)(struct BlockCipher *c, void *block);
00048     void (*dec_block)(struct BlockCipher *c, void *block);
00049 
00050     void *buf;
00051     uint8_t key_len;
00052     uint8_t block_len;
00053 } BlockCipher;
00054 
00055 
00062 INLINE size_t cipher_key_len(BlockCipher *c)
00063 {
00064     return c->key_len;
00065 }
00066 
00070 INLINE size_t cipher_block_len(BlockCipher *c)
00071 {
00072     return c->block_len;
00073 }
00074 
00082 INLINE void cipher_set_key(BlockCipher *c, const void *key)
00083 {
00084     ASSERT(c->set_key);
00085     c->set_key(c, key, c->key_len);
00086 }
00087 
00098 INLINE void cipher_set_vkey(BlockCipher *c, const void *key, size_t len)
00099 {
00100     ASSERT(c->set_key);
00101     c->set_key(c, key, len);
00102 }
00103 
00104 /*********************************************************************************/
00105 /* ECB mode                                                                      */
00106 /*********************************************************************************/
00107 
00111 INLINE void cipher_ecb_encrypt(BlockCipher *c, void *block)
00112 {
00113     ASSERT(c->enc_block);
00114     c->enc_block(c, block);
00115 }
00116 
00120 INLINE void cipher_ecb_decrypt(BlockCipher *c, void *block)
00121 {
00122     ASSERT(c->dec_block);
00123     c->dec_block(c, block);
00124 }
00125 
00126 
00127 /*********************************************************************************/
00128 /* CBC mode                                                                      */
00129 /*********************************************************************************/
00130 
00138 INLINE void cipher_cbc_begin(BlockCipher *c, void *iv)
00139 {
00140     c->buf = iv;
00141 }
00142 
00146 void cipher_cbc_encrypt(BlockCipher *c, void *block);
00147 
00151 void cipher_cbc_decrypt(BlockCipher *c, void *block);
00152 
00153 
00154 
00155 /*********************************************************************************/
00156 /* CTR mode                                                                      */
00157 /*********************************************************************************/
00158 
00166 INLINE void cipher_ctr_begin(BlockCipher *c, void *counter)
00167 {
00168     c->buf = counter;
00169 }
00170 
00174 void cipher_ctr_encrypt(BlockCipher *c, void *block);
00175 
00179 void cipher_ctr_decrypt(BlockCipher *c, void *block);
00180 
00189 void cipher_ctr_step(BlockCipher *c, void *block);
00190 
00191 
00192 /*********************************************************************************/
00193 /* OFB mode                                                                      */
00194 /*********************************************************************************/
00195 
00203 INLINE void cipher_ofb_begin(BlockCipher *c, void *iv)
00204 {
00205     c->buf = iv;
00206 }
00207 
00211 void cipher_ofb_encrypt(BlockCipher *c, void *block);
00212 
00216 void cipher_ofb_decrypt(BlockCipher *c, void *block);
00217 
00218 
00219 #endif /* SEC_CIPHER_H */