rand_pool.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License 2.0 (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. #ifndef OSSL_PROVIDER_RAND_POOL_H
  10. # define OSSL_PROVIDER_RAND_POOL_H
  11. # pragma once
  12. # include <stdio.h>
  13. # include <openssl/rand.h>
  14. /*
  15. * Maximum allocation size for RANDOM_POOL buffers
  16. *
  17. * The max_len value for the buffer provided to the rand_drbg_get_entropy()
  18. * callback is currently 2^31 bytes (2 gigabytes), if a derivation function
  19. * is used. Since this is much too large to be allocated, the ossl_rand_pool_new()
  20. * function chooses more modest values as default pool length, bounded
  21. * by RAND_POOL_MIN_LENGTH and RAND_POOL_MAX_LENGTH
  22. *
  23. * The choice of the RAND_POOL_FACTOR is large enough such that the
  24. * RAND_POOL can store a random input which has a lousy entropy rate of
  25. * 8/256 (= 0.03125) bits per byte. This input will be sent through the
  26. * derivation function which 'compresses' the low quality input into a
  27. * high quality output.
  28. *
  29. * The factor 1.5 below is the pessimistic estimate for the extra amount
  30. * of entropy required when no get_nonce() callback is defined.
  31. */
  32. # define RAND_POOL_FACTOR 256
  33. # define RAND_POOL_MAX_LENGTH (RAND_POOL_FACTOR * \
  34. 3 * (RAND_DRBG_STRENGTH / 16))
  35. /*
  36. * = (RAND_POOL_FACTOR * \
  37. * 1.5 * (RAND_DRBG_STRENGTH / 8))
  38. */
  39. /*
  40. * Initial allocation minimum.
  41. *
  42. * There is a distinction between the secure and normal allocation minimums.
  43. * Ideally, the secure allocation size should be a power of two. The normal
  44. * allocation size doesn't have any such restriction.
  45. *
  46. * The secure value is based on 128 bits of secure material, which is 16 bytes.
  47. * Typically, the DRBGs will set a minimum larger than this so optimal
  48. * allocation ought to take place (for full quality seed material).
  49. *
  50. * The normal value has been chosen by noticing that the rand_drbg_get_nonce
  51. * function is usually the largest of the built in allocation (twenty four
  52. * bytes and then appending another sixteen bytes). This means the buffer ends
  53. * with 40 bytes. The value of forty eight is comfortably above this which
  54. * allows some slack in the platform specific values used.
  55. */
  56. # define RAND_POOL_MIN_ALLOCATION(secure) ((secure) ? 16 : 48)
  57. /*
  58. * The 'random pool' acts as a dumb container for collecting random
  59. * input from various entropy sources. It is the callers duty to 1) initialize
  60. * the random pool, 2) pass it to the polling callbacks, 3) seed the RNG, and
  61. * 4) cleanup the random pool again.
  62. *
  63. * The random pool contains no locking mechanism because its scope and
  64. * lifetime is intended to be restricted to a single stack frame.
  65. */
  66. typedef struct rand_pool_st {
  67. unsigned char *buffer; /* points to the beginning of the random pool */
  68. size_t len; /* current number of random bytes contained in the pool */
  69. int attached; /* true pool was attached to existing buffer */
  70. int secure; /* 1: allocated on the secure heap, 0: otherwise */
  71. size_t min_len; /* minimum number of random bytes requested */
  72. size_t max_len; /* maximum number of random bytes (allocated buffer size) */
  73. size_t alloc_len; /* current number of bytes allocated */
  74. size_t entropy; /* current entropy count in bits */
  75. size_t entropy_requested; /* requested entropy count in bits */
  76. } RAND_POOL;
  77. RAND_POOL *ossl_rand_pool_new(int entropy_requested, int secure,
  78. size_t min_len, size_t max_len);
  79. RAND_POOL *ossl_rand_pool_attach(const unsigned char *buffer, size_t len,
  80. size_t entropy);
  81. void ossl_rand_pool_free(RAND_POOL *pool);
  82. const unsigned char *ossl_rand_pool_buffer(RAND_POOL *pool);
  83. unsigned char *ossl_rand_pool_detach(RAND_POOL *pool);
  84. void ossl_rand_pool_reattach(RAND_POOL *pool, unsigned char *buffer);
  85. size_t ossl_rand_pool_entropy(RAND_POOL *pool);
  86. size_t ossl_rand_pool_length(RAND_POOL *pool);
  87. size_t ossl_rand_pool_entropy_available(RAND_POOL *pool);
  88. size_t ossl_rand_pool_entropy_needed(RAND_POOL *pool);
  89. /* |entropy_factor| expresses how many bits of data contain 1 bit of entropy */
  90. size_t ossl_rand_pool_bytes_needed(RAND_POOL *pool, unsigned int entropy_factor);
  91. size_t ossl_rand_pool_bytes_remaining(RAND_POOL *pool);
  92. int ossl_rand_pool_add(RAND_POOL *pool,
  93. const unsigned char *buffer, size_t len, size_t entropy);
  94. unsigned char *ossl_rand_pool_add_begin(RAND_POOL *pool, size_t len);
  95. int ossl_rand_pool_add_end(RAND_POOL *pool, size_t len, size_t entropy);
  96. #endif /* OSSL_PROVIDER_RAND_POOL_H */