1d4afb5ceSopenharmony_ci// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
2d4afb5ceSopenharmony_ci//
3d4afb5ceSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4d4afb5ceSopenharmony_ci// you may not use this file except in compliance with the License.
5d4afb5ceSopenharmony_ci// You may obtain a copy of the License at
6d4afb5ceSopenharmony_ci
7d4afb5ceSopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8d4afb5ceSopenharmony_ci//
9d4afb5ceSopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10d4afb5ceSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11d4afb5ceSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d4afb5ceSopenharmony_ci// See the License for the specific language governing permissions and
13d4afb5ceSopenharmony_ci// limitations under the License.
14d4afb5ceSopenharmony_ci
15d4afb5ceSopenharmony_ci#include "private-lib-core.h"
16d4afb5ceSopenharmony_ci
17d4afb5ceSopenharmony_ci#include "ssl_cert.h"
18d4afb5ceSopenharmony_ci#include "ssl_pkey.h"
19d4afb5ceSopenharmony_ci#include "ssl_x509.h"
20d4afb5ceSopenharmony_ci#include "ssl_dbg.h"
21d4afb5ceSopenharmony_ci#include "ssl_port.h"
22d4afb5ceSopenharmony_ci
23d4afb5ceSopenharmony_ci/**
24d4afb5ceSopenharmony_ci * @brief create a certification object according to input certification
25d4afb5ceSopenharmony_ci */
26d4afb5ceSopenharmony_ciCERT *__ssl_cert_new(CERT *ic, void *rngctx)
27d4afb5ceSopenharmony_ci{
28d4afb5ceSopenharmony_ci    CERT *cert;
29d4afb5ceSopenharmony_ci
30d4afb5ceSopenharmony_ci    X509 *ix;
31d4afb5ceSopenharmony_ci    EVP_PKEY *ipk;
32d4afb5ceSopenharmony_ci
33d4afb5ceSopenharmony_ci    cert = ssl_mem_zalloc(sizeof(CERT));
34d4afb5ceSopenharmony_ci    if (!cert) {
35d4afb5ceSopenharmony_ci        SSL_DEBUG(SSL_CERT_ERROR_LEVEL, "no enough memory > (cert)");
36d4afb5ceSopenharmony_ci        goto no_mem;
37d4afb5ceSopenharmony_ci    }
38d4afb5ceSopenharmony_ci
39d4afb5ceSopenharmony_ci    if (ic) {
40d4afb5ceSopenharmony_ci        ipk = ic->pkey;
41d4afb5ceSopenharmony_ci        ix = ic->x509;
42d4afb5ceSopenharmony_ci    } else {
43d4afb5ceSopenharmony_ci        ipk = NULL;
44d4afb5ceSopenharmony_ci        ix = NULL;
45d4afb5ceSopenharmony_ci    }
46d4afb5ceSopenharmony_ci
47d4afb5ceSopenharmony_ci    cert->pkey = __EVP_PKEY_new(ipk, rngctx);
48d4afb5ceSopenharmony_ci    if (!cert->pkey) {
49d4afb5ceSopenharmony_ci        SSL_DEBUG(SSL_CERT_ERROR_LEVEL, "__EVP_PKEY_new() return NULL");
50d4afb5ceSopenharmony_ci        goto pkey_err;
51d4afb5ceSopenharmony_ci    }
52d4afb5ceSopenharmony_ci
53d4afb5ceSopenharmony_ci    cert->x509 = __X509_new(ix);
54d4afb5ceSopenharmony_ci    if (!cert->x509) {
55d4afb5ceSopenharmony_ci        SSL_DEBUG(SSL_CERT_ERROR_LEVEL, "__X509_new() return NULL");
56d4afb5ceSopenharmony_ci        goto x509_err;
57d4afb5ceSopenharmony_ci    }
58d4afb5ceSopenharmony_ci
59d4afb5ceSopenharmony_ci    return cert;
60d4afb5ceSopenharmony_ci
61d4afb5ceSopenharmony_cix509_err:
62d4afb5ceSopenharmony_ci    EVP_PKEY_free(cert->pkey);
63d4afb5ceSopenharmony_cipkey_err:
64d4afb5ceSopenharmony_ci    ssl_mem_free(cert);
65d4afb5ceSopenharmony_cino_mem:
66d4afb5ceSopenharmony_ci    return NULL;
67d4afb5ceSopenharmony_ci}
68d4afb5ceSopenharmony_ci
69d4afb5ceSopenharmony_ci/**
70d4afb5ceSopenharmony_ci * @brief create a certification object include private key object
71d4afb5ceSopenharmony_ci */
72d4afb5ceSopenharmony_ciCERT *ssl_cert_new(void *rngctx)
73d4afb5ceSopenharmony_ci{
74d4afb5ceSopenharmony_ci    return __ssl_cert_new(NULL, rngctx);
75d4afb5ceSopenharmony_ci}
76d4afb5ceSopenharmony_ci
77d4afb5ceSopenharmony_ci/**
78d4afb5ceSopenharmony_ci * @brief free a certification object
79d4afb5ceSopenharmony_ci */
80d4afb5ceSopenharmony_civoid ssl_cert_free(CERT *cert)
81d4afb5ceSopenharmony_ci{
82d4afb5ceSopenharmony_ci    SSL_ASSERT3(cert);
83d4afb5ceSopenharmony_ci
84d4afb5ceSopenharmony_ci    X509_free(cert->x509);
85d4afb5ceSopenharmony_ci
86d4afb5ceSopenharmony_ci    EVP_PKEY_free(cert->pkey);
87d4afb5ceSopenharmony_ci
88d4afb5ceSopenharmony_ci    ssl_mem_free(cert);
89d4afb5ceSopenharmony_ci}
90