Blame test/pkey_meth_kdf_test.c

Packit c4476c
/*
Packit c4476c
 * Copyright 2017-2019 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
 *
Packit c4476c
 * Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
 * this file except in compliance with the License.  You can obtain a copy
Packit c4476c
 * in the file LICENSE in the source distribution or at
Packit c4476c
 * https://www.openssl.org/source/license.html
Packit c4476c
 */
Packit c4476c
Packit c4476c
/* Tests of the EVP_PKEY_CTX_set_* macro family */
Packit c4476c
Packit c4476c
#include <stdio.h>
Packit c4476c
#include <string.h>
Packit c4476c
Packit c4476c
#include <openssl/evp.h>
Packit c4476c
#include <openssl/kdf.h>
Packit c4476c
#include "testutil.h"
Packit c4476c
Packit c4476c
static int test_kdf_tls1_prf(void)
Packit c4476c
{
Packit c4476c
    int ret = 0;
Packit c4476c
    EVP_PKEY_CTX *pctx;
Packit c4476c
    unsigned char out[16];
Packit c4476c
    size_t outlen = sizeof(out);
Packit c4476c
Packit c4476c
    if ((pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_TLS1_PRF, NULL)) == NULL) {
Packit c4476c
        TEST_error("EVP_PKEY_TLS1_PRF");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_derive_init(pctx) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_derive_init");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set_tls1_prf_md(pctx, EVP_sha256()) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set_tls1_prf_md");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set1_tls1_prf_secret(pctx, "secret", 6) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set1_tls1_prf_secret");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_add1_tls1_prf_seed(pctx, "seed", 4) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_add1_tls1_prf_seed");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_derive");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
Packit c4476c
    {
Packit c4476c
        const unsigned char expected[sizeof(out)] = {
Packit c4476c
            0x8e, 0x4d, 0x93, 0x25, 0x30, 0xd7, 0x65, 0xa0,
Packit c4476c
            0xaa, 0xe9, 0x74, 0xc3, 0x04, 0x73, 0x5e, 0xcc
Packit c4476c
        };
Packit c4476c
        if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
Packit c4476c
            goto err;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    ret = 1;
Packit c4476c
err:
Packit c4476c
    EVP_PKEY_CTX_free(pctx);
Packit c4476c
    return ret;
Packit c4476c
}
Packit c4476c
Packit c4476c
static int test_kdf_hkdf(void)
Packit c4476c
{
Packit c4476c
    int ret = 0;
Packit c4476c
    EVP_PKEY_CTX *pctx;
Packit c4476c
    unsigned char out[10];
Packit c4476c
    size_t outlen = sizeof(out);
Packit c4476c
Packit c4476c
    if ((pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL)) == NULL) {
Packit c4476c
        TEST_error("EVP_PKEY_HKDF");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_derive_init(pctx) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_derive_init");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set_hkdf_md");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set1_hkdf_salt(pctx, "salt", 4) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set1_hkdf_salt");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set1_hkdf_key(pctx, "secret", 6) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set1_hkdf_key");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_add1_hkdf_info(pctx, "label", 5) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set1_hkdf_info");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_derive");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
Packit c4476c
    {
Packit c4476c
        const unsigned char expected[sizeof(out)] = {
Packit c4476c
            0x2a, 0xc4, 0x36, 0x9f, 0x52, 0x59, 0x96, 0xf8, 0xde, 0x13
Packit c4476c
        };
Packit c4476c
        if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
Packit c4476c
            goto err;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    ret = 1;
Packit c4476c
err:
Packit c4476c
    EVP_PKEY_CTX_free(pctx);
Packit c4476c
    return ret;
Packit c4476c
}
Packit c4476c
Packit c4476c
#ifndef OPENSSL_NO_SCRYPT
Packit c4476c
static int test_kdf_scrypt(void)
Packit c4476c
{
Packit c4476c
    int ret = 0;
Packit c4476c
    EVP_PKEY_CTX *pctx;
Packit c4476c
    unsigned char out[64];
Packit c4476c
    size_t outlen = sizeof(out);
Packit c4476c
Packit c4476c
    if ((pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_SCRYPT, NULL)) == NULL) {
Packit c4476c
        TEST_error("EVP_PKEY_SCRYPT");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_derive_init(pctx) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_derive_init");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set1_pbe_pass(pctx, "password", 8) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set1_pbe_pass");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set1_scrypt_salt(pctx, "NaCl", 4) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set1_scrypt_salt");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set_scrypt_N(pctx, 1024) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set_scrypt_N");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set_scrypt_r(pctx, 8) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set_scrypt_r");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set_scrypt_p(pctx, 16) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set_scrypt_p");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set_scrypt_maxmem_bytes(pctx, 16) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set_maxmem_bytes");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_derive(pctx, out, &outlen) > 0) {
Packit c4476c
        TEST_error("EVP_PKEY_derive should have failed");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_CTX_set_scrypt_maxmem_bytes(pctx, 10 * 1024 * 1024) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_CTX_set_maxmem_bytes");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
    if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
Packit c4476c
        TEST_error("EVP_PKEY_derive");
Packit c4476c
        goto err;
Packit c4476c
    }
Packit c4476c
Packit c4476c
    {
Packit c4476c
        const unsigned char expected[sizeof(out)] = {
Packit c4476c
            0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00,
Packit c4476c
            0x78, 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe,
Packit c4476c
            0x7c, 0x6a, 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30,
Packit c4476c
            0xe7, 0x73, 0x76, 0x63, 0x4b, 0x37, 0x31, 0x62,
Packit c4476c
            0x2e, 0xaf, 0x30, 0xd9, 0x2e, 0x22, 0xa3, 0x88,
Packit c4476c
            0x6f, 0xf1, 0x09, 0x27, 0x9d, 0x98, 0x30, 0xda,
Packit c4476c
            0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, 0xee, 0x6d,
Packit c4476c
            0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, 0x40
Packit c4476c
        };
Packit c4476c
        if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
Packit c4476c
            goto err;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    ret = 1;
Packit c4476c
err:
Packit c4476c
    EVP_PKEY_CTX_free(pctx);
Packit c4476c
    return ret;
Packit c4476c
}
Packit c4476c
#endif
Packit c4476c
Packit c4476c
int setup_tests(void)
Packit c4476c
{
Packit c4476c
    ADD_TEST(test_kdf_tls1_prf);
Packit c4476c
    ADD_TEST(test_kdf_hkdf);
Packit c4476c
#ifndef OPENSSL_NO_SCRYPT
Packit c4476c
    ADD_TEST(test_kdf_scrypt);
Packit c4476c
#endif
Packit c4476c
    return 1;
Packit c4476c
}