예제 #1
0
void
twofish_xts_crypt(struct twofish_xts_ctx *ctx, u_int8_t *data, u_int8_t *iv,
    u_int do_encrypt)
{
	u_int8_t block[TWOFISH_XTS_BLOCK_LEN];
	u_int i, carry_in, carry_out;

	for (i = 0; i < TWOFISH_XTS_BLOCK_LEN; i++)
		block[i] = data[i] ^ iv[i];

	if (do_encrypt)
		twofish_encrypt(&ctx->key1, block, data);
	else
		twofish_decrypt(&ctx->key1, block, data);

	for (i = 0; i < TWOFISH_XTS_BLOCK_LEN; i++)
		data[i] ^= iv[i];

	/* Exponentiate tweak */
	carry_in = 0;
	for (i = 0; i < TWOFISH_XTS_BLOCK_LEN; i++) {
		carry_out = iv[i] & 0x80;
		iv[i] = (iv[i] << 1) | (carry_in ? 1 : 0);
		carry_in = carry_out;
	}
	if (carry_in)
		iv[0] ^= AES_XTS_ALPHA;
	bzero(block, sizeof(block));
}
예제 #2
0
파일: Crypto.c 프로젝트: IsNull/TCBrute
void DecipherBlock(int cipher, void *data, void *ks)
{
	switch (cipher)
	{
	case SERPENT:	serpent_decrypt (data, data, ks); break;
	case TWOFISH:	twofish_decrypt (ks, data, data); break;
#ifndef TC_WINDOWS_BOOT

	case AES:
#if defined (_WIN64) || !defined (TC_WINDOWS_DRIVER)
		if (IsAesHwCpuSupported())
			aes_hw_cpu_decrypt ((byte *) ks + sizeof (aes_encrypt_ctx), data);
		else
#endif
			aes_decrypt (data, data, (void *) ((char *) ks + sizeof(aes_encrypt_ctx)));
		break;

	case BLOWFISH:	BlowfishEncryptLE (data, data, ks, 0); break;	// Deprecated/legacy
	case CAST:		Cast5Decrypt (data, data, ks); break;			// Deprecated/legacy
	case TRIPLEDES:	TripleDesEncrypt (data, data, ks, 0); break;	// Deprecated/legacy
#else
	case AES:		aes_decrypt (data, data, ks); break;
#endif
	default:		TC_THROW_FATAL_EXCEPTION;	// Unknown/wrong ID
	}
}
예제 #3
0
void DecipherBlock(int cipher, void *data, void *ks)
{
#ifdef GST_WINDOWS_BOOT_AES
	if (IsAesHwCpuSupported())
		aes_hw_cpu_decrypt ((byte *) ks + sizeof (aes_encrypt_ctx) + 14 * 16, data);
	else
		aes_decrypt (data, data, (aes_decrypt_ctx *) ((byte *) ks + sizeof(aes_encrypt_ctx))); 
#elif defined (GST_WINDOWS_BOOT_SERPENT)
	serpent_decrypt (data, data, ks);
#elif defined (GST_WINDOWS_BOOT_TWOFISH)
	twofish_decrypt (ks, data, data);
#endif
}
예제 #4
0
	// Twofish
	void CipherTwofish::Decrypt (byte *data) const
	{
		twofish_decrypt ((TwofishInstance *) ScheduledKey.Ptr(), (unsigned int *)data, (unsigned int *)data);
	}
