| 1 | /* Copyright (c) (2012,2015,2016,2019-2022) Apple Inc. All rights reserved. | 
| 2 |  * | 
| 3 |  * corecrypto is licensed under Apple Inc.’s Internal Use License Agreement (which | 
| 4 |  * is contained in the License.txt file distributed with corecrypto) and only to | 
| 5 |  * people who accept that license. IMPORTANT:  Any license rights granted to you by | 
| 6 |  * Apple Inc. (if any) are limited to internal use within your organization only on | 
| 7 |  * devices and computers you own or control, for the sole purpose of verifying the | 
| 8 |  * security characteristics and correct functioning of the Apple Software.  You may | 
| 9 |  * not, directly or indirectly, redistribute the Apple Software or any portions thereof. | 
| 10 |  */ | 
| 11 |  | 
| 12 | #ifndef _CORECRYPTO_CCDRBG_IMPL_H_ | 
| 13 | #define _CORECRYPTO_CCDRBG_IMPL_H_ | 
| 14 |  | 
| 15 | #include <corecrypto/cc.h> | 
| 16 |  | 
| 17 | /* opaque drbg structure */ | 
| 18 | struct ccdrbg_state; | 
| 19 |  | 
| 20 | struct ccdrbg_info { | 
| 21 |     /*! Size of the DRBG state in bytes **/ | 
| 22 |     size_t size; | 
| 23 |  | 
| 24 |     /*! Instantiate the DRBG | 
| 25 |      @param drbg       The DRBG state | 
| 26 |      @param entropylen Length of entropy | 
| 27 |      @param entropy    Entropy bytes | 
| 28 |      @param inlen      Length of additional input | 
| 29 |      @param in         Additional input bytes | 
| 30 |      @return 0 if successful | 
| 31 |      */ | 
| 32 |     int (*CC_SPTR(ccdrbg_info, init))(const struct ccdrbg_info *info, struct ccdrbg_state *drbg, | 
| 33 |                 size_t entropyLength, const void* entropy, | 
| 34 |                 size_t nonceLength, const void* nonce, | 
| 35 |                 size_t psLength, const void* ps); | 
| 36 |  | 
| 37 |     /*! Add entropy to the DRBG | 
| 38 |      @param drbg       The DRBG state | 
| 39 |      @param entropylen Length of entropy | 
| 40 |      @param entropy    Entropy bytes | 
| 41 |      @param inlen      Length of additional input | 
| 42 |      @param in         Additional input bytes | 
| 43 |      @return 0 if successful | 
| 44 |      */ | 
| 45 |     int (*CC_SPTR(ccdrbg_info, reseed))(struct ccdrbg_state *drbg, | 
| 46 |                   size_t entropylen, const void *entropy, | 
| 47 |                   size_t inlen, const void *in); | 
| 48 |  | 
| 49 |     /*! Read from the DRBG in a FIPS Testing compliant manor | 
| 50 |      @param drbg    The DRBG state to read from | 
| 51 |      @param out     [out] Where to store the data | 
| 52 |      @param outlen  Length of data desired (octets) | 
| 53 |      @param inlen   Length of additional input | 
| 54 |      @param in      Additional input bytes | 
| 55 |      @return 0 if successfull | 
| 56 |      */ | 
| 57 |     int (*CC_SPTR(ccdrbg_info, generate))(struct ccdrbg_state *drbg, | 
| 58 |                     size_t outlen, void *out, | 
| 59 |                     size_t inlen, const void *in); | 
| 60 |  | 
| 61 |     /*! Terminate a DRBG state | 
| 62 |      @param drbg   The DRBG state to terminate | 
| 63 |      */ | 
| 64 |     void (*CC_SPTR(ccdrbg_info, done))(struct ccdrbg_state *drbg); | 
| 65 |  | 
| 66 |     /** private parameters */ | 
| 67 |     const void *custom; | 
| 68 |  | 
| 69 |     /*! Whether the DRBG requires a reseed to continue generation | 
| 70 |      @param drbg    The DRBG state | 
| 71 |      @return true if the DRBG requires reseed; false otherwise | 
| 72 |      */ | 
| 73 |     bool (*CC_SPTR(ccdrbg_info, must_reseed))(const struct ccdrbg_state *drbg); | 
| 74 | }; | 
| 75 |  | 
| 76 |  | 
| 77 |  | 
| 78 | #endif // _CORECRYPTO_CCDRBG_IMPL_H_ | 
| 79 |  |