Skip to content

Commit 24aab18

Browse files
committed
Merge pull request #359 from vchong/ltc_ctr
ltc: ctr: improve performance (cherry picked from commit 9b80d07)
1 parent affb3d7 commit 24aab18

1 file changed

Lines changed: 60 additions & 33 deletions

File tree

src/modes/ctr/ctr_encrypt.c

Lines changed: 60 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,47 +17,17 @@
1717
#ifdef LTC_CTR_MODE
1818

1919
/**
20-
CTR encrypt
20+
CTR encrypt software implementation
2121
@param pt Plaintext
2222
@param ct [out] Ciphertext
2323
@param len Length of plaintext (octets)
2424
@param ctr CTR state
2525
@return CRYPT_OK if successful
2626
*/
27-
int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr)
27+
static int _ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr)
2828
{
2929
int x, err;
3030

31-
LTC_ARGCHK(pt != NULL);
32-
LTC_ARGCHK(ct != NULL);
33-
LTC_ARGCHK(ctr != NULL);
34-
35-
if ((err = cipher_is_valid(ctr->cipher)) != CRYPT_OK) {
36-
return err;
37-
}
38-
39-
/* is blocklen/padlen valid? */
40-
if (ctr->blocklen < 1 || ctr->blocklen > (int)sizeof(ctr->ctr) ||
41-
ctr->padlen < 0 || ctr->padlen > (int)sizeof(ctr->pad)) {
42-
return CRYPT_INVALID_ARG;
43-
}
44-
45-
#ifdef LTC_FAST
46-
if (ctr->blocklen % sizeof(LTC_FAST_TYPE)) {
47-
return CRYPT_INVALID_ARG;
48-
}
49-
#endif
50-
51-
/* handle acceleration only if pad is empty, accelerator is present and length is >= a block size */
52-
if ((ctr->padlen == ctr->blocklen) && cipher_descriptor[ctr->cipher].accel_ctr_encrypt != NULL && (len >= (unsigned long)ctr->blocklen)) {
53-
if ((err = cipher_descriptor[ctr->cipher].accel_ctr_encrypt(pt, ct, len/ctr->blocklen, ctr->ctr, ctr->mode, &ctr->key)) != CRYPT_OK) {
54-
return err;
55-
}
56-
pt += (len / ctr->blocklen) * ctr->blocklen;
57-
ct += (len / ctr->blocklen) * ctr->blocklen;
58-
len %= ctr->blocklen;
59-
}
60-
6131
while (len) {
6232
/* is the pad empty? */
6333
if (ctr->padlen == ctr->blocklen) {
@@ -87,7 +57,7 @@ int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, s
8757
ctr->padlen = 0;
8858
}
8959
#ifdef LTC_FAST
90-
if (ctr->padlen == 0 && len >= (unsigned long)ctr->blocklen) {
60+
if ((ctr->padlen == 0) && (len >= (unsigned long)ctr->blocklen)) {
9161
for (x = 0; x < ctr->blocklen; x += sizeof(LTC_FAST_TYPE)) {
9262
*(LTC_FAST_TYPE_PTR_CAST((unsigned char *)ct + x)) = *(LTC_FAST_TYPE_PTR_CAST((unsigned char *)pt + x)) ^
9363
*(LTC_FAST_TYPE_PTR_CAST((unsigned char *)ctr->pad + x));
@@ -105,6 +75,63 @@ int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, s
10575
return CRYPT_OK;
10676
}
10777

78+
/**
79+
CTR encrypt
80+
@param pt Plaintext
81+
@param ct [out] Ciphertext
82+
@param len Length of plaintext (octets)
83+
@param ctr CTR state
84+
@return CRYPT_OK if successful
85+
*/
86+
int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr)
87+
{
88+
int err, fr;
89+
90+
LTC_ARGCHK(pt != NULL);
91+
LTC_ARGCHK(ct != NULL);
92+
LTC_ARGCHK(ctr != NULL);
93+
94+
if ((err = cipher_is_valid(ctr->cipher)) != CRYPT_OK) {
95+
return err;
96+
}
97+
98+
/* is blocklen/padlen valid? */
99+
if ((ctr->blocklen < 1) || (ctr->blocklen > (int)sizeof(ctr->ctr)) ||
100+
(ctr->padlen < 0) || (ctr->padlen > (int)sizeof(ctr->pad))) {
101+
return CRYPT_INVALID_ARG;
102+
}
103+
104+
#ifdef LTC_FAST
105+
if (ctr->blocklen % sizeof(LTC_FAST_TYPE)) {
106+
return CRYPT_INVALID_ARG;
107+
}
108+
#endif
109+
110+
/* handle acceleration only if pad is empty, accelerator is present and length is >= a block size */
111+
if ((cipher_descriptor[ctr->cipher].accel_ctr_encrypt != NULL) && (len >= (unsigned long)ctr->blocklen)) {
112+
if (ctr->padlen < ctr->blocklen) {
113+
fr = ctr->blocklen - ctr->padlen;
114+
if ((err = _ctr_encrypt(pt, ct, fr, ctr)) != CRYPT_OK) {
115+
return err;
116+
}
117+
pt += fr;
118+
ct += fr;
119+
len -= fr;
120+
}
121+
122+
if (len >= (unsigned long)ctr->blocklen) {
123+
if ((err = cipher_descriptor[ctr->cipher].accel_ctr_encrypt(pt, ct, len/ctr->blocklen, ctr->ctr, ctr->mode, &ctr->key)) != CRYPT_OK) {
124+
return err;
125+
}
126+
pt += (len / ctr->blocklen) * ctr->blocklen;
127+
ct += (len / ctr->blocklen) * ctr->blocklen;
128+
len %= ctr->blocklen;
129+
}
130+
}
131+
132+
return _ctr_encrypt(pt, ct, len, ctr);
133+
}
134+
108135
#endif
109136

110137
/* ref: $Format:%D$ */

0 commit comments

Comments
 (0)