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_done_decrypt.c
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   OCB implementation, terminate decryption, 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   Terminate a decrypting OCB state
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param ocb    The OCB state
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param ct     The ciphertext (if any)
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param ctlen  The length of the ciphertext (octets)
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param pt     [out] The plaintext
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param tag    The authentication tag (to compare against)
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param taglen The length of the authentication tag provided
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param stat    [out] The result of the tag comparison
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if the process was successful regardless if the tag is valid
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint ocb_done_decrypt(ocb_state *ocb,
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     const unsigned char *ct,  unsigned long ctlen,
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                           unsigned char *pt,
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     const unsigned char *tag, unsigned long taglen, int *stat)
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int err;
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char *tagbuf;
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long tagbuflen;
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(ocb  != NULL);
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(pt   != NULL);
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(ct   != NULL);
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(tag  != NULL);
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(stat != NULL);
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* default to failed */
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   *stat = 0;
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* allocate memory */
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tagbuf = XMALLOC(MAXBLOCKSIZE);
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (tagbuf == NULL) {
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return CRYPT_MEM;
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tagbuflen = MAXBLOCKSIZE;
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ((err = s_ocb_done(ocb, ct, ctlen, pt, tagbuf, &tagbuflen, 1)) != CRYPT_OK) {
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      goto LBL_ERR;
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (taglen <= tagbuflen && XMEMCMP(tagbuf, tag, taglen) == 0) {
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      *stat = 1;
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   err = CRYPT_OK;
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectLBL_ERR:
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   zeromem(tagbuf, MAXBLOCKSIZE);
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   XFREE(tagbuf);
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return err;
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_done_decrypt.c,v $ */
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.5 $ */
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/11/01 09:28:17 $ */
81