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_stack.h"
18d4afb5ceSopenharmony_ci#include "ssl_dbg.h"
19d4afb5ceSopenharmony_ci#include "ssl_port.h"
20d4afb5ceSopenharmony_ci
21d4afb5ceSopenharmony_ci#ifndef CONFIG_MIN_NODES
22d4afb5ceSopenharmony_ci    #define MIN_NODES 4
23d4afb5ceSopenharmony_ci#else
24d4afb5ceSopenharmony_ci    #define MIN_NODES CONFIG_MIN_NODES
25d4afb5ceSopenharmony_ci#endif
26d4afb5ceSopenharmony_ci
27d4afb5ceSopenharmony_ci/**
28d4afb5ceSopenharmony_ci * @brief create a openssl stack object
29d4afb5ceSopenharmony_ci */
30d4afb5ceSopenharmony_ciOPENSSL_STACK* OPENSSL_sk_new(OPENSSL_sk_compfunc c)
31d4afb5ceSopenharmony_ci{
32d4afb5ceSopenharmony_ci    OPENSSL_STACK *stack;
33d4afb5ceSopenharmony_ci    char **data;
34d4afb5ceSopenharmony_ci
35d4afb5ceSopenharmony_ci    stack = ssl_mem_zalloc(sizeof(OPENSSL_STACK));
36d4afb5ceSopenharmony_ci    if (!stack) {
37d4afb5ceSopenharmony_ci        SSL_DEBUG(SSL_STACK_ERROR_LEVEL, "no enough memory > (stack)");
38d4afb5ceSopenharmony_ci        goto no_mem1;
39d4afb5ceSopenharmony_ci    }
40d4afb5ceSopenharmony_ci
41d4afb5ceSopenharmony_ci    data = ssl_mem_zalloc(sizeof(*data) * MIN_NODES);
42d4afb5ceSopenharmony_ci    if (!data) {
43d4afb5ceSopenharmony_ci        SSL_DEBUG(SSL_STACK_ERROR_LEVEL, "no enough memory > (data)");
44d4afb5ceSopenharmony_ci        goto no_mem2;
45d4afb5ceSopenharmony_ci    }
46d4afb5ceSopenharmony_ci
47d4afb5ceSopenharmony_ci    stack->data = data;
48d4afb5ceSopenharmony_ci    stack->num_alloc = MIN_NODES;
49d4afb5ceSopenharmony_ci    stack->c = c;
50d4afb5ceSopenharmony_ci
51d4afb5ceSopenharmony_ci    return stack;
52d4afb5ceSopenharmony_ci
53d4afb5ceSopenharmony_cino_mem2:
54d4afb5ceSopenharmony_ci    ssl_mem_free(stack);
55d4afb5ceSopenharmony_cino_mem1:
56d4afb5ceSopenharmony_ci    return NULL;
57d4afb5ceSopenharmony_ci}
58d4afb5ceSopenharmony_ci
59d4afb5ceSopenharmony_ci/**
60d4afb5ceSopenharmony_ci * @brief create a NULL function openssl stack object
61d4afb5ceSopenharmony_ci */
62d4afb5ceSopenharmony_ciOPENSSL_STACK *OPENSSL_sk_new_null(void)
63d4afb5ceSopenharmony_ci{
64d4afb5ceSopenharmony_ci    return OPENSSL_sk_new((OPENSSL_sk_compfunc)NULL);
65d4afb5ceSopenharmony_ci}
66d4afb5ceSopenharmony_ci
67d4afb5ceSopenharmony_ci/**
68d4afb5ceSopenharmony_ci * @brief free openssl stack object
69d4afb5ceSopenharmony_ci */
70d4afb5ceSopenharmony_civoid OPENSSL_sk_free(OPENSSL_STACK *stack)
71d4afb5ceSopenharmony_ci{
72d4afb5ceSopenharmony_ci    SSL_ASSERT3(stack);
73d4afb5ceSopenharmony_ci
74d4afb5ceSopenharmony_ci    ssl_mem_free(stack->data);
75d4afb5ceSopenharmony_ci    ssl_mem_free(stack);
76d4afb5ceSopenharmony_ci}
77