68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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, err;
 | |
| 
 | |
|    _ARGCHK(IV != NULL);
 | |
|    _ARGCHK(key != NULL);
 | |
|    _ARGCHK(ofb != NULL);
 | |
| 
 | |
|    if ((err = cipher_is_valid(cipher)) != CRYPT_OK) {
 | |
|       return err;
 | |
|    }
 | |
| 
 | |
|    /* 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 err;
 | |
|    _ARGCHK(pt != NULL);
 | |
|    _ARGCHK(ct != NULL);
 | |
|    _ARGCHK(ofb != NULL);
 | |
|    if ((err = cipher_is_valid(ofb->cipher)) != CRYPT_OK) {
 | |
|        return err;
 | |
|    }
 | |
|    
 | |
|    /* is blocklen/padlen valid? */
 | |
|    if (ofb->blocklen < 0 || ofb->blocklen > (int)sizeof(ofb->IV) ||
 | |
|        ofb->padlen   < 0 || ofb->padlen   > (int)sizeof(ofb->IV)) {
 | |
|       return CRYPT_INVALID_ARG;
 | |
|    }
 | |
|    
 | |
|    while (len-- > 0) {
 | |
|        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
 | |
| 
 | |
|  
 |