annotate libtomcrypt/src/modes/ctr/ctr_encrypt.c @ 1902:4a6725ac957c

Revert "Don't include sk keys at all in KEX list" This reverts git commit f972813ecdc7bb981d25b5a63638bd158f1c8e72. The sk algorithms need to remain in the sigalgs list so that they are included in the server-sig-algs ext-info message sent by the server. RFC8308 for server-sig-algs requires that all algorithms are listed (though OpenSSH client 8.4p1 tested doesn't require that)
author Matt Johnston <matt@ucc.asn.au>
date Thu, 24 Mar 2022 13:42:08 +0800
parents e9dba7abd939
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
285
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
2 *
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
3 * LibTomCrypt is a library that provides various cryptographic
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
4 * algorithms in a highly modular and flexible manner.
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
5 *
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
6 * The library is free for all purposes without any express
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
7 * guarantee it works.
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
8 */
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
9 #include "tomcrypt.h"
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
10
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
11 /**
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
12 @file ctr_encrypt.c
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
13 CTR implementation, encrypt data, Tom St Denis
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
14 */
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
15
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
16
382
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
17 #ifdef LTC_CTR_MODE
285
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
18
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
19 /**
1711
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
20 CTR encrypt software implementation
285
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
21 @param pt Plaintext
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
22 @param ct [out] Ciphertext
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
23 @param len Length of plaintext (octets)
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
24 @param ctr CTR state
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
25 @return CRYPT_OK if successful
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
26 */
1711
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
27 static int _ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr)
285
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
28 {
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
29 int x, err;
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
30
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
31 while (len) {
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
32 /* is the pad empty? */
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
33 if (ctr->padlen == ctr->blocklen) {
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
34 /* increment counter */
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
35 if (ctr->mode == CTR_COUNTER_LITTLE_ENDIAN) {
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
36 /* little-endian */
1435
f849a5ca2efc update to libtomcrypt 1.17 (with Dropbear changes)
Matt Johnston <matt@ucc.asn.au>
parents: 382
diff changeset
37 for (x = 0; x < ctr->ctrlen; x++) {
285
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
38 ctr->ctr[x] = (ctr->ctr[x] + (unsigned char)1) & (unsigned char)255;
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
39 if (ctr->ctr[x] != (unsigned char)0) {
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
40 break;
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
41 }
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
42 }
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
43 } else {
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
44 /* big-endian */
1435
f849a5ca2efc update to libtomcrypt 1.17 (with Dropbear changes)
Matt Johnston <matt@ucc.asn.au>
parents: 382
diff changeset
45 for (x = ctr->blocklen-1; x >= ctr->ctrlen; x--) {
285
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
46 ctr->ctr[x] = (ctr->ctr[x] + (unsigned char)1) & (unsigned char)255;
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
47 if (ctr->ctr[x] != (unsigned char)0) {
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
48 break;
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
49 }
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
50 }
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
51 }
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
52
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
53 /* encrypt it */
382
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
54 if ((err = cipher_descriptor[ctr->cipher].ecb_encrypt(ctr->ctr, ctr->pad, &ctr->key)) != CRYPT_OK) {
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
55 return err;
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
56 }
285
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
57 ctr->padlen = 0;
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
58 }
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
59 #ifdef LTC_FAST
1711
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
60 if ((ctr->padlen == 0) && (len >= (unsigned long)ctr->blocklen)) {
285
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
61 for (x = 0; x < ctr->blocklen; x += sizeof(LTC_FAST_TYPE)) {
1471
6dba84798cd5 Update to libtomcrypt 1.18.1, merged with Dropbear changes
Matt Johnston <matt@ucc.asn.au>
parents: 1435
diff changeset
62 *(LTC_FAST_TYPE_PTR_CAST((unsigned char *)ct + x)) = *(LTC_FAST_TYPE_PTR_CAST((unsigned char *)pt + x)) ^
6dba84798cd5 Update to libtomcrypt 1.18.1, merged with Dropbear changes
Matt Johnston <matt@ucc.asn.au>
parents: 1435
diff changeset
63 *(LTC_FAST_TYPE_PTR_CAST((unsigned char *)ctr->pad + x));
285
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
64 }
382
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
65 pt += ctr->blocklen;
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
66 ct += ctr->blocklen;
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
67 len -= ctr->blocklen;
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
68 ctr->padlen = ctr->blocklen;
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
69 continue;
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
70 }
1471
6dba84798cd5 Update to libtomcrypt 1.18.1, merged with Dropbear changes
Matt Johnston <matt@ucc.asn.au>
parents: 1435
diff changeset
71 #endif
382
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
72 *ct++ = *pt++ ^ ctr->pad[ctr->padlen++];
0cbe8f6dbf9e propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
Matt Johnston <matt@ucc.asn.au>
parents: 285
diff changeset
73 --len;
285
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
74 }
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
75 return CRYPT_OK;
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
76 }
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
77
1711
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
78 /**
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
79 CTR encrypt
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
80 @param pt Plaintext
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
81 @param ct [out] Ciphertext
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
82 @param len Length of plaintext (octets)
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
83 @param ctr CTR state
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
84 @return CRYPT_OK if successful
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
85 */
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
86 int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr)
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
87 {
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
88 int err, fr;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
89
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
90 LTC_ARGCHK(pt != NULL);
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
91 LTC_ARGCHK(ct != NULL);
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
92 LTC_ARGCHK(ctr != NULL);
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
93
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
94 if ((err = cipher_is_valid(ctr->cipher)) != CRYPT_OK) {
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
95 return err;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
96 }
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
97
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
98 /* is blocklen/padlen valid? */
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
99 if ((ctr->blocklen < 1) || (ctr->blocklen > (int)sizeof(ctr->ctr)) ||
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
100 (ctr->padlen < 0) || (ctr->padlen > (int)sizeof(ctr->pad))) {
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
101 return CRYPT_INVALID_ARG;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
102 }
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
103
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
104 #ifdef LTC_FAST
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
105 if (ctr->blocklen % sizeof(LTC_FAST_TYPE)) {
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
106 return CRYPT_INVALID_ARG;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
107 }
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
108 #endif
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
109
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
110 /* handle acceleration only if pad is empty, accelerator is present and length is >= a block size */
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
111 if ((cipher_descriptor[ctr->cipher].accel_ctr_encrypt != NULL) && (len >= (unsigned long)ctr->blocklen)) {
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
112 if (ctr->padlen < ctr->blocklen) {
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
113 fr = ctr->blocklen - ctr->padlen;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
114 if ((err = _ctr_encrypt(pt, ct, fr, ctr)) != CRYPT_OK) {
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
115 return err;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
116 }
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
117 pt += fr;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
118 ct += fr;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
119 len -= fr;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
120 }
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
121
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
122 if (len >= (unsigned long)ctr->blocklen) {
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
123 if ((err = cipher_descriptor[ctr->cipher].accel_ctr_encrypt(pt, ct, len/ctr->blocklen, ctr->ctr, ctr->mode, &ctr->key)) != CRYPT_OK) {
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
124 return err;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
125 }
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
126 pt += (len / ctr->blocklen) * ctr->blocklen;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
127 ct += (len / ctr->blocklen) * ctr->blocklen;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
128 len %= ctr->blocklen;
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
129 }
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
130 }
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
131
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
132 return _ctr_encrypt(pt, ct, len, ctr);
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
133 }
e9dba7abd939 Merge libtomcrypt v1.18.2
Matt Johnston <matt@ucc.asn.au>
parents: 1471
diff changeset
134
285
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
135 #endif
1b9e69c058d2 propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 20dccfc09627970a312d77fb41dc2970b62689c3)
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
136
1471
6dba84798cd5 Update to libtomcrypt 1.18.1, merged with Dropbear changes
Matt Johnston <matt@ucc.asn.au>
parents: 1435
diff changeset
137 /* ref: $Format:%D$ */
6dba84798cd5 Update to libtomcrypt 1.18.1, merged with Dropbear changes
Matt Johnston <matt@ucc.asn.au>
parents: 1435
diff changeset
138 /* git commit: $Format:%H$ */
6dba84798cd5 Update to libtomcrypt 1.18.1, merged with Dropbear changes
Matt Johnston <matt@ucc.asn.au>
parents: 1435
diff changeset
139 /* commit time: $Format:%ai$ */