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 */
18struct ccdrbg_state;
19
20struct 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