Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

139 рядки
3.8 KiB

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "../xmss_core_fast.h"
  4. #include "../params.h"
  5. #include "../randombytes.h"
  6. #define MLEN 3491
  7. #define SIGNATURES 128
  8. unsigned char mi[MLEN];
  9. unsigned long long smlen;
  10. unsigned long long mlen;
  11. unsigned long long t1, t2;
  12. unsigned long long cpucycles(void)
  13. {
  14. unsigned long long result;
  15. asm volatile(".byte 15;.byte 49;shlq $32,%%rdx;orq %%rdx,%%rax" : "=a" (result) :: "%rdx");
  16. return result;
  17. }
  18. int main()
  19. {
  20. xmss_params params;
  21. // TODO test more different OIDs
  22. uint32_t oid = 0x01000001;
  23. xmssmt_parse_oid(&params, oid);
  24. int r;
  25. unsigned long long i,j;
  26. unsigned int n = params.n;
  27. unsigned int h = params.full_height;
  28. unsigned int d = params.d;
  29. unsigned int k = params.bds_k;
  30. unsigned int tree_h = h / d;
  31. // stack needs to be larger than regular (H-K-1), since we re-use for 'next'
  32. unsigned char stack[(2*d-1) * (tree_h + 1)*n];
  33. unsigned char stacklevels[(2*d-1) * (tree_h + 1)*n];
  34. unsigned char auth[(2*d-1) * tree_h*n];
  35. unsigned char keep[(2*d-1) * (tree_h >> 1)*n];
  36. treehash_inst treehash[(2*d-1) * (tree_h-k)];
  37. unsigned char th_nodes[(2*d-1) * (tree_h-k)*n];
  38. unsigned char retain[(2*d-1) * ((1 << k) - k - 1)*n];
  39. unsigned char wots_sigs[d * params.wots_sig_bytes];
  40. // first d are 'regular' states, second d are 'next'; top tree has no 'next'
  41. bds_state states[2*d-1];
  42. for (i = 0; i < 2*d-1; i++) {
  43. for (j = 0; j < tree_h-k; j++)
  44. treehash[i*(tree_h-k) + j].node = th_nodes + (i*(tree_h-k) + j) * n;
  45. xmss_set_bds_state(states + i,
  46. stack + i*(tree_h + 1)*n, 0, stacklevels + i*(tree_h + 1),
  47. auth + i*tree_h*n,
  48. keep + i*(tree_h >> 1)*n,
  49. treehash + i*(tree_h-k),
  50. retain + i*((1 << k) - k - 1)*n,
  51. 0
  52. );
  53. }
  54. unsigned char sk[(params.index_bytes+4*n)];
  55. unsigned char pk[2*n];
  56. unsigned long long signature_length = params.index_bytes + n + (d*params.wots_sig_bytes) + h*n;
  57. unsigned char mo[MLEN+signature_length];
  58. unsigned char sm[MLEN+signature_length];
  59. randombytes(mi, MLEN);
  60. printf("keypair\n");
  61. xmssmt_core_keypair(&params, pk, sk, states, wots_sigs);
  62. // check pub_seed in SK
  63. for (i = 0; i < n; i++) {
  64. if (pk[n+i] != sk[params.index_bytes+2*n+i]) printf("pk.pub_seed != sk.pub_seed %llu",i);
  65. if (pk[i] != sk[params.index_bytes+3*n+i]) printf("pk.root != sk.root %llu",i);
  66. }
  67. printf("pk checked\n");
  68. unsigned int idx_len = params.index_bytes;
  69. // check index
  70. unsigned long long idx = 0;
  71. for (i = 0; i < idx_len; i++) {
  72. idx |= ((unsigned long long)sk[i]) << 8*(idx_len - 1 - i);
  73. }
  74. if (idx) printf("\nidx != 0: %llu\n",idx);
  75. for (i = 0; i < SIGNATURES; i++) {
  76. printf("sign\n");
  77. t1 = cpucycles();
  78. xmssmt_core_sign(&params, sk, states, wots_sigs, sm, &smlen, mi, MLEN);
  79. t2 = cpucycles();
  80. printf("signing cycles = %llu\n", (t2-t1));
  81. idx = 0;
  82. for (j = 0; j < idx_len; j++) {
  83. idx += ((unsigned long long)sm[j]) << 8*(idx_len - 1 - j);
  84. }
  85. printf("\nidx = %llu\n",idx);
  86. r = memcmp(mi, sm+signature_length,MLEN);
  87. printf("%d\n", r);
  88. /* Test valid signature */
  89. printf("verify\n");
  90. t1 = cpucycles();
  91. r = xmssmt_core_sign_open(&params, mo, &mlen, sm, smlen, pk);
  92. t2 = cpucycles();
  93. printf("verification cycles = %llu\n", (t2-t1));
  94. printf("%d\n", r);
  95. r = memcmp(mi,mo,MLEN);
  96. printf("%d\n", r);
  97. printf("%llu\n", MLEN-mlen);
  98. /* Test with modified message */
  99. sm[52] ^= 1;
  100. r = xmssmt_core_sign_open(&params, mo, &mlen, sm, smlen, pk);
  101. printf("%d\n", r+1);
  102. r = memcmp(mi,mo,MLEN);
  103. printf("%d\n", (r!=0) - 1);
  104. printf("%llu\n", mlen+1);
  105. /* Test with modified signature */
  106. sm[260] ^= 1;
  107. sm[52] ^= 1;
  108. sm[2] ^= 1;
  109. r = xmssmt_core_sign_open(&params, mo, &mlen, sm, smlen, pk);
  110. printf("%d\n", r+1);
  111. r = memcmp(mi,mo,MLEN);
  112. printf("%d\n", (r!=0) - 1);
  113. printf("%llu\n", mlen+1);
  114. }
  115. return 0;
  116. }