Blame test/pkey_meth_kdf_test.c

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