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