also test XTS accelerators
This commit is contained in:
		
							parent
							
								
									181d2f2df7
								
							
						
					
					
						commit
						f9c8c9c229
					
				@ -12,6 +12,54 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef LTC_XTS_MODE
 | 
					#ifdef LTC_XTS_MODE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int _xts_test_accel_xts_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long blocks,
 | 
				
			||||||
 | 
					                                       unsigned char *tweak, symmetric_key *skey1, symmetric_key *skey2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   int ret;
 | 
				
			||||||
 | 
					   symmetric_xts xts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* AES can be under rijndael or aes... try to find it */
 | 
				
			||||||
 | 
					   if ((xts.cipher = find_cipher("aes")) == -1) {
 | 
				
			||||||
 | 
					      if ((xts.cipher = find_cipher("rijndael")) == -1) {
 | 
				
			||||||
 | 
					         return CRYPT_NOP;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   void *orig = cipher_descriptor[xts.cipher].accel_xts_encrypt;
 | 
				
			||||||
 | 
					   cipher_descriptor[xts.cipher].accel_xts_encrypt = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   XMEMCPY(&xts.key1, skey1, sizeof(symmetric_key));
 | 
				
			||||||
 | 
					   XMEMCPY(&xts.key2, skey2, sizeof(symmetric_key));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ret = xts_encrypt(pt, blocks << 4, ct, tweak, &xts);
 | 
				
			||||||
 | 
					   cipher_descriptor[xts.cipher].accel_xts_encrypt = orig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int _xts_test_accel_xts_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long blocks,
 | 
				
			||||||
 | 
					                                       unsigned char *tweak, symmetric_key *skey1, symmetric_key *skey2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   int ret;
 | 
				
			||||||
 | 
					   symmetric_xts xts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* AES can be under rijndael or aes... try to find it */
 | 
				
			||||||
 | 
					   if ((xts.cipher = find_cipher("aes")) == -1) {
 | 
				
			||||||
 | 
					      if ((xts.cipher = find_cipher("rijndael")) == -1) {
 | 
				
			||||||
 | 
					         return CRYPT_NOP;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   void *orig = cipher_descriptor[xts.cipher].accel_xts_decrypt;
 | 
				
			||||||
 | 
					   cipher_descriptor[xts.cipher].accel_xts_decrypt = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   XMEMCPY(&xts.key1, skey1, sizeof(symmetric_key));
 | 
				
			||||||
 | 
					   XMEMCPY(&xts.key2, skey2, sizeof(symmetric_key));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ret = xts_decrypt(ct, blocks << 4, pt, tweak, &xts);
 | 
				
			||||||
 | 
					   cipher_descriptor[xts.cipher].accel_xts_decrypt = orig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Source donated by Elliptic Semiconductor Inc (www.ellipticsemi.com) to the LibTom Projects
 | 
					  Source donated by Elliptic Semiconductor Inc (www.ellipticsemi.com) to the LibTom Projects
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -147,7 +195,7 @@ int xts_test(void)
 | 
				
			|||||||
   unsigned char OUT[512], Torg[16], T[16];
 | 
					   unsigned char OUT[512], Torg[16], T[16];
 | 
				
			||||||
   ulong64 seq;
 | 
					   ulong64 seq;
 | 
				
			||||||
   symmetric_xts xts;
 | 
					   symmetric_xts xts;
 | 
				
			||||||
   int i, j, err, idx;
 | 
					   int i, j, k, err, idx;
 | 
				
			||||||
   unsigned long len;
 | 
					   unsigned long len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* AES can be under rijndael or aes... try to find it */
 | 
					   /* AES can be under rijndael or aes... try to find it */
 | 
				
			||||||
@ -156,89 +204,102 @@ int xts_test(void)
 | 
				
			|||||||
         return CRYPT_NOP;
 | 
					         return CRYPT_NOP;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   for (j = 0; j < 2; j++) {
 | 
					   for (k = 0; k < 4; ++k) {
 | 
				
			||||||
      for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) {
 | 
					      cipher_descriptor[idx].accel_xts_encrypt = NULL;
 | 
				
			||||||
         /* skip the cases where
 | 
					      cipher_descriptor[idx].accel_xts_decrypt = NULL;
 | 
				
			||||||
          * the length is smaller than 2*blocklen
 | 
					      if (k & 0x1) {
 | 
				
			||||||
          * or the length is not a multiple of 32
 | 
					         cipher_descriptor[idx].accel_xts_encrypt = _xts_test_accel_xts_encrypt;
 | 
				
			||||||
          */
 | 
					      }
 | 
				
			||||||
         if ((j == 1) && ((tests[i].PTLEN < 32) || (tests[i].PTLEN % 32))) {
 | 
					      if (k & 0x2) {
 | 
				
			||||||
            continue;
 | 
					         cipher_descriptor[idx].accel_xts_decrypt = _xts_test_accel_xts_decrypt;
 | 
				
			||||||
         }
 | 
					      }
 | 
				
			||||||
         len = tests[i].PTLEN / 2;
 | 
					      for (j = 0; j < 2; j++) {
 | 
				
			||||||
 | 
					         for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) {
 | 
				
			||||||
 | 
					            /* skip the cases where
 | 
				
			||||||
 | 
					             * the length is smaller than 2*blocklen
 | 
				
			||||||
 | 
					             * or the length is not a multiple of 32
 | 
				
			||||||
 | 
					             */
 | 
				
			||||||
 | 
					            if ((j == 1) && ((tests[i].PTLEN < 32) || (tests[i].PTLEN % 32))) {
 | 
				
			||||||
 | 
					               continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if ((k > 0) && (j == 1)) {
 | 
				
			||||||
 | 
					               continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            len = tests[i].PTLEN / 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         err = xts_start(idx, tests[i].key1, tests[i].key2, tests[i].keylen / 2, 0, &xts);
 | 
					            err = xts_start(idx, tests[i].key1, tests[i].key2, tests[i].keylen / 2, 0, &xts);
 | 
				
			||||||
         if (err != CRYPT_OK) {
 | 
					 | 
				
			||||||
            return err;
 | 
					 | 
				
			||||||
         }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
         seq = tests[i].seqnum;
 | 
					 | 
				
			||||||
         STORE64L(seq, Torg);
 | 
					 | 
				
			||||||
         XMEMSET(Torg + 8, 0, 8);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
         XMEMCPY(T, Torg, sizeof(T));
 | 
					 | 
				
			||||||
         if (j == 0) {
 | 
					 | 
				
			||||||
            err = xts_encrypt(tests[i].PTX, tests[i].PTLEN, OUT, T, &xts);
 | 
					 | 
				
			||||||
            if (err != CRYPT_OK) {
 | 
					            if (err != CRYPT_OK) {
 | 
				
			||||||
               xts_done(&xts);
 | 
					 | 
				
			||||||
               return err;
 | 
					               return err;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
         } else {
 | 
					 | 
				
			||||||
            err = xts_encrypt(tests[i].PTX, len, OUT, T, &xts);
 | 
					 | 
				
			||||||
            if (err != CRYPT_OK) {
 | 
					 | 
				
			||||||
               xts_done(&xts);
 | 
					 | 
				
			||||||
               return err;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            err = xts_encrypt(&tests[i].PTX[len], len, &OUT[len], T, &xts);
 | 
					 | 
				
			||||||
            if (err != CRYPT_OK) {
 | 
					 | 
				
			||||||
               xts_done(&xts);
 | 
					 | 
				
			||||||
               return err;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
         }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
         if (XMEMCMP(OUT, tests[i].CTX, tests[i].PTLEN)) {
 | 
					            seq = tests[i].seqnum;
 | 
				
			||||||
 | 
					            STORE64L(seq, Torg);
 | 
				
			||||||
 | 
					            XMEMSET(Torg + 8, 0, 8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            XMEMCPY(T, Torg, sizeof(T));
 | 
				
			||||||
 | 
					            if (j == 0) {
 | 
				
			||||||
 | 
					               err = xts_encrypt(tests[i].PTX, tests[i].PTLEN, OUT, T, &xts);
 | 
				
			||||||
 | 
					               if (err != CRYPT_OK) {
 | 
				
			||||||
 | 
					                  xts_done(&xts);
 | 
				
			||||||
 | 
					                  return err;
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					               err = xts_encrypt(tests[i].PTX, len, OUT, T, &xts);
 | 
				
			||||||
 | 
					               if (err != CRYPT_OK) {
 | 
				
			||||||
 | 
					                  xts_done(&xts);
 | 
				
			||||||
 | 
					                  return err;
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					               err = xts_encrypt(&tests[i].PTX[len], len, &OUT[len], T, &xts);
 | 
				
			||||||
 | 
					               if (err != CRYPT_OK) {
 | 
				
			||||||
 | 
					                  xts_done(&xts);
 | 
				
			||||||
 | 
					                  return err;
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (XMEMCMP(OUT, tests[i].CTX, tests[i].PTLEN)) {
 | 
				
			||||||
#ifdef LTC_TEST_DBG
 | 
					#ifdef LTC_TEST_DBG
 | 
				
			||||||
            printf("\nTestcase #%d with original length %lu and half of it "
 | 
					               printf("\nTestcase #%d with original length %lu and half of it "
 | 
				
			||||||
                   "%lu\n",
 | 
					                      "%lu\n",
 | 
				
			||||||
                   i, tests[i].PTLEN, len);
 | 
					                      i, tests[i].PTLEN, len);
 | 
				
			||||||
            printf("\nencrypt\n");
 | 
					               printf("\nencrypt\n");
 | 
				
			||||||
            print_hex("should", tests[i].CTX, tests[i].PTLEN);
 | 
					               print_hex("should", tests[i].CTX, tests[i].PTLEN);
 | 
				
			||||||
            print_hex("is", OUT, tests[i].PTLEN);
 | 
					               print_hex("is", OUT, tests[i].PTLEN);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
            xts_done(&xts);
 | 
					               xts_done(&xts);
 | 
				
			||||||
            return CRYPT_FAIL_TESTVECTOR;
 | 
					               return CRYPT_FAIL_TESTVECTOR;
 | 
				
			||||||
         }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         XMEMCPY(T, Torg, sizeof(T));
 | 
					            XMEMCPY(T, Torg, sizeof(T));
 | 
				
			||||||
         if (j == 0) {
 | 
					            if (j == 0) {
 | 
				
			||||||
            err = xts_decrypt(tests[i].CTX, tests[i].PTLEN, OUT, T, &xts);
 | 
					               err = xts_decrypt(tests[i].CTX, tests[i].PTLEN, OUT, T, &xts);
 | 
				
			||||||
            if (err != CRYPT_OK) {
 | 
					               if (err != CRYPT_OK) {
 | 
				
			||||||
               xts_done(&xts);
 | 
					                  xts_done(&xts);
 | 
				
			||||||
               return err;
 | 
					                  return err;
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					               err = xts_decrypt(tests[i].CTX, len, OUT, T, &xts);
 | 
				
			||||||
 | 
					               if (err != CRYPT_OK) {
 | 
				
			||||||
 | 
					                  xts_done(&xts);
 | 
				
			||||||
 | 
					                  return err;
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					               err = xts_decrypt(&tests[i].CTX[len], len, &OUT[len], T, &xts);
 | 
				
			||||||
 | 
					               if (err != CRYPT_OK) {
 | 
				
			||||||
 | 
					                  xts_done(&xts);
 | 
				
			||||||
 | 
					                  return err;
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
         } else {
 | 
					 | 
				
			||||||
            err = xts_decrypt(tests[i].CTX, len, OUT, T, &xts);
 | 
					 | 
				
			||||||
            if (err != CRYPT_OK) {
 | 
					 | 
				
			||||||
               xts_done(&xts);
 | 
					 | 
				
			||||||
               return err;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            err = xts_decrypt(&tests[i].CTX[len], len, &OUT[len], T, &xts);
 | 
					 | 
				
			||||||
            if (err != CRYPT_OK) {
 | 
					 | 
				
			||||||
               xts_done(&xts);
 | 
					 | 
				
			||||||
               return err;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
         }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
         if (XMEMCMP(OUT, tests[i].PTX, tests[i].PTLEN)) {
 | 
					            if (XMEMCMP(OUT, tests[i].PTX, tests[i].PTLEN)) {
 | 
				
			||||||
#ifdef LTC_TEST_DBG
 | 
					#ifdef LTC_TEST_DBG
 | 
				
			||||||
            printf("\ndecrypt\n");
 | 
					               printf("\ndecrypt\n");
 | 
				
			||||||
            print_hex("should", tests[i].PTX, tests[i].PTLEN);
 | 
					               print_hex("should", tests[i].PTX, tests[i].PTLEN);
 | 
				
			||||||
            print_hex("is", OUT, tests[i].PTLEN);
 | 
					               print_hex("is", OUT, tests[i].PTLEN);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					               xts_done(&xts);
 | 
				
			||||||
 | 
					               return CRYPT_FAIL_TESTVECTOR;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            xts_done(&xts);
 | 
					            xts_done(&xts);
 | 
				
			||||||
            return CRYPT_FAIL_TESTVECTOR;
 | 
					 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
         xts_done(&xts);
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   return CRYPT_OK;
 | 
					   return CRYPT_OK;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user