Home | History | Annotate | Download | only in eax
      1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
      2  *
      3  * LibTomCrypt is a library that provides various cryptographic
      4  * algorithms in a highly modular and flexible manner.
      5  *
      6  * The library is free for all purposes without any express
      7  * guarantee it works.
      8  *
      9  * Tom St Denis, tomstdenis (at) gmail.com, http://libtomcrypt.com
     10  */
     11 
     12 /**
     13     @file eax_decrypt_verify_memory.c
     14     EAX implementation, decrypt block of memory, by Tom St Denis
     15 */
     16 #include "tomcrypt.h"
     17 
     18 #ifdef EAX_MODE
     19 
     20 /**
     21    Decrypt a block of memory and verify the provided MAC tag with EAX
     22    @param cipher     The index of the cipher desired
     23    @param key        The secret key
     24    @param keylen     The length of the key (octets)
     25    @param nonce      The nonce data (use once) for the session
     26    @param noncelen   The length of the nonce data.
     27    @param header     The session header data
     28    @param headerlen  The length of the header (octets)
     29    @param ct         The ciphertext
     30    @param ctlen      The length of the ciphertext (octets)
     31    @param pt         [out] The plaintext
     32    @param tag        The authentication tag provided by the encoder
     33    @param taglen     [in/out] The length of the tag (octets)
     34    @param stat       [out] The result of the decryption (1==valid tag, 0==invalid)
     35    @return CRYPT_OK if successful regardless of the resulting tag comparison
     36 */
     37 int eax_decrypt_verify_memory(int cipher,
     38     const unsigned char *key,    unsigned long keylen,
     39     const unsigned char *nonce,  unsigned long noncelen,
     40     const unsigned char *header, unsigned long headerlen,
     41     const unsigned char *ct,     unsigned long ctlen,
     42           unsigned char *pt,
     43           unsigned char *tag,    unsigned long taglen,
     44           int           *stat)
     45 {
     46    int            err;
     47    eax_state     *eax;
     48    unsigned char *buf;
     49    unsigned long  buflen;
     50 
     51    LTC_ARGCHK(stat != NULL);
     52    LTC_ARGCHK(key  != NULL);
     53    LTC_ARGCHK(pt   != NULL);
     54    LTC_ARGCHK(ct   != NULL);
     55    LTC_ARGCHK(tag  != NULL);
     56 
     57    /* default to zero */
     58    *stat = 0;
     59 
     60    /* allocate ram */
     61    buf = XMALLOC(taglen);
     62    eax = XMALLOC(sizeof(*eax));
     63    if (eax == NULL || buf == NULL) {
     64       if (eax != NULL) {
     65          XFREE(eax);
     66       }
     67       if (buf != NULL) {
     68          XFREE(buf);
     69       }
     70       return CRYPT_MEM;
     71    }
     72 
     73    if ((err = eax_init(eax, cipher, key, keylen, nonce, noncelen, header, headerlen)) != CRYPT_OK) {
     74       goto LBL_ERR;
     75    }
     76 
     77    if ((err = eax_decrypt(eax, ct, pt, ctlen)) != CRYPT_OK) {
     78       goto LBL_ERR;
     79    }
     80 
     81    buflen = taglen;
     82    if ((err = eax_done(eax, buf, &buflen)) != CRYPT_OK) {
     83       goto LBL_ERR;
     84    }
     85 
     86    /* compare tags */
     87    if (buflen >= taglen && XMEMCMP(buf, tag, taglen) == 0) {
     88       *stat = 1;
     89    }
     90 
     91    err = CRYPT_OK;
     92 LBL_ERR:
     93 #ifdef LTC_CLEAN_STACK
     94    zeromem(buf, taglen);
     95    zeromem(eax, sizeof(*eax));
     96 #endif
     97 
     98    XFREE(eax);
     99    XFREE(buf);
    100 
    101    return err;
    102 }
    103 
    104 #endif
    105 
    106 /* $Source: /cvs/libtom/libtomcrypt/src/encauth/eax/eax_decrypt_verify_memory.c,v $ */
    107 /* $Revision: 1.5 $ */
    108 /* $Date: 2006/11/01 09:28:17 $ */
    109