sm4.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. /*
  2. * SM4 Encryption alogrithm (SMS4 algorithm)
  3. * GM/T 0002-2012 Chinese National Standard ref:http://www.oscca.gov.cn/
  4. * thanks to Xyssl
  5. * thnaks and refers to http://hi.baidu.com/numax/blog/item/80addfefddfb93e4cf1b3e61.html
  6. * author:goldboar
  7. * email:goldboar@163.com
  8. * 2012-4-20
  9. */
  10. // Test vector 1
  11. // plain: 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
  12. // key: 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
  13. // round key and temp computing result:
  14. // rk[ 0] = f12186f9 X[ 0] = 27fad345
  15. // rk[ 1] = 41662b61 X[ 1] = a18b4cb2
  16. // rk[ 2] = 5a6ab19a X[ 2] = 11c1e22a
  17. // rk[ 3] = 7ba92077 X[ 3] = cc13e2ee
  18. // rk[ 4] = 367360f4 X[ 4] = f87c5bd5
  19. // rk[ 5] = 776a0c61 X[ 5] = 33220757
  20. // rk[ 6] = b6bb89b3 X[ 6] = 77f4c297
  21. // rk[ 7] = 24763151 X[ 7] = 7a96f2eb
  22. // rk[ 8] = a520307c X[ 8] = 27dac07f
  23. // rk[ 9] = b7584dbd X[ 9] = 42dd0f19
  24. // rk[10] = c30753ed X[10] = b8a5da02
  25. // rk[11] = 7ee55b57 X[11] = 907127fa
  26. // rk[12] = 6988608c X[12] = 8b952b83
  27. // rk[13] = 30d895b7 X[13] = d42b7c59
  28. // rk[14] = 44ba14af X[14] = 2ffc5831
  29. // rk[15] = 104495a1 X[15] = f69e6888
  30. // rk[16] = d120b428 X[16] = af2432c4
  31. // rk[17] = 73b55fa3 X[17] = ed1ec85e
  32. // rk[18] = cc874966 X[18] = 55a3ba22
  33. // rk[19] = 92244439 X[19] = 124b18aa
  34. // rk[20] = e89e641f X[20] = 6ae7725f
  35. // rk[21] = 98ca015a X[21] = f4cba1f9
  36. // rk[22] = c7159060 X[22] = 1dcdfa10
  37. // rk[23] = 99e1fd2e X[23] = 2ff60603
  38. // rk[24] = b79bd80c X[24] = eff24fdc
  39. // rk[25] = 1d2115b0 X[25] = 6fe46b75
  40. // rk[26] = 0e228aeb X[26] = 893450ad
  41. // rk[27] = f1780c81 X[27] = 7b938f4c
  42. // rk[28] = 428d3654 X[28] = 536e4246
  43. // rk[29] = 62293496 X[29] = 86b3e94f
  44. // rk[30] = 01cf72e5 X[30] = d206965e
  45. // rk[31] = 9124a012 X[31] = 681edf34
  46. // cypher: 68 1e df 34 d2 06 96 5e 86 b3 e9 4f 53 6e 42 46
  47. //
  48. // test vector 2
  49. // the same key and plain 1000000 times coumpting
  50. // plain: 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
  51. // key: 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
  52. // cypher: 59 52 98 c7 c6 fd 27 1f 04 02 f8 04 c3 3d 3f 66
  53. #include <string.h>
  54. #include <stdio.h>
  55. //#include "svdpi.h"
  56. /*
  57. * 32-bit integer manipulation macros (big endian)
  58. */
  59. #ifndef GET_ULONG_BE
  60. #define GET_ULONG_BE(n,b,i) \
  61. { \
  62. (n) = ( (unsigned long) (b)[(i) ] << 24 ) \
  63. | ( (unsigned long) (b)[(i) + 1] << 16 ) \
  64. | ( (unsigned long) (b)[(i) + 2] << 8 ) \
  65. | ( (unsigned long) (b)[(i) + 3] ); \
  66. }
  67. #endif
  68. #ifndef PUT_ULONG_BE
  69. #define PUT_ULONG_BE(n,b,i) \
  70. { \
  71. (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
  72. (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
  73. (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
  74. (b)[(i) + 3] = (unsigned char) ( (n) ); \
  75. }
  76. #endif
  77. /*
  78. *rotate shift left marco definition/home/tim/work/sm4/rand_sim/sm4/testbench/dpi_c
  79. *
  80. */
  81. #define SHL(x,n) (((x) & 0xFFFFFFFF) << n)
  82. #define ROTL(x,n) (SHL((x),n) | ((x) >> (32 - n)))
  83. #define SWAP(a,b) { unsigned long t = a; a = b; b = t; t = 0; }
  84. /*
  85. * Expanded SM4 S-boxes
  86. * Sbox table: 8bits input convert to 8 bits output*/
  87. static const unsigned char SboxTable[16][16] =
  88. {
  89. {0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05},
  90. {0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99},
  91. {0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62},
  92. {0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6},
  93. {0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8},
  94. {0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35},
  95. {0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87},
  96. {0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e},
  97. {0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1},
  98. {0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3},
  99. {0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f},
  100. {0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51},
  101. {0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8},
  102. {0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0},
  103. {0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84},
  104. {0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48}
  105. };
  106. /* System parameter */
  107. static const unsigned long FK[4] = {0xa3b1bac6,0x56aa3350,0x677d9197,0xb27022dc};
  108. /* fixed parameter */
  109. static const unsigned long CK[32] =
  110. {
  111. 0x00070e15,0x1c232a31,0x383f464d,0x545b6269,
  112. 0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9,
  113. 0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249,
  114. 0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9,
  115. 0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229,
  116. 0x30373e45,0x4c535a61,0x686f767d,0x848b9299,
  117. 0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209,
  118. 0x10171e25,0x2c333a41,0x484f565d,0x646b7279
  119. };
  120. /*
  121. * private function:
  122. * look up in SboxTable and get the related value.
  123. * args: [in] inch: 0x00~0xFF (8 bits unsigned value).
  124. */
  125. static unsigned char sm4Sbox(unsigned char inch)
  126. {
  127. unsigned char *pTable = (unsigned char *)SboxTable;
  128. unsigned char retVal = (unsigned char)(pTable[inch]);
  129. return retVal;
  130. }
  131. /*
  132. * private F(Lt) function:
  133. * "T algorithm" == "L algorithm" + "t algorithm".
  134. * args: [in] a: a is a 32 bits unsigned value;
  135. * return: c: c is calculated with line algorithm "L" and nonline algorithm "t"
  136. */
  137. static unsigned long sm4Lt(unsigned long ka)
  138. {
  139. unsigned long bb = 0;
  140. unsigned long c = 0;
  141. unsigned char a[4];
  142. unsigned char b[4];
  143. PUT_ULONG_BE(ka,a,0)
  144. b[0] = sm4Sbox(a[0]);
  145. b[1] = sm4Sbox(a[1]);
  146. b[2] = sm4Sbox(a[2]);
  147. b[3] = sm4Sbox(a[3]);
  148. GET_ULONG_BE(bb,b,0)
  149. c =bb^(ROTL(bb, 2))^(ROTL(bb, 10))^(ROTL(bb, 18))^(ROTL(bb, 24));
  150. return c;
  151. }
  152. /*
  153. * private F function:
  154. * Calculating and getting encryption/decryption contents.
  155. * args: [in] x0: original contents;
  156. * args: [in] x1: original contents;
  157. * args: [in] x2: original contents;
  158. * args: [in] x3: original contents;
  159. * args: [in] rk: encryption/decryption key;
  160. * return the contents of encryption/decryption contents.
  161. */
  162. static unsigned long sm4F(unsigned long x0, unsigned long x1, unsigned long x2, unsigned long x3, unsigned long rk)
  163. {
  164. return (x0^sm4Lt(x1^x2^x3^rk));
  165. }
  166. /* private function:
  167. * Calculating round encryption key.
  168. * args: [in] a: a is a 32 bits unsigned value;
  169. * return: sk[i]: i{0,1,2,3,...31}.
  170. */
  171. static unsigned long sm4CalciRK(unsigned long ka)
  172. {
  173. unsigned long bb = 0;
  174. unsigned long rk = 0;
  175. unsigned char a[4];
  176. unsigned char b[4];
  177. PUT_ULONG_BE(ka,a,0)
  178. b[0] = sm4Sbox(a[0]);
  179. b[1] = sm4Sbox(a[1]);
  180. b[2] = sm4Sbox(a[2]);
  181. b[3] = sm4Sbox(a[3]);
  182. GET_ULONG_BE(bb,b,0)
  183. rk = bb^(ROTL(bb, 13))^(ROTL(bb, 23));
  184. return rk;
  185. }
  186. static void sm4_setkey( unsigned long SK[32], unsigned char key[16] )
  187. {
  188. unsigned long MK[4];
  189. unsigned long k[36];
  190. unsigned long i = 0;
  191. GET_ULONG_BE( MK[0], key, 0 );
  192. GET_ULONG_BE( MK[1], key, 4 );
  193. GET_ULONG_BE( MK[2], key, 8 );
  194. GET_ULONG_BE( MK[3], key, 12 );
  195. k[0] = MK[0]^FK[0];
  196. k[1] = MK[1]^FK[1];
  197. k[2] = MK[2]^FK[2];
  198. k[3] = MK[3]^FK[3];
  199. for(; i<32; i++)
  200. {
  201. k[i+4] = k[i] ^ (sm4CalciRK(k[i+1]^k[i+2]^k[i+3]^CK[i]));
  202. SK[i] = k[i+4];
  203. }
  204. }
  205. /*
  206. * SM4 standard one round processing
  207. *
  208. */
  209. static void sm4_one_round( unsigned long sk[32],
  210. unsigned char input[16],
  211. unsigned char output[16] )
  212. {
  213. unsigned long i = 0;
  214. unsigned long ulbuf[36];
  215. memset(ulbuf, 0, sizeof(ulbuf));
  216. GET_ULONG_BE( ulbuf[0], input, 0 )
  217. GET_ULONG_BE( ulbuf[1], input, 4 )
  218. GET_ULONG_BE( ulbuf[2], input, 8 )
  219. GET_ULONG_BE( ulbuf[3], input, 12 )
  220. while(i<32)
  221. {
  222. ulbuf[i+4] = sm4F(ulbuf[i], ulbuf[i+1], ulbuf[i+2], ulbuf[i+3], sk[i]);
  223. // #ifdef _DEBUG
  224. // printf("rk(%02d) = 0x%08x, X(%02d) = 0x%08x \n",i,sk[i], i, ulbuf[i+4] );
  225. // #endif
  226. i++;
  227. }
  228. PUT_ULONG_BE(ulbuf[35],output,0);
  229. PUT_ULONG_BE(ulbuf[34],output,4);
  230. PUT_ULONG_BE(ulbuf[33],output,8);
  231. PUT_ULONG_BE(ulbuf[32],output,12);
  232. }
  233. static unsigned char pbIV[16];
  234. static unsigned long sk[32];
  235. void sm4_enc_128bit(unsigned long sk[32],
  236. unsigned char input[16],
  237. unsigned char output[16])
  238. {
  239. sm4_one_round( sk, input, output);
  240. }
  241. void sm4_dec_128bit(unsigned long sk[32],
  242. unsigned char input[16],
  243. unsigned char output[16])
  244. {
  245. int i;
  246. unsigned long sk_temp[32];
  247. for( i = 0; i < 32; i ++ )
  248. {
  249. sk_temp[i] = sk[31-i] ;
  250. }
  251. sm4_one_round( sk_temp, input, output);
  252. }
  253. /*
  254. * SM4 ecb mode
  255. */
  256. void sm4_ecb(unsigned char key[16],
  257. int dec_en,
  258. int flag,
  259. unsigned char *input,
  260. unsigned char *output)
  261. {
  262. int i;
  263. // sm4_setkey( sk, key );
  264. if(flag){
  265. sm4_setkey( sk, key );
  266. }
  267. if( dec_en==0){ //encryption
  268. sm4_enc_128bit(sk,input,output);
  269. }
  270. else{ //decryption
  271. sm4_dec_128bit(sk,input,output);
  272. }
  273. }
  274. /*
  275. * SM4 cbc mode
  276. */
  277. int sm4_cbc( unsigned char key[16],
  278. int dec_en,
  279. int flag,
  280. unsigned char iv[16],
  281. unsigned char *input,
  282. unsigned char *output )
  283. {
  284. int i;
  285. unsigned char temp[16];
  286. if(flag){
  287. memcpy(pbIV, iv, 16);
  288. sm4_setkey( sk, key );
  289. }
  290. // for(i=0;i<16;i++)
  291. // printf("input[%02d] = %02x\n",i,input[i]);
  292. //
  293. // for(i=0;i<16;i++)
  294. // printf("pbIV[%02d] = %02x\n",i,pbIV[i]);
  295. //
  296. // for(i=0;i<32;i++)
  297. // printf("sk[%02d] =%08x\n",i,sk[i]);
  298. if( dec_en == 0 ) //encryption
  299. {
  300. for( i = 0; i < 16; i++ )
  301. temp[i] = (unsigned char)( input[i] ^ pbIV[i] );
  302. sm4_enc_128bit(sk, temp, output);
  303. memcpy( pbIV, output, 16 );
  304. }
  305. else //dencryption
  306. {
  307. memcpy( temp, input, 16 );
  308. sm4_dec_128bit( sk, input, output );
  309. for( i = 0; i < 16; i++ )
  310. output[i] = (unsigned char)( output[i] ^ pbIV[i] );
  311. memcpy( pbIV, temp, 16 );
  312. }
  313. // for(i=0;i<16;i++)
  314. // printf("output[%02d] = %02x\n",i,output[i]);
  315. return( 0 );
  316. }
  317. /*
  318. * SM4 cfb mode
  319. */
  320. int sm4_cfb( unsigned char key[16],
  321. int dec_en,
  322. int flag,
  323. unsigned char iv[16],
  324. unsigned char *input,
  325. unsigned char *output )
  326. {
  327. int i;
  328. unsigned char temp[16];
  329. if(flag){
  330. memcpy(pbIV, iv, 16);
  331. sm4_setkey( sk, key );
  332. }
  333. if( dec_en == 0 ) //encryption
  334. {
  335. sm4_enc_128bit(sk, pbIV,temp);
  336. for( i = 0; i < 16; i++ )
  337. output[i] = (unsigned char)( temp[i] ^ input[i] );
  338. memcpy( pbIV, output, 16 );
  339. }
  340. else //dencryption
  341. {
  342. sm4_enc_128bit(sk, pbIV,temp);
  343. memcpy( pbIV, input, 16 );
  344. for( i = 0; i < 16; i++ )
  345. output[i] = (unsigned char)( temp[i] ^ input[i] );
  346. }
  347. return( 0 );
  348. }
  349. /*
  350. * SM4 ofb mode
  351. */
  352. int sm4_ofb( unsigned char key[16],
  353. int dec_en,
  354. int flag,
  355. unsigned char iv[16],
  356. unsigned char *input,
  357. unsigned char *output )
  358. {
  359. int i;
  360. unsigned char temp[16];
  361. if(flag){
  362. memcpy(pbIV, iv, 16);
  363. sm4_setkey( sk, key );
  364. }
  365. if( dec_en == 0 ) //encryption
  366. {
  367. sm4_enc_128bit(sk, pbIV,temp);
  368. memcpy( pbIV,temp, 16 );
  369. for( i = 0; i < 16; i++ )
  370. output[i] = (unsigned char)( temp[i] ^ input[i] );
  371. }
  372. else //dencryption
  373. {
  374. sm4_enc_128bit(sk, pbIV, temp);
  375. memcpy( pbIV,temp, 16 );
  376. for( i = 0; i < 16; i++ )
  377. output[i] = (unsigned char)( temp[i] ^ input[i] );
  378. }
  379. return( 0 );
  380. }
  381. /*
  382. * SM4 ctr mode
  383. */
  384. int sm4_ctr( unsigned char key[16],
  385. int dec_en,
  386. int flag,
  387. unsigned char counter[16],
  388. unsigned char *input,
  389. unsigned char *output )
  390. {
  391. int i;
  392. unsigned char temp[16];
  393. if(flag){
  394. memcpy( pbIV,counter, 16 );
  395. sm4_setkey( sk, key );
  396. }
  397. if( dec_en == 0 ) //encryption
  398. {
  399. sm4_enc_128bit(sk,pbIV,temp);
  400. for( i = 0; i < 16; i++ )
  401. output[i] = (unsigned char)( temp[i] ^ input[i] );
  402. //count ++
  403. for(i=0;i<16;i++){
  404. pbIV[i] ++;
  405. if(pbIV[i]!=0)
  406. break;
  407. }
  408. }
  409. else //dencryption
  410. {
  411. sm4_enc_128bit(sk,pbIV,temp);
  412. for( i = 0; i < 16; i++ )
  413. output[i] = (unsigned char)( temp[i] ^ input[i] );
  414. //count ++
  415. for(i=0;i<16;i++){
  416. pbIV[i] ++;
  417. if(pbIV[i]!=0)
  418. break;
  419. }
  420. }
  421. return( 0 );
  422. }
  423. /*
  424. * SM4 xts mode
  425. */
  426. int sm4_xts( unsigned char key2[16],
  427. unsigned char key1[16],
  428. int dec_en,
  429. int flag,
  430. unsigned char tweak[16],
  431. unsigned char *input,
  432. unsigned char *output )
  433. {
  434. int i;
  435. unsigned char pbIV[16];
  436. unsigned char pbIV_pre[16];
  437. unsigned char C_temp[16];
  438. unsigned char P_temp[16];
  439. unsigned char Cin;
  440. unsigned char Cout;
  441. if(flag){
  442. //get key2
  443. sm4_setkey( sk, key2 );
  444. //enc tweak
  445. sm4_enc_128bit(sk,tweak,pbIV);
  446. //get key1
  447. sm4_setkey( sk, key1 );
  448. }
  449. if( dec_en == 0 ) //encryption
  450. {
  451. //input xor T
  452. for( i = 0; i < 16; i++ )
  453. C_temp[i] = (unsigned char)( pbIV[i] ^ input[i] );
  454. //enc C get P
  455. sm4_enc_128bit(sk,C_temp,P_temp);
  456. //T xor P
  457. for( i = 0; i < 16; i++ )
  458. output[i] = (unsigned char)( pbIV[i] ^ P_temp[i] );
  459. //LSFR
  460. Cin = 0;
  461. for(i=0;i<16;i++){
  462. Cout = (pbIV[i]>>7)&1;
  463. pbIV[i]=((pbIV[i]<<1)+Cin) & 0xff;
  464. Cin=Cout;
  465. }
  466. if(Cout)
  467. pbIV[0]^=0x87 ;
  468. }
  469. else //dencryption
  470. {
  471. //input xor T
  472. for( i = 0; i < 16; i++ )
  473. C_temp[i] = (unsigned char)( pbIV[i] ^ input[i] );
  474. //dec C get P
  475. sm4_dec_128bit(sk,C_temp,P_temp);
  476. //T xor P
  477. for( i = 0; i < 16; i++ )
  478. output[i] = (unsigned char)( pbIV[i] ^ P_temp[i] );
  479. //LSFR
  480. Cin = 0;
  481. for(i=0;i<16;i++){
  482. Cout = (pbIV[i]>>7)&1;
  483. pbIV[i]=((pbIV[i]<<1)+Cin) & 0xff;
  484. Cin=Cout;
  485. }
  486. if(Cout)
  487. pbIV[0]^=0x87 ;
  488. }
  489. return( 0 );
  490. }
  491. /***
  492. *sm4 select mode by mode
  493. ***/
  494. #define ECB 0
  495. #define CBC 1
  496. #define CFB 2
  497. #define OFB 3
  498. #define CTR 4
  499. #define XTS 5
  500. int sm4( unsigned char key2[16],
  501. unsigned char key1[16],
  502. int dec_en,
  503. int flag,
  504. int mode,
  505. unsigned char iv[16],
  506. unsigned char *input,
  507. unsigned char *output )
  508. {
  509. switch(mode){
  510. case 0:sm4_ecb(key1,dec_en,flag,input,output);
  511. case 1:sm4_cbc(key1,dec_en,flag,iv,input,output);
  512. case 2:sm4_cfb(key1,dec_en,flag,iv,input,output);
  513. case 3:sm4_ofb(key1,dec_en,flag,iv,input,output);
  514. case 4:sm4_ctr(key1,dec_en,flag,iv,input,output);
  515. case 5:sm4_xts(key1,key2,dec_en,flag,iv,input,output);
  516. default:sm4_xts(key1,key2,dec_en,flag,iv,input,output);
  517. }
  518. }