static void ctr_df(DRBG_CTR_CTX *cctx, const unsigned char *in1, size_t in1len, const unsigned char *in2, size_t in2len, const unsigned char *in3, size_t in3len) { size_t inlen; unsigned char *p = cctx->bltmp; static unsigned char c80 = 0x80; ctr_BCC_init(cctx); if (!in1) in1len = 0; if (!in2) in2len = 0; if (!in3) in3len = 0; inlen = in1len + in2len + in3len; /* Initialise L||N in temporary block */ *p++ = (inlen >> 24) & 0xff; *p++ = (inlen >> 16) & 0xff; *p++ = (inlen >> 8) & 0xff; *p++ = inlen & 0xff; /* NB keylen is at most 32 bytes */ *p++ = 0; *p++ = 0; *p++ = 0; *p = (unsigned char)((cctx->keylen + 16) & 0xff); cctx->bltmp_pos = 8; ctr_BCC_update(cctx, in1, in1len); ctr_BCC_update(cctx, in2, in2len); ctr_BCC_update(cctx, in3, in3len); ctr_BCC_update(cctx, &c80, 1); ctr_BCC_final(cctx); /* Set up key K */ AES_set_encrypt_key(cctx->KX, cctx->keylen * 8, &cctx->df_kxks); /* X follows key K */ AES_encrypt(cctx->KX + cctx->keylen, cctx->KX, &cctx->df_kxks); AES_encrypt(cctx->KX, cctx->KX + 16, &cctx->df_kxks); if (cctx->keylen != 16) AES_encrypt(cctx->KX + 16, cctx->KX + 32, &cctx->df_kxks); #if 0 fprintf(stderr, "Output of ctr_df:\n"); BIO_dump_fp(stderr, cctx->KX, cctx->keylen + 16); #endif }
static void ctr_df(RAND_DRBG_CTR *ctr, const unsigned char *in1, size_t in1len, const unsigned char *in2, size_t in2len, const unsigned char *in3, size_t in3len) { static unsigned char c80 = 0x80; size_t inlen; unsigned char *p = ctr->bltmp; ctr_BCC_init(ctr); if (in1 == NULL) in1len = 0; if (in2 == NULL) in2len = 0; if (in3 == NULL) in3len = 0; inlen = in1len + in2len + in3len; /* Initialise L||N in temporary block */ *p++ = (inlen >> 24) & 0xff; *p++ = (inlen >> 16) & 0xff; *p++ = (inlen >> 8) & 0xff; *p++ = inlen & 0xff; /* NB keylen is at most 32 bytes */ *p++ = 0; *p++ = 0; *p++ = 0; *p = (unsigned char)((ctr->keylen + 16) & 0xff); ctr->bltmp_pos = 8; ctr_BCC_update(ctr, in1, in1len); ctr_BCC_update(ctr, in2, in2len); ctr_BCC_update(ctr, in3, in3len); ctr_BCC_update(ctr, &c80, 1); ctr_BCC_final(ctr); /* Set up key K */ AES_set_encrypt_key(ctr->KX, ctr->keylen * 8, &ctr->df_kxks); /* X follows key K */ AES_encrypt(ctr->KX + ctr->keylen, ctr->KX, &ctr->df_kxks); AES_encrypt(ctr->KX, ctr->KX + 16, &ctr->df_kxks); if (ctr->keylen != 16) AES_encrypt(ctr->KX + 16, ctr->KX + 32, &ctr->df_kxks); }