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#include "tomcrypt.h"
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <stdarg.h>
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  @file f9_memory_multi.c
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  f9 support, process multiple blocks of memory, Tom St Denis
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_F9_MODE
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   f9 multiple blocks of memory
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param cipher    The index of the desired cipher
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param key       The secret key
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param keylen    The length of the secret key (octets)
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param out       [out] The destination of the authentication tag
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param outlen    [in/out]  The max size and resulting size of the authentication tag (octets)
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param in        The data to send through f9
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param inlen     The length of the data to send through f9 (octets)
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param ...       tuples of (data,len) pairs to f9, terminated with a (NULL,x) (x=don't care)
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint f9_memory_multi(int cipher,
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                const unsigned char *key, unsigned long keylen,
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                      unsigned char *out, unsigned long *outlen,
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                const unsigned char *in,  unsigned long inlen, ...)
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int                  err;
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   f9_state          *f9;
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   va_list              args;
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   const unsigned char *curptr;
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long        curlen;
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(key    != NULL);
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(in     != NULL);
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(out    != NULL);
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(outlen != NULL);
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* allocate ram for f9 state */
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   f9 = XMALLOC(sizeof(f9_state));
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (f9 == NULL) {
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return CRYPT_MEM;
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* f9 process the message */
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ((err = f9_init(f9, cipher, key, keylen)) != CRYPT_OK) {
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      goto LBL_ERR;
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   va_start(args, inlen);
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   curptr = in;
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   curlen = inlen;
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (;;) {
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      /* process buf */
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      if ((err = f9_process(f9, curptr, curlen)) != CRYPT_OK) {
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         goto LBL_ERR;
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      /* step to next */
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      curptr = va_arg(args, const unsigned char*);
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      if (curptr == NULL) {
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         break;
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      curlen = va_arg(args, unsigned long);
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ((err = f9_done(f9, out, outlen)) != CRYPT_OK) {
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      goto LBL_ERR;
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectLBL_ERR:
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   zeromem(f9, sizeof(f9_state));
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   XFREE(f9);
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   va_end(args);
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return err;
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/mac/f9/f9_memory_multi.c,v $ */
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.2 $ */
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/11/08 21:50:13 $ */
91