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@gmail.com, http://libtomcrypt.com
10 */
11#include "tomcrypt.h"
12
13/**
14  @file f9_init.c
15  F9 Support, start an F9 state
16*/
17
18#ifdef LTC_F9_MODE
19
20/** Initialize F9-MAC state
21  @param f9    [out] f9 state to initialize
22  @param cipher  Index of cipher to use
23  @param key     [in]  Secret key
24  @param keylen  Length of secret key in octets
25  Return CRYPT_OK on success
26*/
27int f9_init(f9_state *f9, int cipher, const unsigned char *key, unsigned long keylen)
28{
29   int            x, err;
30
31   LTC_ARGCHK(f9   != NULL);
32   LTC_ARGCHK(key  != NULL);
33
34   /* schedule the key */
35   if ((err = cipher_is_valid(cipher)) != CRYPT_OK) {
36      return err;
37   }
38
39#ifdef LTC_FAST
40   if (cipher_descriptor[cipher].block_length % sizeof(LTC_FAST_TYPE)) {
41       return CRYPT_INVALID_ARG;
42   }
43#endif
44
45   if ((err = cipher_descriptor[cipher].setup(key, keylen, 0, &f9->key)) != CRYPT_OK) {
46      goto done;
47   }
48
49   /* make the second key */
50   for (x = 0; (unsigned)x < keylen; x++) {
51      f9->akey[x] = key[x] ^ 0xAA;
52   }
53
54   /* setup struct */
55   zeromem(f9->IV,  cipher_descriptor[cipher].block_length);
56   zeromem(f9->ACC, cipher_descriptor[cipher].block_length);
57   f9->blocksize = cipher_descriptor[cipher].block_length;
58   f9->cipher    = cipher;
59   f9->buflen    = 0;
60   f9->keylen    = keylen;
61done:
62   return err;
63}
64
65#endif
66
67/* $Source: /cvs/libtom/libtomcrypt/src/mac/f9/f9_init.c,v $ */
68/* $Revision: 1.4 $ */
69/* $Date: 2006/11/08 22:54:18 $ */
70
71