Example #1
1
File: e_sms4.c Project: cywzl/GmSSL
static int sms4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
	const unsigned char *iv, int enc)
{

	int mode;

	mode = ctx->cipher->flags & EVP_CIPH_MODE;
	if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE) && !enc) {
		ret = sms4_set_decrypt_key(key, ctx->key_len * 8, ctx->cipher_data);
		sms4->block = (block128_f)sms4_decrypt;
		sms4->stream.cbc = (mode == EVP_CIPH_CBC_MODE ?
			(cbc128_f)sms4_cbc_encrypt : NULL);
	} else {
		ret = sms4_set_encrypt_key(key, ctx->key_len * 8, ctx->cipher_data);
		sms4->block = (block128_f)sms4_encrypt;
	
		if (mode == EVP_CIPH_CBC_MODE) {
			sms4->stream.cbc = (cbc128_f)sms4_cbc_encrypt;
		} else if (mode == EVP_CIPH_CTR_MODE) {
			sms4->stream.ctr = (ctr128_f)sms4_ctr32_encrypt_blocks;
		} else {
			sms4->stream.cbc = NULL;
		}
	}

	if (ret < 0) {
		return 0;
	}

	return 1;
}
Example #2
0
static int sms4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
			 const unsigned char *iv, int enc)
	{
	if(!enc) {
		if (EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_OFB_MODE) enc = 1;
		else if (EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_CFB_MODE) enc = 1;  //encrypt key == decrypt key
	}
	if (enc)
                sms4_set_encrypt_key(ctx->cipher_data, key);
	else            //ecb, cbc
		sms4_set_decrypt_key(ctx->cipher_data, key);
	return 1;
	}
Example #3
0
static int sms4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
	const unsigned char *iv, int enc)
{
	int mode;
	EVP_SMS4_KEY *dat = EVP_C_DATA(EVP_SMS4_KEY, ctx);
	mode = EVP_CIPHER_CTX_mode(ctx);

	if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE) && !enc) {
		sms4_set_decrypt_key(&dat->ks, key);
	} else {
		sms4_set_encrypt_key(&dat->ks, key);
	}
	dat->block = (block128_f)sms4_encrypt;
	dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ? (cbc128_f) sms4_cbc_encrypt : NULL;

	return 1;
}
Example #4
0
static int sms4_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
                             const unsigned char *iv, int enc)
{
    EVP_SMS4_CCM_CTX *cctx = EVP_C_DATA(EVP_SMS4_CCM_CTX,ctx);
    if (!iv && !key)
        return 1;
    if (key)
        do {
            sms4_set_encrypt_key(&cctx->ks.ks, key);
            CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
                               &cctx->ks, (block128_f) sms4_encrypt);
            cctx->str = NULL;
            cctx->key_set = 1;
        } while (0);
    if (iv) {
        memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), iv, 15 - cctx->L);
        cctx->iv_set = 1;
    }
    return 1;
}
Example #5
0
static int sms4_wrap_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
                              const unsigned char *iv, int enc)
{
    EVP_SMS4_WRAP_CTX *wctx = EVP_C_DATA(EVP_SMS4_WRAP_CTX,ctx);
    if (!iv && !key)
        return 1;
    if (key) {
        if (EVP_CIPHER_CTX_encrypting(ctx))
            sms4_set_encrypt_key(&wctx->ks.ks, key);
        else
            sms4_set_decrypt_key(&wctx->ks.ks, key);
        if (!iv)
            wctx->iv = NULL;
    }
    if (iv) {
        memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), iv, EVP_CIPHER_CTX_iv_length(ctx));
        wctx->iv = EVP_CIPHER_CTX_iv_noconst(ctx);
    }
    return 1;
}
Example #6
0
//unsigned char *key,			/* 16字节 */
//unsigned char *plaintext,		/* 明文 */
//unsigned short plaintextlen,	/* 明文长度 */
//unsigned char *ciphertext,	/* 密文输出 */
//unsigned short *ciphertextlen, /* 长度是16的整数倍,最多比明文长度多16字节 ( plaintextlen /16 +1) * 16 */
//unsigned char *IV				/* 初始向量 16字节 */
//
unsigned char SMS4_Encryption(unsigned char *key, 
							  unsigned char *plaintext, unsigned short plaintextlen, 
							  unsigned char *ciphertext, unsigned short *ciphertextlen, 
							  unsigned char *IV)
{
	assert(key && plaintext && ciphertext && ciphertextlen && IV);

	sms4_key_t pkey;
	sms4_set_encrypt_key(&pkey, key);

	int pad = 16 - plaintextlen % 16;
	*ciphertextlen = plaintextlen  + pad;
	memcpy(ciphertext, plaintext, plaintextlen);
	memset(ciphertext + plaintextlen, pad, pad);

	sms4_cbc_encrypt(ciphertext, ciphertext, *ciphertextlen, 
		&pkey, IV, 1);

	return 0;
}
Example #7
0
static int sms4_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
                             const unsigned char *iv, int enc)
{
    EVP_SMS4_GCM_CTX *gctx = EVP_C_DATA(EVP_SMS4_GCM_CTX,ctx);
    if (!iv && !key)
        return 1;
    if (key) {
        do {
            (void)0;        /* terminate potentially open 'else' */

            sms4_set_encrypt_key(&gctx->ks.ks, key);
            CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
                               (block128_f)sms4_encrypt);
            gctx->ctr = NULL;
        } 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;
}