Blame crypto/fips/fips_drbg_ctr.c

Packit Service 084de1
/* fips/rand/fips_drbg_ctr.c */
Packit Service 084de1
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
Packit Service 084de1
 * project.
Packit Service 084de1
 */
Packit Service 084de1
/* ====================================================================
Packit Service 084de1
 * Copyright (c) 2011 The OpenSSL Project.  All rights reserved.
Packit Service 084de1
 *
Packit Service 084de1
 * Redistribution and use in source and binary forms, with or without
Packit Service 084de1
 * modification, are permitted provided that the following conditions
Packit Service 084de1
 * are met:
Packit Service 084de1
 *
Packit Service 084de1
 * 1. Redistributions of source code must retain the above copyright
Packit Service 084de1
 *    notice, this list of conditions and the following disclaimer. 
Packit Service 084de1
 *
Packit Service 084de1
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 084de1
 *    notice, this list of conditions and the following disclaimer in
Packit Service 084de1
 *    the documentation and/or other materials provided with the
Packit Service 084de1
 *    distribution.
Packit Service 084de1
 *
Packit Service 084de1
 * 3. All advertising materials mentioning features or use of this
Packit Service 084de1
 *    software must display the following acknowledgment:
Packit Service 084de1
 *    "This product includes software developed by the OpenSSL Project
Packit Service 084de1
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
Packit Service 084de1
 *
Packit Service 084de1
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
Packit Service 084de1
 *    endorse or promote products derived from this software without
Packit Service 084de1
 *    prior written permission. For written permission, please contact
Packit Service 084de1
 *    licensing@OpenSSL.org.
Packit Service 084de1
 *
Packit Service 084de1
 * 5. Products derived from this software may not be called "OpenSSL"
Packit Service 084de1
 *    nor may "OpenSSL" appear in their names without prior written
Packit Service 084de1
 *    permission of the OpenSSL Project.
Packit Service 084de1
 *
Packit Service 084de1
 * 6. Redistributions of any form whatsoever must retain the following
Packit Service 084de1
 *    acknowledgment:
Packit Service 084de1
 *    "This product includes software developed by the OpenSSL Project
Packit Service 084de1
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
Packit Service 084de1
 *
Packit Service 084de1
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
Packit Service 084de1
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit Service 084de1
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
Packit Service 084de1
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
Packit Service 084de1
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 084de1
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Packit Service 084de1
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Packit Service 084de1
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service 084de1
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
Packit Service 084de1
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
Packit Service 084de1
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
Packit Service 084de1
 * OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 084de1
 * ====================================================================
Packit Service 084de1
 */
