1e1051a39Sopenharmony_ci/*
2e1051a39Sopenharmony_ci * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci *
4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci * this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci */
9e1051a39Sopenharmony_ci
10e1051a39Sopenharmony_ci#include <string.h> /* memcpy */
11e1051a39Sopenharmony_ci#include <openssl/core_names.h>
12e1051a39Sopenharmony_ci#include <openssl/param_build.h>
13e1051a39Sopenharmony_ci#include "crypto/rsa.h"
14e1051a39Sopenharmony_ci#include "rsa_local.h"
15e1051a39Sopenharmony_ci
16e1051a39Sopenharmony_ciint ossl_rsa_acvp_test_gen_params_new(OSSL_PARAM **dst, const OSSL_PARAM src[])
17e1051a39Sopenharmony_ci{
18e1051a39Sopenharmony_ci    const OSSL_PARAM *p, *s;
19e1051a39Sopenharmony_ci    OSSL_PARAM *d, *alloc = NULL;
20e1051a39Sopenharmony_ci    int ret = 1;
21e1051a39Sopenharmony_ci
22e1051a39Sopenharmony_ci    static const OSSL_PARAM settable[] = {
23e1051a39Sopenharmony_ci        OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_TEST_XP, NULL, 0),
24e1051a39Sopenharmony_ci        OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_TEST_XP1, NULL, 0),
25e1051a39Sopenharmony_ci        OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_TEST_XP2, NULL, 0),
26e1051a39Sopenharmony_ci        OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_TEST_XQ, NULL, 0),
27e1051a39Sopenharmony_ci        OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_TEST_XQ1, NULL, 0),
28e1051a39Sopenharmony_ci        OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_TEST_XQ2, NULL, 0),
29e1051a39Sopenharmony_ci        OSSL_PARAM_END
30e1051a39Sopenharmony_ci    };
31e1051a39Sopenharmony_ci
32e1051a39Sopenharmony_ci    /* Assume the first element is a required field if this feature is used */
33e1051a39Sopenharmony_ci    p = OSSL_PARAM_locate_const(src, settable[0].key);
34e1051a39Sopenharmony_ci    if (p == NULL)
35e1051a39Sopenharmony_ci        return 1;
36e1051a39Sopenharmony_ci
37e1051a39Sopenharmony_ci    /* Zeroing here means the terminator is always set at the end */
38e1051a39Sopenharmony_ci    alloc = OPENSSL_zalloc(sizeof(settable));
39e1051a39Sopenharmony_ci    if (alloc == NULL)
40e1051a39Sopenharmony_ci        return 0;
41e1051a39Sopenharmony_ci
42e1051a39Sopenharmony_ci    d = alloc;
43e1051a39Sopenharmony_ci    for (s = settable; s->key != NULL; ++s) {
44e1051a39Sopenharmony_ci        /* If src contains a key from settable then copy the src to the dest */
45e1051a39Sopenharmony_ci        p = OSSL_PARAM_locate_const(src, s->key);
46e1051a39Sopenharmony_ci        if (p != NULL) {
47e1051a39Sopenharmony_ci            *d = *s; /* shallow copy from the static settable[] */
48e1051a39Sopenharmony_ci            d->data_size = p->data_size;
49e1051a39Sopenharmony_ci            d->data = OPENSSL_memdup(p->data, p->data_size);
50e1051a39Sopenharmony_ci            if (d->data == NULL)
51e1051a39Sopenharmony_ci                ret = 0;
52e1051a39Sopenharmony_ci            ++d;
53e1051a39Sopenharmony_ci        }
54e1051a39Sopenharmony_ci    }
55e1051a39Sopenharmony_ci    if (ret == 0) {
56e1051a39Sopenharmony_ci        ossl_rsa_acvp_test_gen_params_free(alloc);
57e1051a39Sopenharmony_ci        alloc = NULL;
58e1051a39Sopenharmony_ci    }
59e1051a39Sopenharmony_ci    if (*dst != NULL)
60e1051a39Sopenharmony_ci        ossl_rsa_acvp_test_gen_params_free(*dst);
61e1051a39Sopenharmony_ci    *dst = alloc;
62e1051a39Sopenharmony_ci    return ret;
63e1051a39Sopenharmony_ci}
64e1051a39Sopenharmony_ci
65e1051a39Sopenharmony_civoid ossl_rsa_acvp_test_gen_params_free(OSSL_PARAM *dst)
66e1051a39Sopenharmony_ci{
67e1051a39Sopenharmony_ci    OSSL_PARAM *p;
68e1051a39Sopenharmony_ci
69e1051a39Sopenharmony_ci    if (dst == NULL)
70e1051a39Sopenharmony_ci        return;
71e1051a39Sopenharmony_ci
72e1051a39Sopenharmony_ci    for (p = dst; p->key != NULL; ++p) {
73e1051a39Sopenharmony_ci        OPENSSL_free(p->data);
74e1051a39Sopenharmony_ci        p->data = NULL;
75e1051a39Sopenharmony_ci    }
76e1051a39Sopenharmony_ci    OPENSSL_free(dst);
77e1051a39Sopenharmony_ci}
78e1051a39Sopenharmony_ci
79e1051a39Sopenharmony_ciint ossl_rsa_acvp_test_set_params(RSA *r, const OSSL_PARAM params[])
80e1051a39Sopenharmony_ci{
81e1051a39Sopenharmony_ci    RSA_ACVP_TEST *t;
82e1051a39Sopenharmony_ci    const OSSL_PARAM *p;
83e1051a39Sopenharmony_ci
84e1051a39Sopenharmony_ci    if (r->acvp_test != NULL) {
85e1051a39Sopenharmony_ci        ossl_rsa_acvp_test_free(r->acvp_test);
86e1051a39Sopenharmony_ci        r->acvp_test = NULL;
87e1051a39Sopenharmony_ci    }
88e1051a39Sopenharmony_ci
89e1051a39Sopenharmony_ci    t = OPENSSL_zalloc(sizeof(*t));
90e1051a39Sopenharmony_ci    if (t == NULL)
91e1051a39Sopenharmony_ci        return 0;
92e1051a39Sopenharmony_ci
93e1051a39Sopenharmony_ci    /* Set the input parameters */
94e1051a39Sopenharmony_ci    if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_TEST_XP1)) != NULL
95e1051a39Sopenharmony_ci         && !OSSL_PARAM_get_BN(p, &t->Xp1))
96e1051a39Sopenharmony_ci        goto err;
97e1051a39Sopenharmony_ci    if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_TEST_XP2)) != NULL
98e1051a39Sopenharmony_ci         && !OSSL_PARAM_get_BN(p, &t->Xp2))
99e1051a39Sopenharmony_ci        goto err;
100e1051a39Sopenharmony_ci    if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_TEST_XP)) != NULL
101e1051a39Sopenharmony_ci         && !OSSL_PARAM_get_BN(p, &t->Xp))
102e1051a39Sopenharmony_ci        goto err;
103e1051a39Sopenharmony_ci    if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_TEST_XQ1)) != NULL
104e1051a39Sopenharmony_ci         && !OSSL_PARAM_get_BN(p, &t->Xq1))
105e1051a39Sopenharmony_ci        goto err;
106e1051a39Sopenharmony_ci    if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_TEST_XQ2)) != NULL
107e1051a39Sopenharmony_ci         && !OSSL_PARAM_get_BN(p, &t->Xq2))
108e1051a39Sopenharmony_ci        goto err;
109e1051a39Sopenharmony_ci    if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_TEST_XQ)) != NULL
110e1051a39Sopenharmony_ci         && !OSSL_PARAM_get_BN(p, &t->Xq))
111e1051a39Sopenharmony_ci        goto err;
112e1051a39Sopenharmony_ci
113e1051a39Sopenharmony_ci    /* Setup the output parameters */
114e1051a39Sopenharmony_ci    t->p1 = BN_new();
115e1051a39Sopenharmony_ci    t->p2 = BN_new();
116e1051a39Sopenharmony_ci    t->q1 = BN_new();
117e1051a39Sopenharmony_ci    t->q2 = BN_new();
118e1051a39Sopenharmony_ci    r->acvp_test = t;
119e1051a39Sopenharmony_ci    return 1;
120e1051a39Sopenharmony_cierr:
121e1051a39Sopenharmony_ci    ossl_rsa_acvp_test_free(t);
122e1051a39Sopenharmony_ci    return 0;
123e1051a39Sopenharmony_ci}
124e1051a39Sopenharmony_ci
125e1051a39Sopenharmony_ciint ossl_rsa_acvp_test_get_params(RSA *r, OSSL_PARAM params[])
126e1051a39Sopenharmony_ci{
127e1051a39Sopenharmony_ci    RSA_ACVP_TEST *t;
128e1051a39Sopenharmony_ci    OSSL_PARAM *p;
129e1051a39Sopenharmony_ci
130e1051a39Sopenharmony_ci    if (r == NULL)
131e1051a39Sopenharmony_ci        return 0;
132e1051a39Sopenharmony_ci
133e1051a39Sopenharmony_ci    t = r->acvp_test;
134e1051a39Sopenharmony_ci    if (t != NULL) {
135e1051a39Sopenharmony_ci        if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_RSA_TEST_P1)) != NULL
136e1051a39Sopenharmony_ci             && !OSSL_PARAM_set_BN(p, t->p1))
137e1051a39Sopenharmony_ci                    return 0;
138e1051a39Sopenharmony_ci        if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_RSA_TEST_P2)) != NULL
139e1051a39Sopenharmony_ci             && !OSSL_PARAM_set_BN(p, t->p2))
140e1051a39Sopenharmony_ci                    return 0;
141e1051a39Sopenharmony_ci        if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_RSA_TEST_Q1)) != NULL
142e1051a39Sopenharmony_ci             && !OSSL_PARAM_set_BN(p, t->q1))
143e1051a39Sopenharmony_ci                    return 0;
144e1051a39Sopenharmony_ci        if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_RSA_TEST_Q2)) != NULL
145e1051a39Sopenharmony_ci             && !OSSL_PARAM_set_BN(p, t->q2))
146e1051a39Sopenharmony_ci                    return 0;
147e1051a39Sopenharmony_ci    }
148e1051a39Sopenharmony_ci    return 1;
149e1051a39Sopenharmony_ci}
150e1051a39Sopenharmony_ci
151e1051a39Sopenharmony_civoid ossl_rsa_acvp_test_free(RSA_ACVP_TEST *t)
152e1051a39Sopenharmony_ci{
153e1051a39Sopenharmony_ci    if (t != NULL) {
154e1051a39Sopenharmony_ci        BN_free(t->Xp1);
155e1051a39Sopenharmony_ci        BN_free(t->Xp2);
156e1051a39Sopenharmony_ci        BN_free(t->Xp);
157e1051a39Sopenharmony_ci        BN_free(t->Xq1);
158e1051a39Sopenharmony_ci        BN_free(t->Xq2);
159e1051a39Sopenharmony_ci        BN_free(t->Xq);
160e1051a39Sopenharmony_ci        BN_free(t->p1);
161e1051a39Sopenharmony_ci        BN_free(t->p2);
162e1051a39Sopenharmony_ci        BN_free(t->q1);
163e1051a39Sopenharmony_ci        BN_free(t->q2);
164e1051a39Sopenharmony_ci        OPENSSL_free(t);
165e1051a39Sopenharmony_ci    }
166e1051a39Sopenharmony_ci}
167e1051a39Sopenharmony_ci
168