int main(int argc,char *argv[]) { if(argc < 2) { printf("usage:\n"); printf("%s string.\n",argv[0]); return 0; } char *encdata = NULL; int encLen = (strlen(argv[1])/16+1)*16; encdata = malloc(encLen); sm4_context ctx; sm4_setkey_enc(&ctx,key); sm4_crypt_ecb(&ctx,1,strlen((const char *)argv[1]),argv[1],encdata); printf("Enc Data[%d] :",encLen); printHex(encdata,encLen); char *decdata = malloc(encLen); sm4_setkey_dec(&ctx,key); sm4_crypt_ecb(&ctx,0,encLen,encdata,decdata); printf("Dec Data:%s\n",decdata); free(encdata); free(decdata); }
int crypt_dec_init(cipher_context *cctx, uint8 *ck, int ckl, uint8 *iv, int alg) { switch(alg&MASK_ALG){ case ALG_AES: cctx->enc_ctx = (AES_KEY *)malloc(sizeof(AES_KEY)); cctx->block_size=AES_BLOCK_SIZE; if(ckl<AES_KEY_LENGTH) return 0; if( alg == ALG_AES_CTR ) AES_set_encrypt_key(ck, ckl*8, cctx->enc_ctx); else AES_set_decrypt_key(ck, ckl*8, cctx->enc_ctx); if(iv) memcpy(cctx->iv, iv, cctx->block_size); break; case ALG_SM4: cctx->enc_ctx = (sm4_context *)malloc(sizeof(sm4_context)); cctx->block_size=SM4_BLOCK_SIZE; if(ckl<SM4_KEY_LENGTH) return 0; if( alg == ALG_SM4_CTR ) sm4_setkey_enc(cctx->enc_ctx, ck); else sm4_setkey_dec(cctx->enc_ctx, ck); if(iv) memcpy(cctx->iv, iv, cctx->block_size); break; default: return 0; } cctx->alg=alg; cctx->count=0; cctx->flag=0; return 1; }