comparison src/encauth/gcm/gcm_init.c @ 192:9cc34777b479 libtomcrypt

propagate from branch 'au.asn.ucc.matt.ltc-orig' (head 9ba8f01f44320e9cb9f19881105ae84f84a43ea9) to branch 'au.asn.ucc.matt.dropbear.ltc' (head dbf51c569bc34956ad948e4cc87a0eeb2170b768)
author Matt Johnston <matt@ucc.asn.au>
date Sun, 08 May 2005 06:36:47 +0000
parents 1c15b283127b
children 39d5d58461d6
comparison
equal deleted inserted replaced
164:cd1143579f00 192:9cc34777b479
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, [email protected], http://libtomcrypt.org
10 */
11
12 /**
13 @file gcm_init.c
14 GCM implementation, initialize state, by Tom St Denis
15 */
16 #include "tomcrypt.h"
17
18 #ifdef GCM_MODE
19
20 /**
21 Initialize a GCM state
22 @param gcm The GCM state to initialize
23 @param cipher The index of the cipher to use
24 @param key The secret key
25 @param keylen The length of the secret key
26 @return CRYPT_OK on success
27 */
28 int gcm_init(gcm_state *gcm, int cipher,
29 const unsigned char *key, int keylen)
30 {
31 int err;
32 unsigned char B[16];
33 #ifdef GCM_TABLES
34 int x, y;
35 #endif
36
37 LTC_ARGCHK(gcm != NULL);
38 LTC_ARGCHK(key != NULL);
39
40 #ifdef LTC_FAST
41 if (16 % sizeof(LTC_FAST_TYPE)) {
42 return CRYPT_INVALID_ARG;
43 }
44 #endif
45
46 /* is cipher valid? */
47 if ((err = cipher_is_valid(cipher)) != CRYPT_OK) {
48 return err;
49 }
50 if (cipher_descriptor[cipher].block_length != 16) {
51 return CRYPT_INVALID_CIPHER;
52 }
53
54 /* schedule key */
55 if ((err = cipher_descriptor[cipher].setup(key, keylen, 0, &gcm->K)) != CRYPT_OK) {
56 return err;
57 }
58
59 /* H = E(0) */
60 zeromem(B, 16);
61 cipher_descriptor[cipher].ecb_encrypt(B, gcm->H, &gcm->K);
62
63 /* setup state */
64 zeromem(gcm->buf, sizeof(gcm->buf));
65 zeromem(gcm->X, sizeof(gcm->X));
66 gcm->cipher = cipher;
67 gcm->mode = GCM_MODE_IV;
68 gcm->ivmode = 0;
69 gcm->buflen = 0;
70 gcm->totlen = 0;
71 gcm->pttotlen = 0;
72
73 #ifdef GCM_TABLES
74 /* setup tables */
75 zeromem(B, 16);
76 for (x = 0; x < 16; x++) {
77 for (y = 0; y < 256; y++) {
78 B[x] = y;
79 gcm_gf_mult(gcm->H, B, &gcm->PC[x][y][0]);
80 }
81 B[x] = 0;
82 }
83 #endif
84
85 return CRYPT_OK;
86 }
87
88 #endif