1
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
3
* LibTomCrypt is a library that provides various cryptographic
4
* algorithms in a highly modular and flexible manner.
6
* The library is free for all purposes without any express
9
* Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org
14
OCB implementation, decrypt data, by Tom St Denis
21
Decrypt a block with OCB.
22
@param ocb The OCB state
23
@param ct The ciphertext (length of the block size of the block cipher)
24
@param pt [out] The plaintext (length of ct)
25
@return CRYPT_OK if successful
27
int ocb_decrypt(ocb_state *ocb, const unsigned char *ct, unsigned char *pt)
29
unsigned char Z[MAXBLOCKSIZE], tmp[MAXBLOCKSIZE];
32
LTC_ARGCHK(ocb != NULL);
33
LTC_ARGCHK(pt != NULL);
34
LTC_ARGCHK(ct != NULL);
36
/* check if valid cipher */
37
if ((err = cipher_is_valid(ocb->cipher)) != CRYPT_OK) {
40
LTC_ARGCHK(cipher_descriptor[ocb->cipher].ecb_decrypt != NULL);
43
if (ocb->block_len != cipher_descriptor[ocb->cipher].block_length) {
44
return CRYPT_INVALID_ARG;
48
ocb_shift_xor(ocb, Z);
50
/* xor ct in, encrypt, xor Z out */
51
for (x = 0; x < ocb->block_len; x++) {
52
tmp[x] = ct[x] ^ Z[x];
54
cipher_descriptor[ocb->cipher].ecb_decrypt(tmp, pt, &ocb->key);
55
for (x = 0; x < ocb->block_len; x++) {
59
/* compute checksum */
60
for (x = 0; x < ocb->block_len; x++) {
61
ocb->checksum[x] ^= pt[x];
65
#ifdef LTC_CLEAN_STACK
66
zeromem(Z, sizeof(Z));
67
zeromem(tmp, sizeof(tmp));
75
/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_decrypt.c,v $ */
76
/* $Revision: 1.3 $ */
77
/* $Date: 2005/05/05 14:35:58 $ */