Mercurial > dropbear
comparison libtomcrypt/src/encauth/chachapoly/chacha20poly1305_setiv.c @ 1471:6dba84798cd5
Update to libtomcrypt 1.18.1, merged with Dropbear changes
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Fri, 09 Feb 2018 21:44:05 +0800 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1470:8bba51a55704 | 1471:6dba84798cd5 |
---|---|
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 | |
10 #include "tomcrypt.h" | |
11 | |
12 #ifdef LTC_CHACHA20POLY1305_MODE | |
13 | |
14 /** | |
15 Set IV + counter data to the ChaCha20Poly1305 state and reset the context | |
16 @param st The ChaCha20Poly1305 state | |
17 @param iv The IV data to add | |
18 @param ivlen The length of the IV (must be 12 or 8) | |
19 @return CRYPT_OK on success | |
20 */ | |
21 int chacha20poly1305_setiv(chacha20poly1305_state *st, const unsigned char *iv, unsigned long ivlen) | |
22 { | |
23 chacha_state tmp_st; | |
24 int i, err; | |
25 unsigned char polykey[32]; | |
26 | |
27 LTC_ARGCHK(st != NULL); | |
28 LTC_ARGCHK(iv != NULL); | |
29 LTC_ARGCHK(ivlen == 12 || ivlen == 8); | |
30 | |
31 /* set IV for chacha20 */ | |
32 if (ivlen == 12) { | |
33 /* IV 96bit */ | |
34 if ((err = chacha_ivctr32(&st->chacha, iv, ivlen, 1)) != CRYPT_OK) return err; | |
35 } | |
36 else { | |
37 /* IV 64bit */ | |
38 if ((err = chacha_ivctr64(&st->chacha, iv, ivlen, 1)) != CRYPT_OK) return err; | |
39 } | |
40 | |
41 /* copy chacha20 key to temporary state */ | |
42 for(i = 0; i < 12; i++) tmp_st.input[i] = st->chacha.input[i]; | |
43 tmp_st.rounds = 20; | |
44 /* set IV */ | |
45 if (ivlen == 12) { | |
46 /* IV 32bit */ | |
47 if ((err = chacha_ivctr32(&tmp_st, iv, ivlen, 0)) != CRYPT_OK) return err; | |
48 } | |
49 else { | |
50 /* IV 64bit */ | |
51 if ((err = chacha_ivctr64(&tmp_st, iv, ivlen, 0)) != CRYPT_OK) return err; | |
52 } | |
53 /* (re)generate new poly1305 key */ | |
54 if ((err = chacha_keystream(&tmp_st, polykey, 32)) != CRYPT_OK) return err; | |
55 /* (re)initialise poly1305 */ | |
56 if ((err = poly1305_init(&st->poly, polykey, 32)) != CRYPT_OK) return err; | |
57 st->ctlen = 0; | |
58 st->aadlen = 0; | |
59 st->aadflg = 1; | |
60 | |
61 return CRYPT_OK; | |
62 } | |
63 | |
64 #endif | |
65 | |
66 /* ref: $Format:%D$ */ | |
67 /* git commit: $Format:%H$ */ | |
68 /* commit time: $Format:%ai$ */ |