5 * Created on 08/17/2010
7 * Copyright (c) 2010,2011,2012,2014,2015 Apple Inc. All rights reserved.
12 @header corecrypto/ccdrbg.h
13 @abstract The functions provided in ccdrbg.h implement high-level accessors
14 to cryptographically secure random numbers.
18 #ifndef _CORECRYPTO_CCDRBG_H_
19 #define _CORECRYPTO_CCDRBG_H_
21 #include <corecrypto/cc.h>
22 #include <corecrypto/ccdrbg_impl.h>
25 #define CCDRBG_STATUS_OK 0
26 #define CCDRBG_STATUS_ERROR (-1)
27 #define CCDRBG_STATUS_NEED_RESEED (-2)
28 #define CCDRBG_STATUS_PARAM_ERROR (-3)
31 * The maximum length of the entropy_input, additional_input (max_additional_input_length) , personalization string
32 * (max_personalization_string_length) and max_number_of_bits_per_request are implementation dependent
33 * but shall fit in a 32 bit register and be be less than or equal to the specified maximum length for the
34 * selected DRBG mechanism (NIST 800-90A Section 10).
37 #define CCDRBG_MAX_ENTROPY_SIZE ((uint32_t)1<<16)
38 #define CCDRBG_MAX_ADDITIONALINPUT_SIZE ((uint32_t)1<<16)
39 #define CCDRBG_MAX_PSINPUT_SIZE ((uint32_t)1<<16)
40 #define CCDRBG_MAX_REQUEST_SIZE ((uint32_t)1<<16) //this is the the absolute maximum in NIST 800-90A
41 #define CCDRBG_RESEED_INTERVAL ((uint64_t)1<<30) // must be able to fit the NIST maximum of 2^48
45 * The entropyLength is forced to be greater or equal than the security strength.
46 * Nonce is not forced. It either needs to have 0.5*security strength entropy. Or, a vale that is repeated
47 * less than a 0.5*security strength bit random string.
48 * see below or NIST 800-90A for the definition of security strength
51 CC_INLINE
int ccdrbg_init(const struct ccdrbg_info
*info
,
52 struct ccdrbg_state
*drbg
,
53 unsigned long entropyLength
, const void* entropy
,
54 unsigned long nonceLength
, const void* nonce
,
55 unsigned long psLength
, const void* ps
)
57 return info
->init(info
, drbg
, entropyLength
, entropy
, nonceLength
, nonce
, psLength
, ps
);
61 * The entropyLength is forced to be greater or equal than the security strength.
63 CC_INLINE
int ccdrbg_reseed(const struct ccdrbg_info
*info
,
64 struct ccdrbg_state
*drbg
,
65 unsigned long entropyLength
, const void *entropy
,
66 unsigned long additionalLength
, const void *additional
)
68 return info
->reseed(drbg
, entropyLength
, entropy
, additionalLength
, additional
);
72 CC_INLINE
int ccdrbg_generate(const struct ccdrbg_info
*info
,
73 struct ccdrbg_state
*drbg
,
74 unsigned long dataOutLength
, void *dataOut
,
75 unsigned long additionalLength
, const void *additional
)
77 return info
->generate(drbg
, dataOutLength
, dataOut
, additionalLength
, additional
);
80 CC_INLINE
void ccdrbg_done(const struct ccdrbg_info
*info
,
81 struct ccdrbg_state
*drbg
)
86 CC_INLINE
size_t ccdrbg_context_size(const struct ccdrbg_info
*drbg
)
93 * NIST SP 800-90 CTR_DRBG
94 * the mximum security strengh of drbg equals to the block size of the corresponding ECB.
96 struct ccdrbg_nistctr_custom
{
97 const struct ccmode_ecb
*ecb
;
103 void ccdrbg_factory_nistctr(struct ccdrbg_info
*info
, const struct ccdrbg_nistctr_custom
*custom
);
106 * NIST SP 800-90 HMAC_DRBG
107 * the mximum security strengh of drbg is half of output size of the input hash function and it internally is limited to 256 bits
109 extern struct ccdrbg_info ccdrbg_nistdigest_info
;
111 struct ccdrbg_nisthmac_custom
{
112 const struct ccdigest_info
*di
;
116 void ccdrbg_factory_nisthmac(struct ccdrbg_info
*info
, const struct ccdrbg_nisthmac_custom
*custom
);
122 extern struct ccdrbg_info ccdrbg_dummy_info
;
124 #endif /* _CORECRYPTO_CCDRBG_H_ */