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

67 строки
1.7 KiB

  1. #include "api.h"
  2. #include "randombytes.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. #define NTESTS 100
  6. #define MAXMLEN 2048
  7. static void printbytes(const unsigned char *x, unsigned long long xlen) {
  8. unsigned long long i;
  9. for (i = 0; i < xlen; i++) {
  10. printf("%02x", x[i]);
  11. }
  12. printf("\n");
  13. }
  14. // https://stackoverflow.com/a/1489985/1711232
  15. #define PASTER(x, y) x##_##y
  16. #define EVALUATOR(x, y) PASTER(x, y)
  17. #define NAMESPACE(fun) EVALUATOR(PQCLEAN_NAMESPACE, fun)
  18. #define crypto_sign_keypair NAMESPACE(crypto_sign_keypair)
  19. #define crypto_sign NAMESPACE(crypto_sign)
  20. #define crypto_sign_open NAMESPACE(crypto_sign_open)
  21. int main(void) {
  22. unsigned char sk[CRYPTO_SECRETKEYBYTES];
  23. unsigned char pk[CRYPTO_PUBLICKEYBYTES];
  24. unsigned char mi[MAXMLEN];
  25. unsigned char sm[MAXMLEN + CRYPTO_BYTES];
  26. unsigned long long smlen;
  27. unsigned long long mlen;
  28. int r;
  29. unsigned long long i, k;
  30. for (i = 0; i < MAXMLEN; i = (i == 0) ? i + 1 : i << 1) {
  31. randombytes(mi, i);
  32. crypto_sign_keypair(pk, sk);
  33. printbytes(pk, CRYPTO_PUBLICKEYBYTES);
  34. printbytes(sk, CRYPTO_SECRETKEYBYTES);
  35. crypto_sign(sm, &smlen, mi, i, sk);
  36. printbytes(sm, smlen);
  37. // By relying on m == sm we prevent having to allocate CRYPTO_BYTES
  38. // twice
  39. r = crypto_sign_open(sm, &mlen, sm, smlen, pk);
  40. if (r) {
  41. printf("ERROR: signature verification failed\n");
  42. return -1;
  43. }
  44. for (k = 0; k < i; k++) {
  45. if (sm[k] != mi[k]) {
  46. printf("ERROR: message recovery failed\n");
  47. return -1;
  48. }
  49. }
  50. }
  51. return 0;
  52. }