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; }
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; }
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; }
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; }
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; }
//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; }
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; }