BeRTOS
|
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 */