| /* fips/rand/fips_rand_lcl.h */ |
| /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| * project. |
| */ |
| /* ==================================================================== |
| * Copyright (c) 2011 The OpenSSL Project. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * 3. All advertising materials mentioning features or use of this |
| * software must display the following acknowledgment: |
| * "This product includes software developed by the OpenSSL Project |
| * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" |
| * |
| * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
| * endorse or promote products derived from this software without |
| * prior written permission. For written permission, please contact |
| * licensing@OpenSSL.org. |
| * |
| * 5. Products derived from this software may not be called "OpenSSL" |
| * nor may "OpenSSL" appear in their names without prior written |
| * permission of the OpenSSL Project. |
| * |
| * 6. Redistributions of any form whatsoever must retain the following |
| * acknowledgment: |
| * "This product includes software developed by the OpenSSL Project |
| * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
| * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
| * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
| * OF THE POSSIBILITY OF SUCH DAMAGE. |
| * ==================================================================== |
| */ |
| |
| typedef struct drbg_hash_ctx_st DRBG_HASH_CTX; |
| typedef struct drbg_ctr_ctx_st DRBG_CTR_CTX; |
| |
| /* 888 bits from 10.1 table 2 */ |
| #define HASH_PRNG_MAX_SEEDLEN 111 |
| |
| struct drbg_hash_ctx_st |
| { |
| const EVP_MD *md; |
| EVP_MD_CTX mctx; |
| unsigned char V[HASH_PRNG_MAX_SEEDLEN]; |
| unsigned char C[HASH_PRNG_MAX_SEEDLEN]; |
| /* Temporary value storage: should always exceed max digest length */ |
| unsigned char vtmp[HASH_PRNG_MAX_SEEDLEN]; |
| }; |
| |
| struct drbg_ctr_ctx_st |
| { |
| AES_KEY ks; |
| size_t keylen; |
| unsigned char K[32]; |
| unsigned char V[16]; |
| /* Temp variables used by derivation function */ |
| AES_KEY df_ks; |
| AES_KEY df_kxks; |
| /* Temporary block storage used by ctr_df */ |
| unsigned char bltmp[16]; |
| size_t bltmp_pos; |
| unsigned char KX[48]; |
| }; |
| |
| /* DRBG flags */ |
| |
| /* Functions shouldn't call err library */ |
| #define DRBG_FLAG_NOERR 0x4 |
| |
| /* DRBG status values */ |
| /* not initialised */ |
| #define DRBG_STATUS_UNINITIALISED 0 |
| /* ok and ready to generate random bits */ |
| #define DRBG_STATUS_READY 1 |
| /* reseed required */ |
| #define DRBG_STATUS_RESEED 2 |
| /* fatal error condition */ |
| #define DRBG_STATUS_ERROR 3 |
| |
| /* A default maximum length: larger than any reasonable value used in pratice */ |
| |
| #define DRBG_MAX_LENGTH 0x7ffffff0 |
| /* Maximum DRBG block length: all md sizes are bigger than cipher blocks sizes |
| * so use max digest length. |
| */ |
| #define DRBG_MAX_BLOCK EVP_MAX_MD_SIZE |
| |
| /* DRBG context structure */ |
| |
| struct drbg_ctx_st |
| { |
| /* First types common to all implementations */ |
| /* DRBG type: a NID for the underlying algorithm */ |
| int type; |
| /* Various flags */ |
| unsigned int flags; |
| |
| /* The following parameters are setup by mechanism drbg_init() call */ |
| int strength; |
| size_t blocklength; |
| size_t max_request; |
| |
| size_t min_entropy, max_entropy; |
| size_t min_nonce, max_nonce; |
| size_t max_pers, max_adin; |
| unsigned int reseed_counter; |
| unsigned int reseed_interval; |
| size_t seedlen; |
| int status; |
| /* Application data: typically used by test get_entropy */ |
| void *app_data; |
| /* Implementation specific structures */ |
| union |
| { |
| DRBG_HASH_CTX hash; |
| DRBG_CTR_CTX ctr; |
| } d; |
| /* Initialiase PRNG and setup callbacks below */ |
| int (*init)(DRBG_CTX *ctx, int nid, int security, unsigned int flags); |
| /* Intantiate PRNG */ |
| int (*instantiate)(DRBG_CTX *ctx, |
| const unsigned char *ent, size_t entlen, |
| const unsigned char *nonce, size_t noncelen, |
| const unsigned char *pers, size_t perslen); |
| /* reseed */ |
| int (*reseed)(DRBG_CTX *ctx, |
| const unsigned char *ent, size_t entlen, |
| const unsigned char *adin, size_t adinlen); |
| /* generat output */ |
| int (*generate)(DRBG_CTX *ctx, |
| unsigned char *out, size_t outlen, |
| const unsigned char *adin, size_t adinlen); |
| /* uninstantiate */ |
| int (*uninstantiate)(DRBG_CTX *ctx); |
| |
| /* entropy gathering function */ |
| size_t (*get_entropy)(DRBG_CTX *ctx, unsigned char **pout, |
| int entropy, size_t min_len, size_t max_len); |
| /* Indicates we have finished with entropy buffer */ |
| void (*cleanup_entropy)(DRBG_CTX *ctx, unsigned char *out, size_t olen); |
| |
| /* nonce gathering function */ |
| size_t (*get_nonce)(DRBG_CTX *ctx, unsigned char **pout, |
| int entropy, size_t min_len, size_t max_len); |
| /* Indicates we have finished with nonce buffer */ |
| void (*cleanup_nonce)(DRBG_CTX *ctx, unsigned char *out, size_t olen); |
| |
| /* Continuous random number test temporary area */ |
| /* Last block */ |
| unsigned char lb[EVP_MAX_MD_SIZE]; |
| /* set if lb is valid */ |
| int lb_valid; |
| |
| /* Callbacks used when called through RAND interface */ |
| /* Get any additional input for generate */ |
| size_t (*get_adin)(DRBG_CTX *ctx, unsigned char **pout); |
| void (*cleanup_adin)(DRBG_CTX *ctx, unsigned char *out, size_t olen); |
| /* Callback for RAND_seed(), RAND_add() */ |
| int (*rand_seed_cb)(DRBG_CTX *ctx, const void *buf, int num); |
| int (*rand_add_cb)(DRBG_CTX *ctx, |
| const void *buf, int num, double entropy); |
| }; |
| |
| |
| int fips_drbg_ctr_init(DRBG_CTX *dctx); |
| int fips_drbg_hash_init(DRBG_CTX *dctx); |
| int fips_drbg_kat(DRBG_CTX *dctx, int nid, unsigned int flags); |
| int fips_drbg_cprng_test(DRBG_CTX *dctx, const unsigned char *out); |