You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 rivejä
2.9 KiB

  1. /*
  2. * Generate intermediate test vectors useful to test implementations.
  3. */
  4. #include <stdint.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include "../fips202.h"
  8. #include "../params.h"
  9. #include "../randombytes.h"
  10. #include "../utils.h"
  11. #include "../wots.h"
  12. #include "../xmss_commons.h"
  13. #include "../xmss_core.h"
  14. void print_hex(unsigned char *buf, int len) {
  15. for (int i = 0; i < len; i++) { printf("0x%02X, ", buf[i]); }
  16. printf("\n");
  17. //printf("%x%x", buf[i] / 16, buf[i] & 15); }
  18. }
  19. void print_hash(unsigned char *buf, int len) {
  20. unsigned char tmp[10];
  21. shake128(tmp, 10, buf, len);
  22. print_hex(tmp, 10);
  23. }
  24. void vectors_xmss(uint32_t oid, int mt) {
  25. xmss_params params;
  26. if (mt) {
  27. xmssmt_parse_oid(&params, oid);
  28. } else {
  29. xmss_parse_oid(&params, oid);
  30. }
  31. unsigned char seed[params.n * 3];
  32. unsigned char pk[params.pk_bytes];
  33. unsigned char sk[params.sk_bytes];
  34. unsigned char msg[1] = {37};
  35. unsigned char sm[params.sig_bytes + 1];
  36. unsigned long long smlen = 0;
  37. for (unsigned int i = 0; i < 3 * params.n; i++) { seed[i] = i; }
  38. xmssmt_core_seed_keypair(&params, pk, sk, seed);
  39. ull_to_bytes(sk, params.index_bytes, 1 << (params.full_height - 1));
  40. if (mt) {
  41. xmssmt_core_sign(&params, sk, sm, &smlen, msg, 1);
  42. } else {
  43. xmss_core_sign(&params, sk, sm, &smlen, msg, 1);
  44. }
  45. if (mt) {
  46. printf("XMSSMT ");
  47. } else {
  48. printf("XMSS ");
  49. }
  50. printf("%X ", oid);
  51. print_hex(pk, params.pk_bytes);
  52. print_hex(pk, params.pk_bytes);
  53. printf(" ");
  54. print_hex(sm, params.sig_bytes);
  55. printf("\n");
  56. }
  57. void 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 (unsigned int i = 0; i < 8; i++) {
  69. addr[i] = 500000000 * i;
  70. addr2[i] = 400000000 * i;
  71. }
  72. for (unsigned 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. }
  89. int main() {
  90. //for (uint32_t oid = 1; oid <= 0x15; oid += 3) { vectors_wots(oid); }
  91. //for (uint32_t oid = 2; oid <= 56; oid += 8) { vectors_xmss(oid, 1); }
  92. for (uint32_t oid = 1; oid <= 0x15; oid += 3) { vectors_xmss(oid, 0); }
  93. }