예제 #5
0
파일: twofish.c 프로젝트: vonwenm/FreeVMS
int
main()
{
  TWOFISH_context ctx;     /* Expanded key. */
  int i, j;		    /* Loop counters. */

  const char *encrypt_msg; /* Message to print regarding encryption test;
                            * the printf is done outside the loop to avoid
                            * stuffing up the timing. */
  clock_t timer; /* For computing elapsed time. */

  /* Test buffer. */
  byte buffer[4][16] = {
    {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
     0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF},
    {0x0F, 0x1E, 0x2D, 0x3C, 0x4B, 0x5A, 0x69, 0x78,
     0x87, 0x96, 0xA5, 0xB4, 0xC3, 0xD2 ,0xE1, 0xF0},
    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54 ,0x32, 0x10},
    {0x01, 0x23, 0x45, 0x67, 0x76, 0x54 ,0x32, 0x10,
     0x89, 0xAB, 0xCD, 0xEF, 0xFE, 0xDC, 0xBA, 0x98}
  };

  /* Expected outputs for the million-operation test */
  static const byte test_encrypt[4][16] = {
    {0xC8, 0x23, 0xB8, 0xB7, 0x6B, 0xFE, 0x91, 0x13,
     0x2F, 0xA7, 0x5E, 0xE6, 0x94, 0x77, 0x6F, 0x6B},
    {0x90, 0x36, 0xD8, 0x29, 0xD5, 0x96, 0xC2, 0x8E,
     0xE4, 0xFF, 0x76, 0xBC, 0xE5, 0x77, 0x88, 0x27},
    {0xB8, 0x78, 0x69, 0xAF, 0x42, 0x8B, 0x48, 0x64,
     0xF7, 0xE9, 0xF3, 0x9C, 0x42, 0x18, 0x7B, 0x73},
    {0x7A, 0x88, 0xFB, 0xEB, 0x90, 0xA4, 0xB4, 0xA8,
     0x43, 0xA3, 0x1D, 0xF1, 0x26, 0xC4, 0x53, 0x57}
  };
  static const byte test_decrypt[4][16] = {
    {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
     0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF},
    {0x0F, 0x1E, 0x2D, 0x3C, 0x4B, 0x5A, 0x69, 0x78,
     0x87, 0x96, 0xA5, 0xB4, 0xC3, 0xD2 ,0xE1, 0xF0},
    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54 ,0x32, 0x10},
    {0x01, 0x23, 0x45, 0x67, 0x76, 0x54 ,0x32, 0x10,
     0x89, 0xAB, 0xCD, 0xEF, 0xFE, 0xDC, 0xBA, 0x98}
  };

  /* Start the timer ticking. */
  timer = clock ();

  /* Encryption test. */
  for (i = 0; i < 125; i++) 
    {
      twofish_setkey (&ctx, buffer[0], sizeof (buffer[0]));
      for (j = 0; j < 1000; j++)
        twofish_encrypt (&ctx, buffer[2], buffer[2]);
      twofish_setkey (&ctx, buffer[1], sizeof (buffer[1]));
      for (j = 0; j < 1000; j++)
        twofish_encrypt (&ctx, buffer[3], buffer[3]);
      twofish_setkey (&ctx, buffer[2], sizeof (buffer[2])*2);
      for (j = 0; j < 1000; j++) {
        twofish_encrypt (&ctx, buffer[0], buffer[0]);
        twofish_encrypt (&ctx, buffer[1], buffer[1]);
      }
    }
  encrypt_msg = memcmp (buffer, test_encrypt, sizeof (test_encrypt)) ?
    "encryption failure!\n" : "encryption OK!\n";

  /* Decryption test. */
  for (i = 0; i < 125; i++) 
    {
      twofish_setkey (&ctx, buffer[2], sizeof (buffer[2])*2);
      for (j = 0; j < 1000; j++) {
        twofish_decrypt (&ctx, buffer[0], buffer[0]);
        twofish_decrypt (&ctx, buffer[1], buffer[1]);
      }
      twofish_setkey (&ctx, buffer[1], sizeof (buffer[1]));
      for (j = 0; j < 1000; j++)
        twofish_decrypt (&ctx, buffer[3], buffer[3]);
      twofish_setkey (&ctx, buffer[0], sizeof (buffer[0]));
      for (j = 0; j < 1000; j++)
        twofish_decrypt (&ctx, buffer[2], buffer[2]);
    }

  /* Stop the timer, and print results. */
  timer = clock () - timer;
  printf (encrypt_msg);
  printf (memcmp (buffer, test_decrypt, sizeof (test_decrypt)) ?
          "decryption failure!\n" : "decryption OK!\n");
  printf ("elapsed time: %.1f s.\n", (float) timer / CLOCKS_PER_SEC);

  return 0;
}
예제 #6
0
static void
twofish128_decrypt(caddr_t key, u_int8_t *blk, u_int8_t *iv)
{
	twofish_decrypt(((twofish_ctx *) key), blk, blk);
}