| 
									
										
										
										
											2004-01-25 17:40:34 +00:00
										 |  |  | /* LibTomCrypt, modular cryptographic library -- Tom St Denis
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LibTomCrypt is a library that provides various cryptographic | 
					
						
							|  |  |  |  * algorithms in a highly modular and flexible manner. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The library is free for all purposes without any express | 
					
						
							| 
									
										
										
										
											2004-05-12 20:42:16 +00:00
										 |  |  |  * guarantee it works. | 
					
						
							| 
									
										
										
										
											2004-01-25 17:40:34 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org
 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2003-03-03 00:59:24 +00:00
										 |  |  | #include "mycrypt.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CTR
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2003-03-03 01:02:42 +00:00
										 |  |  |    int x, err; | 
					
						
							| 
									
										
										
										
											2003-03-03 00:59:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    _ARGCHK(pt != NULL); | 
					
						
							|  |  |  |    _ARGCHK(ct != NULL); | 
					
						
							|  |  |  |    _ARGCHK(ctr != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-03 01:02:42 +00:00
										 |  |  |    if ((err = cipher_is_valid(ctr->cipher)) != CRYPT_OK) { | 
					
						
							|  |  |  |        return err; | 
					
						
							| 
									
										
										
										
											2003-03-03 00:59:24 +00:00
										 |  |  |    } | 
					
						
							| 
									
										
										
										
											2003-03-13 02:12:16 +00:00
										 |  |  |     | 
					
						
							|  |  |  |    /* is blocklen/padlen valid? */ | 
					
						
							|  |  |  |    if (ctr->blocklen < 0 || ctr->blocklen > (int)sizeof(ctr->ctr) || | 
					
						
							|  |  |  |        ctr->padlen   < 0 || ctr->padlen   > (int)sizeof(ctr->pad)) { | 
					
						
							|  |  |  |       return CRYPT_INVALID_ARG; | 
					
						
							|  |  |  |    } | 
					
						
							| 
									
										
										
										
											2003-03-03 00:59:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-03 01:02:42 +00:00
										 |  |  |    while (len-- > 0) { | 
					
						
							| 
									
										
										
										
											2003-03-03 00:59:24 +00:00
										 |  |  |       /* is the pad empty? */ | 
					
						
							|  |  |  |       if (ctr->padlen == ctr->blocklen) { | 
					
						
							|  |  |  |          /* increment counter */ | 
					
						
							| 
									
										
										
										
											2004-01-25 17:40:34 +00:00
										 |  |  |          if (ctr->mode == 0) { | 
					
						
							|  |  |  |             /* little-endian */ | 
					
						
							|  |  |  |             for (x = 0; x < ctr->blocklen; x++) { | 
					
						
							|  |  |  |                ctr->ctr[x] = (ctr->ctr[x] + (unsigned char)1) & (unsigned char)255; | 
					
						
							|  |  |  |                if (ctr->ctr[x] != (unsigned char)0) { | 
					
						
							|  |  |  |                   break; | 
					
						
							|  |  |  |                } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |          } else { | 
					
						
							|  |  |  |             /* big-endian */ | 
					
						
							|  |  |  |             for (x = ctr->blocklen-1; x >= 0; x--) { | 
					
						
							|  |  |  |                ctr->ctr[x] = (ctr->ctr[x] + (unsigned char)1) & (unsigned char)255; | 
					
						
							|  |  |  |                if (ctr->ctr[x] != (unsigned char)0) { | 
					
						
							|  |  |  |                   break; | 
					
						
							|  |  |  |                } | 
					
						
							| 
									
										
										
										
											2003-03-03 00:59:24 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          /* encrypt it */ | 
					
						
							|  |  |  |          cipher_descriptor[ctr->cipher].ecb_encrypt(ctr->ctr, ctr->pad, &ctr->key); | 
					
						
							|  |  |  |          ctr->padlen = 0; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       *ct++ = *pt++ ^ ctr->pad[ctr->padlen++]; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |    return CRYPT_OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |