test_suite_mpi.function 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. BEGIN_HEADER
  2. #include <polarssl/bignum.h>
  3. END_HEADER
  4. BEGIN_DEPENDENCIES
  5. depends_on:POLARSSL_BIGNUM_C
  6. END_DEPENDENCIES
  7. BEGIN_CASE
  8. mpi_read_write_string:radix_X:input_X:radix_A:input_A:output_size:result_read:result_write
  9. {
  10. mpi X;
  11. char str[1000];
  12. size_t len = {output_size};
  13. mpi_init( &X );
  14. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == {result_read} );
  15. if( {result_read} == 0 )
  16. {
  17. TEST_ASSERT( mpi_write_string( &X, {radix_A}, str, &len ) == {result_write} );
  18. if( {result_write} == 0 )
  19. {
  20. TEST_ASSERT( strcasecmp( str, {input_A} ) == 0 );
  21. }
  22. }
  23. mpi_free( &X );
  24. }
  25. END_CASE
  26. BEGIN_CASE
  27. mpi_read_binary:input_X:radix_A:input_A
  28. {
  29. mpi X;
  30. unsigned char str[1000];
  31. unsigned char buf[1000];
  32. size_t len = 1000;
  33. size_t input_len;
  34. mpi_init( &X );
  35. input_len = unhexify( buf, {input_X} );
  36. TEST_ASSERT( mpi_read_binary( &X, buf, input_len ) == 0 );
  37. TEST_ASSERT( mpi_write_string( &X, {radix_A}, (char *) str, &len ) == 0 );
  38. TEST_ASSERT( strcmp( (char *) str, {input_A} ) == 0 );
  39. mpi_free( &X );
  40. }
  41. END_CASE
  42. BEGIN_CASE
  43. mpi_write_binary:radix_X:input_X:input_A:output_size:result
  44. {
  45. mpi X;
  46. unsigned char str[1000];
  47. unsigned char buf[1000];
  48. size_t buflen;
  49. memset( buf, 0x00, 1000 );
  50. memset( str, 0x00, 1000 );
  51. mpi_init( &X );
  52. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  53. buflen = mpi_size( &X );
  54. if( buflen > {output_size} )
  55. buflen = {output_size};
  56. TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == {result} );
  57. if( {result} == 0)
  58. {
  59. hexify( str, buf, buflen );
  60. TEST_ASSERT( strcasecmp( (char *) str, {input_A} ) == 0 );
  61. }
  62. mpi_free( &X );
  63. }
  64. END_CASE
  65. BEGIN_CASE
  66. mpi_read_file:radix_X:input_file:input_A:result
  67. {
  68. mpi X;
  69. unsigned char str[1000];
  70. unsigned char buf[1000];
  71. size_t buflen;
  72. FILE *file;
  73. memset( buf, 0x00, 1000 );
  74. memset( str, 0x00, 1000 );
  75. mpi_init( &X );
  76. file = fopen( {input_file}, "r" );
  77. TEST_ASSERT( mpi_read_file( &X, {radix_X}, file ) == {result} );
  78. fclose(file);
  79. if( {result} == 0 )
  80. {
  81. buflen = mpi_size( &X );
  82. TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == 0 );
  83. hexify( str, buf, buflen );
  84. TEST_ASSERT( strcasecmp( (char *) str, {input_A} ) == 0 );
  85. }
  86. mpi_free( &X );
  87. }
  88. END_CASE
  89. BEGIN_CASE
  90. mpi_write_file:radix_X:input_X:output_radix:output_file
  91. {
  92. mpi X, Y;
  93. FILE *file_out, *file_in;
  94. mpi_init( &X ); mpi_init( &Y );
  95. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  96. file_out = fopen( {output_file}, "w" );
  97. TEST_ASSERT( file_out != NULL );
  98. TEST_ASSERT( mpi_write_file( NULL, &X, {output_radix}, file_out ) == 0 );
  99. fclose(file_out);
  100. file_in = fopen( {output_file}, "r" );
  101. TEST_ASSERT( file_in != NULL );
  102. TEST_ASSERT( mpi_read_file( &Y, {output_radix}, file_in ) == 0 );
  103. fclose(file_in);
  104. TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
  105. mpi_free( &X ); mpi_free( &Y );
  106. }
  107. END_CASE
  108. BEGIN_CASE
  109. mpi_get_bit:radix_X:input_X:pos:val
  110. {
  111. mpi X;
  112. mpi_init( &X );
  113. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  114. TEST_ASSERT( mpi_get_bit( &X, {pos} ) == {val} );
  115. mpi_free( &X );
  116. }
  117. END_CASE
  118. BEGIN_CASE
  119. mpi_set_bit:radix_X:input_X:pos:val:radix_Y:output_Y
  120. {
  121. mpi X, Y;
  122. mpi_init( &X ); mpi_init( &Y );
  123. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  124. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {output_Y} ) == 0 );
  125. TEST_ASSERT( mpi_set_bit( &X, {pos}, {val} ) == 0 );
  126. TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
  127. mpi_free( &X );
  128. }
  129. END_CASE
  130. BEGIN_CASE
  131. mpi_lsb:radix_X:input_X:nr_bits
  132. {
  133. mpi X;
  134. mpi_init( &X );
  135. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  136. TEST_ASSERT( mpi_lsb( &X ) == {nr_bits} );
  137. mpi_free( &X );
  138. }
  139. END_CASE
  140. BEGIN_CASE
  141. mpi_msb:radix_X:input_X:nr_bits
  142. {
  143. mpi X;
  144. mpi_init( &X );
  145. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  146. TEST_ASSERT( mpi_msb( &X ) == {nr_bits} );
  147. mpi_free( &X );
  148. }
  149. END_CASE
  150. BEGIN_CASE
  151. mpi_gcd:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
  152. {
  153. mpi A, X, Y, Z;
  154. mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
  155. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  156. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  157. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  158. TEST_ASSERT( mpi_gcd( &Z, &X, &Y ) == 0 );
  159. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
  160. mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
  161. }
  162. END_CASE
  163. BEGIN_CASE
  164. mpi_cmp_int:input_X:input_A:result_CMP
  165. {
  166. mpi X;
  167. mpi_init( &X );
  168. TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0);
  169. TEST_ASSERT( mpi_cmp_int( &X, {input_A} ) == {result_CMP});
  170. mpi_free( &X );
  171. }
  172. END_CASE
  173. BEGIN_CASE
  174. mpi_cmp_mpi:radix_X:input_X:radix_Y:input_Y:input_A
  175. {
  176. mpi X, Y;
  177. mpi_init( &X ); mpi_init( &Y );
  178. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  179. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  180. TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == {input_A} );
  181. mpi_free( &X ); mpi_free( &Y );
  182. }
  183. END_CASE
  184. BEGIN_CASE
  185. mpi_cmp_abs:radix_X:input_X:radix_Y:input_Y:input_A
  186. {
  187. mpi X, Y;
  188. mpi_init( &X ); mpi_init( &Y );
  189. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  190. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  191. TEST_ASSERT( mpi_cmp_abs( &X, &Y ) == {input_A} );
  192. mpi_free( &X ); mpi_free( &Y );
  193. }
  194. END_CASE
  195. BEGIN_CASE
  196. mpi_copy:input_X:input_A
  197. {
  198. mpi X, Y, A;
  199. mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
  200. TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
  201. TEST_ASSERT( mpi_lset( &Y, {input_A} ) == 0 );
  202. TEST_ASSERT( mpi_lset( &A, {input_A} ) == 0 );
  203. TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
  204. TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
  205. TEST_ASSERT( mpi_copy( &Y, &X ) == 0 );
  206. TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
  207. TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) != 0 );
  208. mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
  209. }
  210. END_CASE
  211. BEGIN_CASE
  212. mpi_copy_self:input_X
  213. {
  214. mpi X;
  215. mpi_init( &X );
  216. TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
  217. TEST_ASSERT( mpi_copy( &X, &X ) == 0 );
  218. TEST_ASSERT( mpi_cmp_int( &X, {input_X} ) == 0 );
  219. mpi_free( &X );
  220. }
  221. END_CASE
  222. BEGIN_CASE
  223. mpi_swap:input_X:input_Y
  224. {
  225. mpi X, Y, A;
  226. mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
  227. TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
  228. TEST_ASSERT( mpi_lset( &Y, {input_Y} ) == 0 );
  229. TEST_ASSERT( mpi_lset( &A, {input_X} ) == 0 );
  230. TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
  231. TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
  232. mpi_swap( &X, &Y );
  233. TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
  234. TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
  235. mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
  236. }
  237. END_CASE
  238. BEGIN_CASE
  239. mpi_add_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
  240. {
  241. mpi X, Y, Z, A;
  242. mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
  243. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  244. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  245. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  246. TEST_ASSERT( mpi_add_mpi( &Z, &X, &Y ) == 0 );
  247. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
  248. mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
  249. }
  250. END_CASE
  251. BEGIN_CASE
  252. mpi_add_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
  253. {
  254. mpi X, Y, Z, A;
  255. mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
  256. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  257. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  258. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  259. TEST_ASSERT( mpi_add_abs( &Z, &X, &Y ) == 0 );
  260. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
  261. mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
  262. }
  263. END_CASE
  264. BEGIN_CASE
  265. mpi_add_abs_add_first:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
  266. {
  267. mpi X, Y, A;
  268. mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
  269. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  270. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  271. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  272. TEST_ASSERT( mpi_add_abs( &X, &X, &Y ) == 0 );
  273. TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
  274. mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
  275. }
  276. END_CASE
  277. BEGIN_CASE
  278. mpi_add_abs_add_second:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
  279. {
  280. mpi X, Y, A;
  281. mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
  282. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  283. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  284. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  285. TEST_ASSERT( mpi_add_abs( &Y, &X, &Y ) == 0 );
  286. TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
  287. mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
  288. }
  289. END_CASE
  290. BEGIN_CASE
  291. mpi_add_int:radix_X:input_X:input_Y:radix_A:input_A
  292. {
  293. mpi X, Z, A;
  294. mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
  295. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  296. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  297. TEST_ASSERT( mpi_add_int( &Z, &X, {input_Y} ) == 0 );
  298. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
  299. mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
  300. }
  301. END_CASE
  302. BEGIN_CASE
  303. mpi_sub_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
  304. {
  305. mpi X, Y, Z, A;
  306. mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
  307. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  308. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  309. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  310. TEST_ASSERT( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
  311. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
  312. mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
  313. }
  314. END_CASE
  315. BEGIN_CASE
  316. mpi_sub_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:sub_result
  317. {
  318. mpi X, Y, Z, A;
  319. int res;
  320. mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
  321. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  322. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  323. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  324. res = mpi_sub_abs( &Z, &X, &Y );
  325. TEST_ASSERT( res == {sub_result} );
  326. if( res == 0 )
  327. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
  328. mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
  329. }
  330. END_CASE
  331. BEGIN_CASE
  332. mpi_sub_int:radix_X:input_X:input_Y:radix_A:input_A
  333. {
  334. mpi X, Z, A;
  335. mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
  336. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  337. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  338. TEST_ASSERT( mpi_sub_int( &Z, &X, {input_Y} ) == 0 );
  339. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
  340. mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
  341. }
  342. END_CASE
  343. BEGIN_CASE
  344. mpi_mul_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
  345. {
  346. mpi X, Y, Z, A;
  347. mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
  348. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  349. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  350. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  351. TEST_ASSERT( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
  352. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
  353. mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
  354. }
  355. END_CASE
  356. BEGIN_CASE
  357. mpi_mul_int:radix_X:input_X:input_Y:radix_A:input_A:result_comparison
  358. {
  359. mpi X, Z, A;
  360. mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
  361. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  362. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  363. TEST_ASSERT( mpi_mul_int( &Z, &X, {input_Y} ) == 0 );
  364. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) {result_comparison} 0 );
  365. mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
  366. }
  367. END_CASE
  368. BEGIN_CASE
  369. mpi_div_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:radix_B:input_B:div_result
  370. {
  371. mpi X, Y, Q, R, A, B;
  372. int res;
  373. mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
  374. mpi_init( &A ); mpi_init( &B );
  375. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  376. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  377. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  378. TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
  379. res = mpi_div_mpi( &Q, &R, &X, &Y );
  380. TEST_ASSERT( res == {div_result} );
  381. if( res == 0 )
  382. {
  383. TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
  384. TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
  385. }
  386. mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
  387. mpi_free( &A ); mpi_free( &B );
  388. }
  389. END_CASE
  390. BEGIN_CASE
  391. mpi_div_int:radix_X:input_X:input_Y:radix_A:input_A:radix_B:input_B:div_result
  392. {
  393. mpi X, Q, R, A, B;
  394. int res;
  395. mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
  396. mpi_init( &B );
  397. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  398. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  399. TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
  400. res = mpi_div_int( &Q, &R, &X, {input_Y} );
  401. TEST_ASSERT( res == {div_result} );
  402. if( res == 0 )
  403. {
  404. TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
  405. TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
  406. }
  407. mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
  408. mpi_free( &B );
  409. }
  410. END_CASE
  411. BEGIN_CASE
  412. mpi_mod_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
  413. {
  414. mpi X, Y, Z, A;
  415. int res;
  416. mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
  417. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  418. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  419. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  420. res = mpi_mod_mpi( &Z, &X, &Y );
  421. TEST_ASSERT( res == {div_result} );
  422. if( res == 0 )
  423. {
  424. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
  425. }
  426. mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
  427. }
  428. END_CASE
  429. BEGIN_CASE
  430. mpi_mod_int:radix_X:input_X:input_Y:input_A:div_result
  431. {
  432. mpi X;
  433. int res;
  434. t_uint r;
  435. mpi_init( &X );
  436. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  437. res = mpi_mod_int( &r, &X, {input_Y} );
  438. TEST_ASSERT( res == {div_result} );
  439. if( res == 0 )
  440. {
  441. TEST_ASSERT( r == {input_A} );
  442. }
  443. mpi_free( &X );
  444. }
  445. END_CASE
  446. BEGIN_CASE
  447. mpi_exp_mod:radix_A:input_A:radix_E:input_E:radix_N:input_N:radix_RR:input_RR:radix_X:input_X:div_result
  448. {
  449. mpi A, E, N, RR, Z, X;
  450. int res;
  451. mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
  452. mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
  453. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  454. TEST_ASSERT( mpi_read_string( &E, {radix_E}, {input_E} ) == 0 );
  455. TEST_ASSERT( mpi_read_string( &N, {radix_N}, {input_N} ) == 0 );
  456. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  457. if( strlen( {input_RR} ) )
  458. TEST_ASSERT( mpi_read_string( &RR, {radix_RR}, {input_RR} ) == 0 );
  459. res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
  460. TEST_ASSERT( res == {div_result} );
  461. if( res == 0 )
  462. {
  463. TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
  464. }
  465. mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
  466. mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
  467. }
  468. END_CASE
  469. BEGIN_CASE
  470. mpi_inv_mod:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
  471. {
  472. mpi X, Y, Z, A;
  473. int res;
  474. mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
  475. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  476. TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
  477. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  478. res = mpi_inv_mod( &Z, &X, &Y );
  479. TEST_ASSERT( res == {div_result} );
  480. if( res == 0 )
  481. {
  482. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
  483. }
  484. mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
  485. }
  486. END_CASE
  487. BEGIN_CASE
  488. mpi_is_prime:radix_X:input_X:div_result
  489. {
  490. mpi X;
  491. int res;
  492. mpi_init( &X );
  493. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  494. res = mpi_is_prime( &X, rnd_std_rand, NULL );
  495. TEST_ASSERT( res == {div_result} );
  496. mpi_free( &X );
  497. }
  498. END_CASE
  499. BEGIN_CASE
  500. mpi_shift_l:radix_X:input_X:shift_X:radix_A:input_A
  501. {
  502. mpi X, A;
  503. mpi_init( &X ); mpi_init( &A );
  504. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  505. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  506. TEST_ASSERT( mpi_shift_l( &X, {shift_X} ) == 0 );
  507. TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
  508. mpi_free( &X ); mpi_free( &A );
  509. }
  510. END_CASE
  511. BEGIN_CASE
  512. mpi_shift_r:radix_X:input_X:shift_X:radix_A:input_A
  513. {
  514. mpi X, A;
  515. mpi_init( &X ); mpi_init( &A );
  516. TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
  517. TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
  518. TEST_ASSERT( mpi_shift_r( &X, {shift_X} ) == 0 );
  519. TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
  520. mpi_free( &X ); mpi_free( &A );
  521. }
  522. END_CASE
  523. BEGIN_CASE
  524. mpi_selftest:
  525. {
  526. TEST_ASSERT( mpi_self_test( 0 ) == 0 );
  527. }
  528. END_CASE
  529. /* Helper Code
  530. char str[1000];
  531. int len = 1000;
  532. mpi_write_string(&Z, 10, str, &len);
  533. printf("Z: %d %s\n", Z.s, str);
  534. TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
  535. */