Beispiel #1
0
static unsigned int
camellia_decrypt(void *c, byte *outbuf, const byte *inbuf)
{
  CAMELLIA_context *ctx=c;
  Camellia_DecryptBlock(ctx->keybitlength,inbuf,ctx->keytable,outbuf);
#define CAMELLIA_decrypt_stack_burn_size (15*4)
  return /*burn_stack*/ (CAMELLIA_decrypt_stack_burn_size);
}
Beispiel #2
0
static unsigned int
camellia_decrypt(void *c, byte *outbuf, const byte *inbuf)
{
  CAMELLIA_context *ctx=c;

  Camellia_DecryptBlock(ctx->keybitlength,inbuf,ctx->keytable,outbuf);

#define CAMELLIA_decrypt_stack_burn_size \
    (sizeof(int)+2*sizeof(unsigned char *)+sizeof(void*/*KEY_TABLE_TYPE*/) \
     +4*sizeof(u32)+4*sizeof(u32) \
     +2*sizeof(u32*)+4*sizeof(u32) \
     +2*2*sizeof(void*) /* Function calls.  */ \
    )

  return /*burn_stack*/ (CAMELLIA_decrypt_stack_burn_size);
}
Beispiel #3
0
void
CAMELLIA_decrypt(const unsigned char *in, unsigned char *out,
                 const CAMELLIA_KEY *key)
{
    Camellia_DecryptBlock(key->bits, in, key->key, out);
}
Beispiel #4
0
/* Bulk decryption of complete blocks in CBC mode.  This function is only
   intended for the bulk encryption feature of cipher.c. */
void
_gcry_camellia_cbc_dec(void *context, unsigned char *iv,
                       void *outbuf_arg, const void *inbuf_arg,
                       size_t nblocks)
{
  CAMELLIA_context *ctx = context;
  unsigned char *outbuf = outbuf_arg;
  const unsigned char *inbuf = inbuf_arg;
  unsigned char savebuf[CAMELLIA_BLOCK_SIZE];
  int burn_stack_depth = CAMELLIA_decrypt_stack_burn_size;

#ifdef USE_AESNI_AVX2
  if (ctx->use_aesni_avx2)
    {
      int did_use_aesni_avx2 = 0;

      /* Process data in 32 block chunks. */
      while (nblocks >= 32)
        {
          _gcry_camellia_aesni_avx2_cbc_dec(ctx, outbuf, inbuf, iv);

          nblocks -= 32;
          outbuf += 32 * CAMELLIA_BLOCK_SIZE;
          inbuf  += 32 * CAMELLIA_BLOCK_SIZE;
          did_use_aesni_avx2 = 1;
        }

      if (did_use_aesni_avx2)
        {
          int avx2_burn_stack_depth = 32 * CAMELLIA_BLOCK_SIZE + 16 +
                                        2 * sizeof(void *) + ASM_EXTRA_STACK;;

          if (burn_stack_depth < avx2_burn_stack_depth)
            burn_stack_depth = avx2_burn_stack_depth;
        }

      /* Use generic code to handle smaller chunks... */
    }
#endif

#ifdef USE_AESNI_AVX
  if (ctx->use_aesni_avx)
    {
      int did_use_aesni_avx = 0;

      /* Process data in 16 block chunks. */
      while (nblocks >= 16)
        {
          _gcry_camellia_aesni_avx_cbc_dec(ctx, outbuf, inbuf, iv);

          nblocks -= 16;
          outbuf += 16 * CAMELLIA_BLOCK_SIZE;
          inbuf  += 16 * CAMELLIA_BLOCK_SIZE;
          did_use_aesni_avx = 1;
        }

      if (did_use_aesni_avx)
        {
          int avx_burn_stack_depth = 16 * CAMELLIA_BLOCK_SIZE +
                                       2 * sizeof(void *) + ASM_EXTRA_STACK;

          if (burn_stack_depth < avx_burn_stack_depth)
            burn_stack_depth = avx_burn_stack_depth;
        }

      /* Use generic code to handle smaller chunks... */
    }
#endif

  for ( ;nblocks; nblocks-- )
    {
      /* INBUF is needed later and it may be identical to OUTBUF, so store
         the intermediate result to SAVEBUF.  */
      Camellia_DecryptBlock(ctx->keybitlength, inbuf, ctx->keytable, savebuf);

      buf_xor_n_copy_2(outbuf, savebuf, iv, inbuf, CAMELLIA_BLOCK_SIZE);
      inbuf += CAMELLIA_BLOCK_SIZE;
      outbuf += CAMELLIA_BLOCK_SIZE;
    }

  wipememory(savebuf, sizeof(savebuf));
  _gcry_burn_stack(burn_stack_depth);
}
Beispiel #5
0
int main()

 
{

 


	unsigned char key[] = {0x8C, 0x51, 0x90, 0xC2, 0x82, 0xCC, 0x8B, 0xF3, 0x82, 0xF0, 0x89, 0x7A, 0x82, 0xA6, 0x82, 0xC4};

 
        FILE *fp = fopen("EXEC", "rb");

 
 

 
        if (fp == NULL) return 1;

 
 

 
        fseek(fp, 0, SEEK_END);

 
        int size = ftell(fp);

 
        fseek(fp, 0, SEEK_SET);

 
 

 
        unsigned char *buff = new unsigned char[size];

 
        fread(buff, 1, size, fp);

 
        fclose(fp);

 
 

 
        unsigned char *decbuff = new unsigned char[size];

 
        memset(decbuff, 0, size);

 
 

 
        KEY_TABLE_TYPE kt;

 
        memset(kt, 0, sizeof(kt));

 
        Camellia_Ekeygen(128, key, kt);

 
 

 
        unsigned char *enc = buff, *dec = decbuff;

 
        for (int i = 0; i < size / CAMELLIA_BLOCK_SIZE; i++)

 
        {

 
                Camellia_DecryptBlock(128, enc, kt, dec);

 
                enc += CAMELLIA_BLOCK_SIZE;

 
                dec += CAMELLIA_BLOCK_SIZE;


 
        }

 
 

 
        fp = fopen("deEXEC.bin", "wb");

 
        fwrite(decbuff, 1, size, fp);

 
        fclose(fp);

 
 

 
        delete[] buff;

 
        delete[] decbuff;

 
}
Beispiel #6
0
void
camellia_decrypt(const camellia_ctx *ctx, const u_char *src, u_char *dst)
{

    Camellia_DecryptBlock(ctx->bits, src, ctx->subkey, dst);
}