#include "mycrypt.h" #ifdef OFB int ofb_start(int cipher, const unsigned char *IV, const unsigned char *key, int keylen, int num_rounds, symmetric_OFB *ofb) { int x, errno; _ARGCHK(IV != NULL); _ARGCHK(key != NULL); _ARGCHK(ofb != NULL); if ((errno = cipher_is_valid(cipher)) != CRYPT_OK) { return errno; } /* copy details */ ofb->cipher = cipher; ofb->blocklen = cipher_descriptor[cipher].block_length; for (x = 0; x < ofb->blocklen; x++) { ofb->IV[x] = IV[x]; } /* init the cipher */ ofb->padlen = ofb->blocklen; return cipher_descriptor[cipher].setup(key, keylen, num_rounds, &ofb->key); } int ofb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_OFB *ofb) { int errno; _ARGCHK(pt != NULL); _ARGCHK(ct != NULL); _ARGCHK(ofb != NULL); if ((errno = cipher_is_valid(ofb->cipher)) != CRYPT_OK) { return errno; } while (len--) { if (ofb->padlen == ofb->blocklen) { cipher_descriptor[ofb->cipher].ecb_encrypt(ofb->IV, ofb->IV, &ofb->key); ofb->padlen = 0; } *ct++ = *pt++ ^ ofb->IV[ofb->padlen++]; } return CRYPT_OK; } int ofb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_OFB *ofb) { _ARGCHK(pt != NULL); _ARGCHK(ct != NULL); _ARGCHK(ofb != NULL); return ofb_encrypt(ct, pt, len, ofb); } #endif