Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

105 строки
3.7 KiB

  1. #ifndef XMSS_CORE_H
  2. #define XMSS_CORE_H
  3. #include "params.h"
  4. typedef struct{
  5. unsigned int h;
  6. unsigned int next_idx;
  7. unsigned int stackusage;
  8. unsigned char completed;
  9. unsigned char *node;
  10. } treehash_inst;
  11. typedef struct {
  12. unsigned char *stack;
  13. unsigned int stackoffset;
  14. unsigned char *stacklevels;
  15. unsigned char *auth;
  16. unsigned char *keep;
  17. treehash_inst *treehash;
  18. unsigned char *retain;
  19. unsigned int next_leaf;
  20. } bds_state;
  21. /**
  22. * Initialize BDS state struct
  23. * parameter names are the same as used in the description of the BDS traversal
  24. */
  25. void xmss_set_bds_state(bds_state *state, unsigned char *stack,
  26. int stackoffset, unsigned char *stacklevels,
  27. unsigned char *auth, unsigned char *keep,
  28. treehash_inst *treehash, unsigned char *retain,
  29. int next_leaf);
  30. /**
  31. * Given a set of parameters, this function returns the size of the secret key.
  32. * This is implementation specific, as varying choices in tree traversal will
  33. * result in varying requirements for state storage.
  34. */
  35. unsigned long long xmss_core_sk_bytes(const xmss_params *params);
  36. /**
  37. * Generates a XMSS key pair for a given parameter set.
  38. * Format sk: [(32bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
  39. * Format pk: [root || PUB_SEED] omitting algo oid.
  40. */
  41. int xmss_core_keypair(const xmss_params *params,
  42. unsigned char *pk, unsigned char *sk, bds_state *state);
  43. /**
  44. * Signs a message.
  45. * Returns
  46. * 1. an array containing the signature followed by the message AND
  47. * 2. an updated secret key!
  48. */
  49. int xmss_core_sign(const xmss_params *params,
  50. unsigned char *sk, bds_state *state,
  51. unsigned char *sm, unsigned long long *smlen,
  52. const unsigned char *m, unsigned long long mlen);
  53. /**
  54. * Verifies a given message signature pair under a given public key.
  55. *
  56. * Note: msg and mlen are pure outputs which carry the message in case verification succeeds. The (input) message is assumed to be within sm which has the form (sig||msg).
  57. */
  58. int xmss_core_sign_open(const xmss_params *params,
  59. unsigned char *m, unsigned long long *mlen,
  60. const unsigned char *sm, unsigned long long smlen,
  61. const unsigned char *pk);
  62. /**
  63. * Given a set of parameters, this function returns the size of the secret key.
  64. * This is implementation specific, as varying choices in tree traversal will
  65. * result in varying requirements for state storage.
  66. */
  67. unsigned long long xmssmt_core_sk_bytes(const xmss_params *params);
  68. /*
  69. * Generates a XMSSMT key pair for a given parameter set.
  70. * Format sk: [(ceil(h/8) bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
  71. * Format pk: [root || PUB_SEED] omitting algo oid.
  72. */
  73. int xmssmt_core_keypair(const xmss_params *params,
  74. unsigned char *pk, unsigned char *sk,
  75. bds_state *states, unsigned char *wots_sigs);
  76. /**
  77. * Signs a message.
  78. * Returns
  79. * 1. an array containing the signature followed by the message AND
  80. * 2. an updated secret key!
  81. */
  82. int xmssmt_core_sign(const xmss_params *params,
  83. unsigned char *sk,
  84. bds_state *states, unsigned char *wots_sigs,
  85. unsigned char *sm, unsigned long long *smlen,
  86. const unsigned char *m, unsigned long long mlen);
  87. /**
  88. * Verifies a given message signature pair under a given public key.
  89. */
  90. int xmssmt_core_sign_open(const xmss_params *params,
  91. unsigned char *m, unsigned long long *mlen,
  92. const unsigned char *sm, unsigned long long smlen,
  93. const unsigned char *pk);
  94. #endif