1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* LibTomCrypt, modular cryptographic library -- Tom St Denis
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LibTomCrypt is a library that provides various cryptographic
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * algorithms in a highly modular and flexible manner.
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library is free for all purposes without any express
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * guarantee it works.
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  @file ocb_decrypt_verify_memory.c
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  OCB implementation, helper to decrypt block of memory, by Tom St Denis
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "tomcrypt.h"
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef OCB_MODE
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   Decrypt and compare the tag with OCB.
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param cipher     The index of the cipher desired
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param key        The secret key
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param keylen     The length of the secret key (octets)
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param nonce      The session nonce (length of the block size of the block cipher)
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param ct         The ciphertext
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param ctlen      The length of the ciphertext (octets)
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param pt         [out] The plaintext
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param tag        The tag to compare against
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param taglen     The length of the tag (octets)
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param stat       [out] The result of the tag comparison (1==valid, 0==invalid)
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful regardless of the tag comparison
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint ocb_decrypt_verify_memory(int cipher,
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    const unsigned char *key,    unsigned long keylen,
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    const unsigned char *nonce,
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    const unsigned char *ct,     unsigned long ctlen,
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          unsigned char *pt,
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    const unsigned char *tag,    unsigned long taglen,
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          int           *stat)
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int err;
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ocb_state *ocb;
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(key    != NULL);
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(nonce  != NULL);
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(pt     != NULL);
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(ct     != NULL);
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(tag    != NULL);
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(stat    != NULL);
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* allocate memory */
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ocb = XMALLOC(sizeof(ocb_state));
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (ocb == NULL) {
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return CRYPT_MEM;
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ((err = ocb_init(ocb, cipher, key, keylen, nonce)) != CRYPT_OK) {
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      goto LBL_ERR;
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   while (ctlen > (unsigned long)ocb->block_len) {
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ((err = ocb_decrypt(ocb, ct, pt)) != CRYPT_OK) {
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            goto LBL_ERR;
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        ctlen   -= ocb->block_len;
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        pt      += ocb->block_len;
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        ct      += ocb->block_len;
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   err = ocb_done_decrypt(ocb, ct, ctlen, pt, tag, taglen, stat);
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectLBL_ERR:
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   zeromem(ocb, sizeof(ocb_state));
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   XFREE(ocb);
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return err;
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_decrypt_verify_memory.c,v $ */
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.4 $ */
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/03/31 14:15:35 $ */
87