Packit Service 084de1
Packit Service 084de1
#include <stdlib.h>
Packit Service 084de1
#include <string.h>
Packit Service 084de1
#include <openssl/crypto.h>
Packit Service 084de1
#include <openssl/fips.h>
Packit Service 084de1
#include <openssl/fips_rand.h>
Packit Service 084de1
#include "fips_rand_lcl.h"
Packit Service 084de1
Packit Service 084de1
static void inc_128(DRBG_CTR_CTX * cctx)
Packit Service 084de1
{
Packit Service 084de1
    int i;
Packit Service 084de1
    unsigned char c;
Packit Service 084de1
    unsigned char *p = cctx->V + 15;
Packit Service 084de1
    for (i = 0; i < 16; i++) {
Packit Service 084de1
        c = *p;
Packit Service 084de1
        c++;
Packit Service 084de1
        *p = c;
Packit Service 084de1
        if (c)
Packit Service 084de1
            return;
Packit Service 084de1
        p--;
Packit Service 084de1
    }
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static void ctr_XOR(DRBG_CTR_CTX * cctx, const unsigned char *in,
Packit Service 084de1
                    size_t inlen)
Packit Service 084de1
{
Packit Service 084de1
    size_t i, n;
Packit Service 084de1
    /* Any zero padding will have no effect on the result as we
Packit Service 084de1
     * are XORing. So just process however much input we have.
Packit Service 084de1
     */
Packit Service 084de1
Packit Service 084de1
    if (!in || !inlen)
Packit Service 084de1
        return;
Packit Service 084de1
Packit Service 084de1
    if (inlen < cctx->keylen)
Packit Service 084de1
        n = inlen;
Packit Service 084de1
    else
Packit Service 084de1
        n = cctx->keylen;
Packit Service 084de1
Packit Service 084de1
    for (i = 0; i < n; i++)
Packit Service 084de1
        cctx->K[i] ^= in[i];
Packit Service 084de1
    if (inlen <= cctx->keylen)
Packit Service 084de1
        return;
Packit Service 084de1
Packit Service 084de1
    n = inlen - cctx->keylen;
Packit Service 084de1
    /* Should never happen */
Packit Service 084de1
    if (n > 16)
Packit Service 084de1
        n = 16;
Packit Service 084de1
    for (i = 0; i < 16; i++)
Packit Service 084de1
        cctx->V[i] ^= in[i + cctx->keylen];
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/* Process a complete block using BCC algorithm of SPP 800-90 10.4.3 */
Packit Service 084de1
Packit Service 084de1
static void ctr_BCC_block(DRBG_CTR_CTX * cctx, unsigned char *out,
Packit Service 084de1
                          const unsigned char *in)
Packit Service 084de1
{
Packit Service 084de1
    int i;
Packit Service 084de1
    for (i = 0; i < 16; i++)
Packit Service 084de1
        out[i] ^= in[i];
Packit Service 084de1
    AES_encrypt(out, out, &cctx->df_ks);
Packit Service 084de1
#if 0
Packit Service 084de1
    fprintf(stderr, "BCC in+out\n");
Packit Service 084de1
    BIO_dump_fp(stderr, in, 16);
Packit Service 084de1
    BIO_dump_fp(stderr, out, 16);
Packit Service 084de1
#endif
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/* Handle several BCC operations for as much data as we need for K and X */
Packit Service 084de1
static void ctr_BCC_blocks(DRBG_CTR_CTX * cctx, const unsigned char *in)
Packit Service 084de1
{
Packit Service 084de1
    ctr_BCC_block(cctx, cctx->KX, in);
Packit Service 084de1
    ctr_BCC_block(cctx, cctx->KX + 16, in);
Packit Service 084de1
    if (cctx->keylen != 16)
Packit Service 084de1
        ctr_BCC_block(cctx, cctx->KX + 32, in);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/* Initialise BCC blocks: these have the value 0,1,2 in leftmost positions:
Packit Service 084de1
 * see 10.4.2 stage 7.
Packit Service 084de1
 */
Packit Service 084de1
static void ctr_BCC_init(DRBG_CTR_CTX * cctx)
Packit Service 084de1
{
Packit Service 084de1
    memset(cctx->KX, 0, 48);
Packit Service 084de1
    memset(cctx->bltmp, 0, 16);
Packit Service 084de1
    ctr_BCC_block(cctx, cctx->KX, cctx->bltmp);
Packit Service 084de1
    cctx->bltmp[3] = 1;
Packit Service 084de1
    ctr_BCC_block(cctx, cctx->KX + 16, cctx->bltmp);
Packit Service 084de1
    if (cctx->keylen != 16) {
Packit Service 084de1
        cctx->bltmp[3] = 2;
Packit Service 084de1
        ctr_BCC_block(cctx, cctx->KX + 32, cctx->bltmp);
Packit Service 084de1
    }
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/* Process several blocks into BCC algorithm, some possibly partial */
Packit Service 084de1
static void ctr_BCC_update(DRBG_CTR_CTX * cctx,
Packit Service 084de1
                           const unsigned char *in, size_t inlen)
Packit Service 084de1
{
Packit Service 084de1
    if (!in || !inlen)
Packit Service 084de1
        return;
Packit Service 084de1
    /* If we have partial block handle it first */
Packit Service 084de1
    if (cctx->bltmp_pos) {
Packit Service 084de1
        size_t left = 16 - cctx->bltmp_pos;
Packit Service 084de1
        /* If we now have a complete block process it */
Packit Service 084de1
        if (inlen >= left) {
Packit Service 084de1
            memcpy(cctx->bltmp + cctx->bltmp_pos, in, left);
Packit Service 084de1
            ctr_BCC_blocks(cctx, cctx->bltmp);
Packit Service 084de1
            cctx->bltmp_pos = 0;
Packit Service 084de1
            inlen -= left;
Packit Service 084de1
            in += left;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    /* Process zero or more complete blocks */
Packit Service 084de1
    while (inlen >= 16) {
Packit Service 084de1
        ctr_BCC_blocks(cctx, in);
Packit Service 084de1
        in += 16;
Packit Service 084de1
        inlen -= 16;
Packit Service 084de1
    }
Packit Service 084de1
    /* Copy any remaining partial block to the temporary buffer */
Packit Service 084de1
    if (inlen > 0) {
Packit Service 084de1
        memcpy(cctx->bltmp + cctx->bltmp_pos, in, inlen);
Packit Service 084de1
        cctx->bltmp_pos += inlen;
Packit Service 084de1
    }
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static void ctr_BCC_final(DRBG_CTR_CTX * cctx)
Packit Service 084de1
{
Packit Service 084de1
    if (cctx->bltmp_pos) {
Packit Service 084de1
        memset(cctx->bltmp + cctx->bltmp_pos, 0, 16 - cctx->bltmp_pos);
Packit Service 084de1
        ctr_BCC_blocks(cctx, cctx->bltmp);
Packit Service 084de1
    }
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static void ctr_df(DRBG_CTR_CTX * cctx,
Packit Service 084de1
                   const unsigned char *in1, size_t in1len,
Packit Service 084de1
                   const unsigned char *in2, size_t in2len,
Packit Service 084de1
                   const unsigned char *in3, size_t in3len)
Packit Service 084de1
{
Packit Service 084de1
    size_t inlen;
Packit Service 084de1
    unsigned char *p = cctx->bltmp;
Packit Service 084de1
    static unsigned char c80 = 0x80;
Packit Service 084de1
Packit Service 084de1
    ctr_BCC_init(cctx);
Packit Service 084de1
    if (!in1)
Packit Service 084de1
        in1len = 0;
Packit Service 084de1
    if (!in2)
Packit Service 084de1
        in2len = 0;
Packit Service 084de1
    if (!in3)
Packit Service 084de1
        in3len = 0;
Packit Service 084de1
    inlen = in1len + in2len + in3len;
Packit Service 084de1
    /* Initialise L||N in temporary block */
Packit Service 084de1
    *p++ = (inlen >> 24) & 0xff;
Packit Service 084de1
    *p++ = (inlen >> 16) & 0xff;
Packit Service 084de1
    *p++ = (inlen >> 8) & 0xff;
Packit Service 084de1
    *p++ = inlen & 0xff;
Packit Service 084de1
    /* NB keylen is at most 32 bytes */
Packit Service 084de1
    *p++ = 0;
Packit Service 084de1
    *p++ = 0;
Packit Service 084de1
    *p++ = 0;
Packit Service 084de1
    *p = (unsigned char)((cctx->keylen + 16) & 0xff);
Packit Service 084de1
    cctx->bltmp_pos = 8;
Packit Service 084de1
    ctr_BCC_update(cctx, in1, in1len);
Packit Service 084de1
    ctr_BCC_update(cctx, in2, in2len);
Packit Service 084de1
    ctr_BCC_update(cctx, in3, in3len);
Packit Service 084de1
    ctr_BCC_update(cctx, &c80, 1);
Packit Service 084de1
    ctr_BCC_final(cctx);
Packit Service 084de1
    /* Set up key K */
Packit Service 084de1
    AES_set_encrypt_key(cctx->KX, cctx->keylen * 8, &cctx->df_kxks);
Packit Service 084de1
    /* X follows key K */
Packit Service 084de1
    AES_encrypt(cctx->KX + cctx->keylen, cctx->KX, &cctx->df_kxks);
Packit Service 084de1
    AES_encrypt(cctx->KX, cctx->KX + 16, &cctx->df_kxks);
Packit Service 084de1
    if (cctx->keylen != 16)
Packit Service 084de1
        AES_encrypt(cctx->KX + 16, cctx->KX + 32, &cctx->df_kxks);
Packit Service 084de1
#if 0
Packit Service 084de1
    fprintf(stderr, "Output of ctr_df:\n");
Packit Service 084de1
    BIO_dump_fp(stderr, cctx->KX, cctx->keylen + 16);
Packit Service 084de1
#endif
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/* NB the no-df  Update in SP800-90 specifies a constant input length
Packit Service 084de1
 * of seedlen, however other uses of this algorithm pad the input with
Packit Service 084de1
 * zeroes if necessary and have up to two parameters XORed together,
Packit Service 084de1
 * handle both cases in this function instead.
Packit Service 084de1
 */
Packit Service 084de1
Packit Service 084de1
static void ctr_Update(DRBG_CTX *dctx,
Packit Service 084de1
                       const unsigned char *in1, size_t in1len,
Packit Service 084de1
                       const unsigned char *in2, size_t in2len,
Packit Service 084de1
                       const unsigned char *nonce, size_t noncelen)
Packit Service 084de1
{
Packit Service 084de1
    DRBG_CTR_CTX *cctx = &dctx->d.ctr;
Packit Service 084de1
    /* ks is already setup for correct key */
Packit Service 084de1
    inc_128(cctx);
Packit Service 084de1
    AES_encrypt(cctx->V, cctx->K, &cctx->ks);
Packit Service 084de1
    /* If keylen longer than 128 bits need extra encrypt */
Packit Service 084de1
    if (cctx->keylen != 16) {
Packit Service 084de1
        inc_128(cctx);
Packit Service 084de1
        AES_encrypt(cctx->V, cctx->K + 16, &cctx->ks);
Packit Service 084de1
    }
Packit Service 084de1
    inc_128(cctx);
Packit Service 084de1
    AES_encrypt(cctx->V, cctx->V, &cctx->ks);
Packit Service 084de1
    /* If 192 bit key part of V is on end of K */
Packit Service 084de1
    if (cctx->keylen == 24) {
Packit Service 084de1
        memcpy(cctx->V + 8, cctx->V, 8);
Packit Service 084de1
        memcpy(cctx->V, cctx->K + 24, 8);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (dctx->xflags & DRBG_FLAG_CTR_USE_DF) {
Packit Service 084de1
        /* If no input reuse existing derived value */
Packit Service 084de1
        if (in1 || nonce || in2)
Packit Service 084de1
            ctr_df(cctx, in1, in1len, nonce, noncelen, in2, in2len);
Packit Service 084de1
        /* If this a reuse input in1len != 0 */
Packit Service 084de1
        if (in1len)
Packit Service 084de1
            ctr_XOR(cctx, cctx->KX, dctx->seedlen);
Packit Service 084de1
    } else {
Packit Service 084de1
        ctr_XOR(cctx, in1, in1len);
Packit Service 084de1
        ctr_XOR(cctx, in2, in2len);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    AES_set_encrypt_key(cctx->K, dctx->strength, &cctx->ks);
Packit Service 084de1
#if 0
Packit Service 084de1
    fprintf(stderr, "K+V after update is:\n");
Packit Service 084de1
    BIO_dump_fp(stderr, cctx->K, cctx->keylen);
Packit Service 084de1
    BIO_dump_fp(stderr, cctx->V, 16);
Packit Service 084de1
#endif
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int drbg_ctr_instantiate(DRBG_CTX *dctx,
Packit Service 084de1
                                const unsigned char *ent, size_t entlen,
Packit Service 084de1
                                const unsigned char *nonce, size_t noncelen,
Packit Service 084de1
                                const unsigned char *pers, size_t perslen)
Packit Service 084de1
{
Packit Service 084de1
    DRBG_CTR_CTX *cctx = &dctx->d.ctr;
Packit Service 084de1
    memset(cctx->K, 0, sizeof(cctx->K));
Packit Service 084de1
    memset(cctx->V, 0, sizeof(cctx->V));
Packit Service 084de1
    AES_set_encrypt_key(cctx->K, dctx->strength, &cctx->ks);
Packit Service 084de1
    ctr_Update(dctx, ent, entlen, pers, perslen, nonce, noncelen);
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int drbg_ctr_reseed(DRBG_CTX *dctx,
Packit Service 084de1
                           const unsigned char *ent, size_t entlen,
Packit Service 084de1
                           const unsigned char *adin, size_t adinlen)
Packit Service 084de1
{
Packit Service 084de1
    ctr_Update(dctx, ent, entlen, adin, adinlen, NULL, 0);
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int drbg_ctr_generate(DRBG_CTX *dctx,
Packit Service 084de1
                             unsigned char *out, size_t outlen,
Packit Service 084de1
                             const unsigned char *adin, size_t adinlen)
Packit Service 084de1
{
Packit Service 084de1
    DRBG_CTR_CTX *cctx = &dctx->d.ctr;
Packit Service 084de1
    if (adin && adinlen) {
Packit Service 084de1
        ctr_Update(dctx, adin, adinlen, NULL, 0, NULL, 0);
Packit Service 084de1
        /* This means we reuse derived value */
Packit Service 084de1
        if (dctx->xflags & DRBG_FLAG_CTR_USE_DF) {
Packit Service 084de1
            adin = NULL;
Packit Service 084de1
            adinlen = 1;
Packit Service 084de1
        }
Packit Service 084de1
    } else
Packit Service 084de1
        adinlen = 0;
Packit Service 084de1
Packit Service 084de1
    for (;;) {
Packit Service 084de1
        inc_128(cctx);
Packit Service 084de1
        if (outlen < 16) {
Packit Service 084de1
            /* Use K as temp space as it will be updated */
Packit Service 084de1
            AES_encrypt(cctx->V, cctx->K, &cctx->ks);
Packit Service 084de1
            memcpy(out, cctx->K, outlen);
Packit Service 084de1
            break;
Packit Service 084de1
        }
Packit Service 084de1
        AES_encrypt(cctx->V, out, &cctx->ks);
Packit Service 084de1
        out += 16;
Packit Service 084de1
        outlen -= 16;
Packit Service 084de1
        if (outlen == 0)
Packit Service 084de1
            break;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    ctr_Update(dctx, adin, adinlen, NULL, 0, NULL, 0);
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int drbg_ctr_uninstantiate(DRBG_CTX *dctx)
Packit Service 084de1
{
Packit Service 084de1
    memset(&dctx->d.ctr, 0, sizeof(DRBG_CTR_CTX));
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int fips_drbg_ctr_init(DRBG_CTX *dctx)
Packit Service 084de1
{
Packit Service 084de1
    DRBG_CTR_CTX *cctx = &dctx->d.ctr;
Packit Service 084de1
Packit Service 084de1
    size_t keylen;
Packit Service 084de1
Packit Service 084de1
    switch (dctx->type) {
Packit Service 084de1
    case NID_aes_128_ctr:
Packit Service 084de1
        keylen = 16;
Packit Service 084de1
        break;
Packit Service 084de1
Packit Service 084de1
    case NID_aes_192_ctr:
Packit Service 084de1
        keylen = 24;
Packit Service 084de1
        break;
Packit Service 084de1
Packit Service 084de1
    case NID_aes_256_ctr:
Packit Service 084de1
        keylen = 32;
Packit Service 084de1
        break;
Packit Service 084de1
Packit Service 084de1
    default:
Packit Service 084de1
        return -2;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    dctx->instantiate = drbg_ctr_instantiate;
Packit Service 084de1
    dctx->reseed = drbg_ctr_reseed;
Packit Service 084de1
    dctx->generate = drbg_ctr_generate;
Packit Service 084de1
    dctx->uninstantiate = drbg_ctr_uninstantiate;
Packit Service 084de1
Packit Service 084de1
    cctx->keylen = keylen;
Packit Service 084de1
    dctx->strength = keylen * 8;
Packit Service 084de1
    dctx->blocklength = 16;
Packit Service 084de1
    dctx->seedlen = keylen + 16;
Packit Service 084de1
Packit Service 084de1
    if (dctx->xflags & DRBG_FLAG_CTR_USE_DF) {
Packit Service 084de1
        /* df initialisation */
Packit Service 084de1
        static unsigned char df_key[32] = {
Packit Service 084de1
            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
Packit Service 084de1
            0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
Packit Service 084de1
            0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
Packit Service 084de1
            0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
Packit Service 084de1
        };
Packit Service 084de1
        /* Set key schedule for df_key */
Packit Service 084de1
        AES_set_encrypt_key(df_key, dctx->strength, &cctx->df_ks);
Packit Service 084de1
Packit Service 084de1
        dctx->min_entropy = cctx->keylen;
Packit Service 084de1
        dctx->max_entropy = DRBG_MAX_LENGTH;
Packit Service 084de1
        dctx->min_nonce = dctx->min_entropy / 2;
Packit Service 084de1
        dctx->max_nonce = DRBG_MAX_LENGTH;
Packit Service 084de1
        dctx->max_pers = DRBG_MAX_LENGTH;
Packit Service 084de1
        dctx->max_adin = DRBG_MAX_LENGTH;
Packit Service 084de1
    } else {
Packit Service 084de1
        dctx->min_entropy = dctx->seedlen;
Packit Service 084de1
        dctx->max_entropy = dctx->seedlen;
Packit Service 084de1
        /* Nonce not used */
Packit Service 084de1
        dctx->min_nonce = 0;
Packit Service 084de1
        dctx->max_nonce = 0;
Packit Service 084de1
        dctx->max_pers = dctx->seedlen;
Packit Service 084de1
        dctx->max_adin = dctx->seedlen;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    dctx->max_request = 1 << 16;
Packit Service 084de1
    dctx->reseed_interval = 1 << 24;
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}