您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

127 行
2.8 KiB

  1. /*
  2. * Generate intermediate test vectors useful to test implementations.
  3. */
  4. #include <stdio.h>
  5. #include <stdint.h>
  6. #include <string.h>
  7. #include "../wots.h"
  8. #include "../randombytes.h"
  9. #include "../params.h"
  10. #include "../fips202.h"
  11. #include "../xmss_commons.h"
  12. #include "../xmss_core.h"
  13. void print_hex(unsigned char *buf, int len) {
  14. for (int i = 0; i < len; i++) {
  15. printf("%x%x", buf[i] / 16, buf[i] & 15);
  16. }
  17. }
  18. void print_hash(unsigned char *buf, int len) {
  19. unsigned char tmp[10];
  20. shake128(tmp, 10, buf, len);
  21. print_hex(tmp, 10);
  22. }
  23. int vectors_xmss(uint32_t oid, int mt) {
  24. xmss_params params;
  25. if (mt) {
  26. xmssmt_parse_oid(&params, oid);
  27. } else {
  28. xmss_parse_oid(&params, oid);
  29. }
  30. unsigned char seed[params.n * 3];
  31. unsigned char pk[params.pk_bytes];
  32. unsigned char sk[params.sk_bytes];
  33. unsigned char msg[1] = {37};
  34. unsigned char sm[params.sig_bytes + 1];
  35. unsigned long long smlen = 0;
  36. for (int i = 0; i < 3*params.n; i++) {
  37. seed[i] = i;
  38. }
  39. xmssmt_core_seed_keypair(&params, pk, sk, seed);
  40. ull_to_bytes(sk, params.index_bytes, 1 << (params.full_height - 1));
  41. if (mt) {
  42. xmssmt_core_sign(&params, sk, sm, &smlen, msg, 1);
  43. } else {
  44. xmss_core_sign(&params, sk, sm, &smlen, msg, 1);
  45. }
  46. if (mt) {
  47. printf("XMSSMT ");
  48. } else {
  49. printf("XMSS ");
  50. }
  51. printf("%d ", oid);
  52. print_hash(pk, params.pk_bytes);
  53. printf(" ");
  54. print_hash(sm, params.sig_bytes);
  55. printf("\n");
  56. }
  57. int vectors_wots(uint32_t oid) {
  58. xmss_params params;
  59. xmss_parse_oid(&params, oid);
  60. unsigned char sk_seed[params.n];
  61. unsigned char pub_seed[params.n];
  62. unsigned char pk[params.wots_sig_bytes];
  63. unsigned char leaf[params.n];
  64. unsigned char sig[params.wots_sig_bytes];
  65. unsigned char m[params.n];
  66. uint32_t addr[8] = {0};
  67. uint32_t addr2[8] = {0};
  68. for (int i = 0; i < 8; i++) {
  69. addr[i] = 500000000*i;
  70. addr2[i] = 400000000*i;
  71. }
  72. for (int i = 0; i < params.n; i++) {
  73. m[i] = 3*i;
  74. pub_seed[i] = 2*i;
  75. sk_seed[i] = i;
  76. }
  77. wots_pkgen(&params, pk, sk_seed, pub_seed, addr);
  78. wots_sign(&params, sig, m, sk_seed, pub_seed, addr);
  79. printf("WOTS+ %d ", oid);
  80. print_hash(pk, params.wots_sig_bytes);
  81. printf(" ");
  82. print_hash(sig, params.wots_sig_bytes);
  83. printf(" ");
  84. // Note that this garbles pk
  85. gen_leaf_wots(&params, leaf, sk_seed, pub_seed, addr, addr2);
  86. print_hash(leaf, params.n);
  87. printf("\n");
  88. return 0;
  89. }
  90. int main() {
  91. for (uint32_t oid = 1; oid <= 0x15; oid += 3) {
  92. vectors_wots(oid);
  93. }
  94. for (uint32_t oid = 2; oid <= 56; oid += 8) {
  95. vectors_xmss(oid, 1);
  96. }
  97. for (uint32_t oid = 1; oid <= 0x15; oid += 3) {
  98. vectors_xmss(oid, 0);
  99. }
  100. }