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
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  @file f9_file.c
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  f9 support, process a file, Tom St Denis
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_F9_MODE
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   f9 a file
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 filename The name of the file you wish to f9
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param out      [out] Where the authentication tag is to be stored
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param outlen   [in/out] The max size and resulting size of the authentication tag
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful, CRYPT_NOP if file support has been disabled
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint f9_file(int cipher,
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              const unsigned char *key, unsigned long keylen,
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              const char *filename,
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                    unsigned char *out, unsigned long *outlen)
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_NO_FILE
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_NOP;
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int err, x;
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   f9_state f9;
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FILE *in;
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char buf[512];
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(key      != NULL);
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(filename != NULL);
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(out      != NULL);
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(outlen   != NULL);
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   in = fopen(filename, "rb");
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (in == NULL) {
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return CRYPT_FILE_NOTFOUND;
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ((err = f9_init(&f9, cipher, key, keylen)) != CRYPT_OK) {
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      fclose(in);
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return err;
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   do {
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      x = fread(buf, 1, sizeof(buf), in);
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      if ((err = f9_process(&f9, buf, x)) != CRYPT_OK) {
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         fclose(in);
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         return err;
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } while (x == sizeof(buf));
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fclose(in);
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ((err = f9_done(&f9,    out, outlen)) != CRYPT_OK) {
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return err;
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   zeromem(buf, sizeof(buf));
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/mac/f9/f9_file.c,v $ */
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.4 $ */
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/11/21 00:18:23 $ */
84