Exemplo n.º 1
0
static int aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
                        const unsigned char *iv, int enc)
	{
	EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
	if (!iv && !key)
		return 1;
	if (key)
		{ do {
#ifdef BSAES_CAPABLE
		if (BSAES_CAPABLE)
			{
			AES_set_encrypt_key(key,ctx->key_len*8,&gctx->ks);
			CRYPTO_gcm128_init(&gctx->gcm,&gctx->ks,
					(block128_f)AES_encrypt);
			gctx->ctr = (ctr128_f)bsaes_ctr32_encrypt_blocks;
			break;
			}
		else
#endif
#ifdef VPAES_CAPABLE
		if (VPAES_CAPABLE)
			{
			vpaes_set_encrypt_key(key,ctx->key_len*8,&gctx->ks);
			CRYPTO_gcm128_init(&gctx->gcm,&gctx->ks,
					(block128_f)vpaes_encrypt);
			gctx->ctr = NULL;
			break;
			}
#endif
		AES_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks);
		CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks, (block128_f)AES_encrypt);
#ifdef AES_CTR_ASM
		gctx->ctr = (ctr128_f)AES_ctr32_encrypt;
#else
		gctx->ctr = NULL;
#endif
		} while (0);

		/* If we have an iv can set it directly, otherwise use
		 * saved IV.
		 */
		if (iv == NULL && gctx->iv_set)
			iv = gctx->iv;
		if (iv)
			{
			CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
			gctx->iv_set = 1;
			}
		gctx->key_set = 1;
		}
	else
		{
		/* If key set use IV, otherwise copy */
		if (gctx->key_set)
			CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
		else
			memcpy(gctx->iv, iv, gctx->ivlen);
		gctx->iv_set = 1;
		gctx->iv_gen = 0;
		}
	return 1;
	}
Exemplo n.º 2
0
static int aes_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
                        const unsigned char *iv, int enc)
	{
	EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
	if (!iv && !key)
		return 1;

	if (key) do
		{
#ifdef AES_XTS_ASM
		xctx->stream = enc ? AES_xts_encrypt : AES_xts_decrypt;
#else
		xctx->stream = NULL;
#endif
		/* key_len is two AES keys */
#ifdef BSAES_CAPABLE
		if (BSAES_CAPABLE)
			xctx->stream = enc ? bsaes_xts_encrypt : bsaes_xts_decrypt;
		else
#endif
#ifdef VPAES_CAPABLE
		if (VPAES_CAPABLE)
		    {
		    if (enc)
			{
			vpaes_set_encrypt_key(key, ctx->key_len * 4, &xctx->ks1);
			xctx->xts.block1 = (block128_f)vpaes_encrypt;
			}
		    else
			{
			vpaes_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1);
			xctx->xts.block1 = (block128_f)vpaes_decrypt;
			}

		vpaes_set_encrypt_key(key + ctx->key_len/2,
						ctx->key_len * 4, &xctx->ks2);
		xctx->xts.block2 = (block128_f)vpaes_encrypt;

		xctx->xts.key1 = &xctx->ks1;
		break;
		}
#endif
		if (enc)
			{
			AES_set_encrypt_key(key, ctx->key_len * 4, &xctx->ks1);
			xctx->xts.block1 = (block128_f)AES_encrypt;
			}
		else
			{
			AES_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1);
			xctx->xts.block1 = (block128_f)AES_decrypt;
			}

		AES_set_encrypt_key(key + ctx->key_len/2,
						ctx->key_len * 4, &xctx->ks2);
		xctx->xts.block2 = (block128_f)AES_encrypt;

		xctx->xts.key1 = &xctx->ks1;
		} while (0);

	if (iv)
		{
		xctx->xts.key2 = &xctx->ks2;
		memcpy(ctx->iv, iv, 16);
		}

	return 1;
	}
Exemplo n.º 3
0
static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
		   const unsigned char *iv, int enc)
	{
	int ret, mode;
	EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;

	mode = ctx->cipher->flags & EVP_CIPH_MODE;
	if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE)
	    && !enc)
#ifdef BSAES_CAPABLE
	    if (BSAES_CAPABLE && mode==EVP_CIPH_CBC_MODE)
		{
		ret = AES_set_decrypt_key(key,ctx->key_len*8,&dat->ks);
		dat->block	= (block128_f)AES_decrypt;
		dat->stream.cbc	= (cbc128_f)bsaes_cbc_encrypt;
		}
	    else
