Add function pointers for accelerated XTS to ltc_cipher_descriptor
Similar to what already exists for other modes. Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
This commit is contained in:
		
							parent
							
								
									99214b53f6
								
							
						
					
					
						commit
						5c3f177b34
					
				| @ -49,7 +49,7 @@ const struct ltc_cipher_descriptor rijndael_desc = | ||||
|     6, | ||||
|     16, 32, 16, 10, | ||||
|     SETUP, ECB_ENC, ECB_DEC, ECB_TEST, ECB_DONE, ECB_KS, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| const struct ltc_cipher_descriptor aes_desc = | ||||
| @ -58,7 +58,7 @@ const struct ltc_cipher_descriptor aes_desc = | ||||
|     6, | ||||
|     16, 32, 16, 10, | ||||
|     SETUP, ECB_ENC, ECB_DEC, ECB_TEST, ECB_DONE, ECB_KS, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| #else | ||||
| @ -74,7 +74,7 @@ const struct ltc_cipher_descriptor rijndael_enc_desc = | ||||
|     6, | ||||
|     16, 32, 16, 10, | ||||
|     SETUP, ECB_ENC, NULL, NULL, ECB_DONE, ECB_KS, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| const struct ltc_cipher_descriptor aes_enc_desc = | ||||
| @ -83,7 +83,7 @@ const struct ltc_cipher_descriptor aes_enc_desc = | ||||
|     6, | ||||
|     16, 32, 16, 10, | ||||
|     SETUP, ECB_ENC, NULL, NULL, ECB_DONE, ECB_KS, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -29,7 +29,7 @@ const struct ltc_cipher_descriptor anubis_desc = { | ||||
|    &anubis_test, | ||||
|    &anubis_done, | ||||
|    &anubis_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| #define MIN_N           4 | ||||
|  | ||||
| @ -27,7 +27,7 @@ const struct ltc_cipher_descriptor blowfish_desc = | ||||
|     &blowfish_test, | ||||
|     &blowfish_done, | ||||
|     &blowfish_keysize, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| static const ulong32 ORIG_P[16 + 2] = { | ||||
|  | ||||
| @ -28,7 +28,7 @@ const struct ltc_cipher_descriptor camellia_desc = { | ||||
|    &camellia_test, | ||||
|    &camellia_done, | ||||
|    &camellia_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| static const ulong32 SP1110[] = { | ||||
|  | ||||
| @ -27,7 +27,7 @@ const struct ltc_cipher_descriptor cast5_desc = { | ||||
|    &cast5_test, | ||||
|    &cast5_done, | ||||
|    &cast5_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| static const ulong32 S1[256] = { | ||||
|  | ||||
| @ -31,7 +31,7 @@ const struct ltc_cipher_descriptor des_desc = | ||||
|     &des_test, | ||||
|     &des_done, | ||||
|     &des_keysize, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| const struct ltc_cipher_descriptor des3_desc = | ||||
| @ -45,7 +45,7 @@ const struct ltc_cipher_descriptor des3_desc = | ||||
|     &des3_test, | ||||
|     &des3_done, | ||||
|     &des3_keysize, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| static const ulong32 bytebit[8] = | ||||
|  | ||||
| @ -33,7 +33,7 @@ const struct ltc_cipher_descriptor kasumi_desc = { | ||||
|    &kasumi_test, | ||||
|    &kasumi_done, | ||||
|    &kasumi_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| static u16 FI( u16 in, u16 subkey ) | ||||
|  | ||||
| @ -28,7 +28,7 @@ const struct ltc_cipher_descriptor khazad_desc = { | ||||
|    &khazad_test, | ||||
|    &khazad_done, | ||||
|    &khazad_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| #define R      8 | ||||
|  | ||||
| @ -29,7 +29,7 @@ const struct ltc_cipher_descriptor kseed_desc = { | ||||
|    &kseed_test, | ||||
|    &kseed_done, | ||||
|    &kseed_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| static const ulong32 SS0[256] = { | ||||
|  | ||||
| @ -116,7 +116,7 @@ const struct ltc_cipher_descriptor multi2_desc = { | ||||
|    &multi2_test, | ||||
|    &multi2_done, | ||||
|    &multi2_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| int  multi2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey) | ||||
|  | ||||
| @ -27,7 +27,7 @@ const struct ltc_cipher_descriptor noekeon_desc = | ||||
|     &noekeon_test, | ||||
|     &noekeon_done, | ||||
|     &noekeon_keysize, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| static const ulong32 RC[] = { | ||||
|  | ||||
| @ -36,7 +36,7 @@ const struct ltc_cipher_descriptor rc2_desc = { | ||||
|    &rc2_test, | ||||
|    &rc2_done, | ||||
|    &rc2_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| /* 256-entry permutation table, probably derived somehow from pi */ | ||||
|  | ||||
| @ -29,7 +29,7 @@ const struct ltc_cipher_descriptor rc5_desc = | ||||
|     &rc5_test, | ||||
|     &rc5_done, | ||||
|     &rc5_keysize, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| static const ulong32 stab[50] = { | ||||
|  | ||||
| @ -28,7 +28,7 @@ const struct ltc_cipher_descriptor rc6_desc = | ||||
|     &rc6_test, | ||||
|     &rc6_done, | ||||
|     &rc6_keysize, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| static const ulong32 stab[44] = { | ||||
|  | ||||
| @ -45,7 +45,7 @@ const struct ltc_cipher_descriptor | ||||
|    &safer_k64_test, | ||||
|    &safer_done, | ||||
|    &safer_64_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    }, | ||||
| 
 | ||||
|    safer_sk64_desc = { | ||||
| @ -57,7 +57,7 @@ const struct ltc_cipher_descriptor | ||||
|    &safer_sk64_test, | ||||
|    &safer_done, | ||||
|    &safer_64_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    }, | ||||
| 
 | ||||
|    safer_k128_desc = { | ||||
| @ -69,7 +69,7 @@ const struct ltc_cipher_descriptor | ||||
|    &safer_sk128_test, | ||||
|    &safer_done, | ||||
|    &safer_128_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    }, | ||||
| 
 | ||||
|    safer_sk128_desc = { | ||||
| @ -81,7 +81,7 @@ const struct ltc_cipher_descriptor | ||||
|    &safer_sk128_test, | ||||
|    &safer_done, | ||||
|    &safer_128_keysize, | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|    }; | ||||
| 
 | ||||
| /******************* Constants ************************************************/ | ||||
|  | ||||
| @ -31,7 +31,7 @@ const struct ltc_cipher_descriptor saferp_desc = | ||||
|     &saferp_test, | ||||
|     &saferp_done, | ||||
|     &saferp_keysize, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| /* ROUND(b,i)
 | ||||
|  | ||||
| @ -28,7 +28,7 @@ const struct ltc_cipher_descriptor skipjack_desc = | ||||
|     &skipjack_test, | ||||
|     &skipjack_done, | ||||
|     &skipjack_keysize, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| static const unsigned char sbox[256] = { | ||||
|  | ||||
| @ -35,7 +35,7 @@ const struct ltc_cipher_descriptor twofish_desc = | ||||
|     &twofish_test, | ||||
|     &twofish_done, | ||||
|     &twofish_keysize, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| /* the two polynomials */ | ||||
|  | ||||
| @ -28,7 +28,7 @@ const struct ltc_cipher_descriptor xtea_desc = | ||||
|     &xtea_test, | ||||
|     &xtea_done, | ||||
|     &xtea_keysize, | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
|     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | ||||
| }; | ||||
| 
 | ||||
| int xtea_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey) | ||||
|  | ||||
| @ -553,6 +553,36 @@ extern struct ltc_cipher_descriptor { | ||||
|        const unsigned char *key, unsigned long keylen, | ||||
|        const unsigned char *in,  unsigned long inlen, | ||||
|              unsigned char *out, unsigned long *outlen); | ||||
| 
 | ||||
|    /** Accelerated XTS encryption
 | ||||
|        @param pt      Plaintext | ||||
|        @param ct      Ciphertext | ||||
|        @param blocks  The number of complete blocks to process | ||||
|        @param tweak   The 128-bit encryption tweak (input/output). | ||||
|                       The tweak should not be encrypted on input, but | ||||
|                       next tweak will be copied encrypted on output. | ||||
|        @param skey1   The first scheduled key context | ||||
|        @param skey2   The second scheduled key context | ||||
|        @return CRYPT_OK if successful | ||||
|     */ | ||||
|     int (*accel_xts_encrypt)(const unsigned char *pt, unsigned char *ct, | ||||
|         unsigned long blocks, unsigned char *tweak, symmetric_key *skey1, | ||||
|         symmetric_key *skey2); | ||||
| 
 | ||||
|     /** Accelerated XTS decryption
 | ||||
|         @param ct      Ciphertext | ||||
|         @param pt      Plaintext | ||||
|         @param blocks  The number of complete blocks to process | ||||
|         @param tweak   The 128-bit encryption tweak (input/output). | ||||
|                        The tweak should not be encrypted on input, but | ||||
|                        next tweak will be copied encrypted on output. | ||||
|         @param skey1   The first scheduled key context | ||||
|         @param skey2   The second scheduled key context | ||||
|         @return CRYPT_OK if successful | ||||
|      */ | ||||
|      int (*accel_xts_decrypt)(const unsigned char *ct, unsigned char *pt, | ||||
|          unsigned long blocks, unsigned char *tweak, symmetric_key *skey1, | ||||
|          symmetric_key *skey2); | ||||
| } cipher_descriptor[]; | ||||
| 
 | ||||
| #ifdef LTC_BLOWFISH | ||||
|  | ||||
| @ -16,7 +16,7 @@ | ||||
| */ | ||||
| 
 | ||||
| struct ltc_cipher_descriptor cipher_descriptor[TAB_SIZE] = { | ||||
| { NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } | ||||
| { NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } | ||||
|  }; | ||||
| 
 | ||||
| LTC_MUTEX_GLOBAL(ltc_cipher_mutex) | ||||
|  | ||||
| @ -87,23 +87,37 @@ static int tweak_uncrypt(const unsigned char *C, unsigned char *P, unsigned char | ||||
|       return CRYPT_INVALID_ARG; | ||||
|    } | ||||
| 
 | ||||
|    /* encrypt the tweak */ | ||||
|    if ((err = cipher_descriptor[xts->cipher].ecb_encrypt(tweak, T, &xts->key2)) != CRYPT_OK) { | ||||
|       return err; | ||||
|    } | ||||
| 
 | ||||
|    /* for i = 0 to m-2 do */ | ||||
|    if (mo == 0) { | ||||
|       lim = m; | ||||
|    } else { | ||||
|       lim = m - 1; | ||||
|    } | ||||
| 
 | ||||
|    if (cipher_descriptor[xts->cipher].accel_xts_encrypt && lim > 0) { | ||||
| 
 | ||||
| 	   /* use accelerated decryption for whole blocks */ | ||||
| 	   if ((err = cipher_descriptor[xts->cipher].accel_xts_decrypt(ct, pt, | ||||
| 			lim, tweak, &xts->key1, &xts->key2) != CRYPT_OK)) { | ||||
| 	      return err; | ||||
| 	   } | ||||
| 	   ct += lim * 16; | ||||
| 	   pt += lim * 16; | ||||
| 
 | ||||
| 	   /* tweak is encrypted on output */ | ||||
| 	   XMEMCPY(T, tweak, sizeof(T)); | ||||
|    } else { | ||||
|       /* encrypt the tweak */ | ||||
|       if ((err = cipher_descriptor[xts->cipher].ecb_encrypt(tweak, T, | ||||
| 			&xts->key2)) != CRYPT_OK) { | ||||
| 	 return err; | ||||
|       } | ||||
| 
 | ||||
|       for (i = 0; i < lim; i++) { | ||||
| 	 err = tweak_uncrypt(ct, pt, T, xts); | ||||
| 	 ct += 16; | ||||
| 	 pt += 16; | ||||
|       } | ||||
|    } | ||||
|     | ||||
|    /* if ptlen not divide 16 then */ | ||||
|    if (mo > 0) { | ||||
| @ -131,7 +145,8 @@ static int tweak_uncrypt(const unsigned char *C, unsigned char *P, unsigned char | ||||
|    } | ||||
| 
 | ||||
|    /* Decrypt the tweak back */ | ||||
|    if ((err = cipher_descriptor[xts->cipher].ecb_decrypt(T, tweak, &xts->key2)) != CRYPT_OK) { | ||||
|    if ((err = cipher_descriptor[xts->cipher].ecb_decrypt(T, tweak, | ||||
| 			&xts->key2)) != CRYPT_OK) { | ||||
|       return err; | ||||
|    } | ||||
| 
 | ||||
|  | ||||
| @ -90,23 +90,38 @@ int xts_encrypt( | ||||
|       return CRYPT_INVALID_ARG; | ||||
|    } | ||||
| 
 | ||||
|    /* encrypt the tweak */ | ||||
|    if ((err = cipher_descriptor[xts->cipher].ecb_encrypt(tweak, T, &xts->key2)) != CRYPT_OK) { | ||||
|       return err; | ||||
|    } | ||||
| 
 | ||||
|    /* for i = 0 to m-2 do */ | ||||
|    if (mo == 0) { | ||||
|       lim = m; | ||||
|    } else { | ||||
|       lim = m - 1; | ||||
|    } | ||||
| 
 | ||||
|    if (cipher_descriptor[xts->cipher].accel_xts_encrypt && lim > 0) { | ||||
| 
 | ||||
|       /* use accelerated encryption for whole blocks */ | ||||
|       if ((err = cipher_descriptor[xts->cipher].accel_xts_encrypt(pt, ct, lim, | ||||
| 			tweak, &xts->key1, &xts->key2) != CRYPT_OK)) { | ||||
| 	 return err; | ||||
|       } | ||||
|       ct += lim * 16; | ||||
|       pt += lim * 16; | ||||
| 
 | ||||
|       /* tweak is encrypted on output */ | ||||
|       XMEMCPY(T, tweak, sizeof(T)); | ||||
|    } else { | ||||
| 
 | ||||
|       /* encrypt the tweak */ | ||||
|       if ((err = cipher_descriptor[xts->cipher].ecb_encrypt(tweak, T, | ||||
| 			&xts->key2)) != CRYPT_OK) { | ||||
| 	 return err; | ||||
|       } | ||||
| 
 | ||||
|       for (i = 0; i < lim; i++) { | ||||
| 	 err = tweak_crypt(pt, ct, T, xts); | ||||
| 	 ct += 16; | ||||
| 	 pt += 16; | ||||
|       } | ||||
|    } | ||||
|     | ||||
|    /* if ptlen not divide 16 then */ | ||||
|    if (mo > 0) { | ||||
| @ -132,7 +147,8 @@ int xts_encrypt( | ||||
|    } | ||||
| 
 | ||||
|    /* Decrypt the tweak back */ | ||||
|    if ((err = cipher_descriptor[xts->cipher].ecb_decrypt(T, tweak, &xts->key2)) != CRYPT_OK) { | ||||
|    if ((err = cipher_descriptor[xts->cipher].ecb_decrypt(T, tweak, | ||||
| 		&xts->key2)) != CRYPT_OK) { | ||||
|       return err; | ||||
|    } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user