#endif
#ifdef VPAES_CAPABLE
	    if (VPAES_CAPABLE)
		{
		ret = vpaes_set_decrypt_key(key,ctx->key_len*8,&dat->ks);
		dat->block	= (block128_f)vpaes_decrypt;
		dat->stream.cbc	= mode==EVP_CIPH_CBC_MODE ?
					(cbc128_f)vpaes_cbc_encrypt :
					NULL;
		}
	    else
#endif
		{
		ret = AES_set_decrypt_key(key,ctx->key_len*8,&dat->ks);
		dat->block	= (block128_f)AES_decrypt;
		dat->stream.cbc	= mode==EVP_CIPH_CBC_MODE ?
					(cbc128_f)AES_cbc_encrypt :
					NULL;
		}
	else
#ifdef BSAES_CAPABLE
	    if (BSAES_CAPABLE && mode==EVP_CIPH_CTR_MODE)
		{
		ret = AES_set_encrypt_key(key,ctx->key_len*8,&dat->ks);
		dat->block	= (block128_f)AES_encrypt;
		dat->stream.ctr	= (ctr128_f)bsaes_ctr32_encrypt_blocks;
		}
	    else
#endif
#ifdef VPAES_CAPABLE
	    if (VPAES_CAPABLE)
		{
		ret = vpaes_set_encrypt_key(key,ctx->key_len*8,&dat->ks);
		dat->block	= (block128_f)vpaes_encrypt;
		dat->stream.cbc	= mode==EVP_CIPH_CBC_MODE ?
					(cbc128_f)vpaes_cbc_encrypt :
					NULL;
		}
	    else
#endif
		{
		ret = AES_set_encrypt_key(key,ctx->key_len*8,&dat->ks);
		dat->block	= (block128_f)AES_encrypt;
		dat->stream.cbc	= mode==EVP_CIPH_CBC_MODE ?
					(cbc128_f)AES_cbc_encrypt :
					NULL;
#ifdef AES_CTR_ASM
		if (mode==EVP_CIPH_CTR_MODE)
			dat->stream.ctr = (ctr128_f)AES_ctr32_encrypt;
#endif
		}

	if(ret < 0)
		{
		EVPerr(EVP_F_AES_INIT_KEY,EVP_R_AES_KEY_SETUP_FAILED);
		return 0;
		}

	return 1;
	}
Exemplo n.º 4
0
static ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_CONTEXT *gcm_ctx,
                                block128_f *out_block, const uint8_t *key,
                                size_t key_len) {
#if defined(AESNI)
  if (aesni_capable()) {
    aesni_set_encrypt_key(key, key_len * 8, aes_key);
    if (gcm_ctx != NULL) {
      CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)aesni_encrypt);
    }
    if (out_block) {
      *out_block = (block128_f) aesni_encrypt;
    }
    return (ctr128_f)aesni_ctr32_encrypt_blocks;
  }
#endif

#if defined(HWAES)
  if (hwaes_capable()) {
    aes_v8_set_encrypt_key(key, key_len * 8, aes_key);
    if (gcm_ctx != NULL) {
      CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)aes_v8_encrypt);
    }
    if (out_block) {
      *out_block = (block128_f) aes_v8_encrypt;
    }
    return (ctr128_f)aes_v8_ctr32_encrypt_blocks;
  }
#endif

#if defined(BSAES)
  if (bsaes_capable()) {
    AES_set_encrypt_key(key, key_len * 8, aes_key);
    if (gcm_ctx != NULL) {
      CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt);
    }
    if (out_block) {
      *out_block = (block128_f) AES_encrypt;
    }
    return (ctr128_f)bsaes_ctr32_encrypt_blocks;
  }
#endif

#if defined(VPAES)
  if (vpaes_capable()) {
    vpaes_set_encrypt_key(key, key_len * 8, aes_key);
    if (out_block) {
      *out_block = (block128_f) vpaes_encrypt;
    }
    if (gcm_ctx != NULL) {
      CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)vpaes_encrypt);
    }
    return NULL;
  }
#endif

  AES_set_encrypt_key(key, key_len * 8, aes_key);
  if (gcm_ctx != NULL) {
    CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt);
  }
  if (out_block) {
    *out_block = (block128_f) AES_encrypt;
  }
  return NULL;
}