2
* Copyright (c) 2005 - 2006 Kungliga Tekniska Högskolan
3
* (Royal Institute of Technology, Stockholm, Sweden).
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
17
* 3. Neither the name of the Institute nor the names of its contributors
18
* may be used to endorse or promote products derived from this software
19
* without specific prior written permission.
21
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38
* Should use two hash/tree certificates intead of a array. Criteria
39
* should be subject and subjectKeyIdentifier since those two are
40
* commonly seached on in CMS and path building.
49
hx509_private_key *keys;
53
mem_init(hx509_context context,
54
hx509_certs certs, void **data, int flags,
55
const char *residue, hx509_lock lock)
58
mem = calloc(1, sizeof(*mem));
61
if (residue == NULL || residue[0] == '\0')
62
residue = "anonymous";
63
mem->name = strdup(residue);
64
if (mem->name == NULL) {
73
mem_free(hx509_certs certs, void *data)
75
struct mem_data *mem = data;
78
for (i = 0; i < mem->certs.len; i++)
79
hx509_cert_free(mem->certs.val[i]);
81
for (i = 0; mem->keys && mem->keys[i]; i++)
82
_hx509_private_key_free(&mem->keys[i]);
91
mem_add(hx509_context context, hx509_certs certs, void *data, hx509_cert c)
93
struct mem_data *mem = data;
96
val = realloc(mem->certs.val,
97
(mem->certs.len + 1) * sizeof(mem->certs.val[0]));
101
mem->certs.val = val;
102
mem->certs.val[mem->certs.len] = hx509_cert_ref(c);
109
mem_iter_start(hx509_context context,
114
unsigned long *iter = malloc(sizeof(*iter));
126
mem_iter(hx509_context contexst,
132
unsigned long *iter = cursor;
133
struct mem_data *mem = data;
135
if (*iter >= mem->certs.len) {
140
*cert = hx509_cert_ref(mem->certs.val[*iter]);
146
mem_iter_end(hx509_context context,
156
mem_getkeys(hx509_context context,
159
hx509_private_key **keys)
161
struct mem_data *mem = data;
164
for (i = 0; mem->keys && mem->keys[i]; i++)
166
*keys = calloc(i + 1, sizeof(**keys));
167
for (i = 0; mem->keys && mem->keys[i]; i++) {
168
(*keys)[i] = _hx509_private_key_ref(mem->keys[i]);
169
if ((*keys)[i] == NULL) {
171
_hx509_private_key_free(&(*keys)[i]);
172
hx509_set_error_string(context, 0, ENOMEM, "out of memory");
181
mem_addkey(hx509_context context,
184
hx509_private_key key)
186
struct mem_data *mem = data;
190
for (i = 0; mem->keys && mem->keys[i]; i++)
192
ptr = realloc(mem->keys, (i + 2) * sizeof(*mem->keys));
194
hx509_set_error_string(context, 0, ENOMEM, "out of memory");
198
mem->keys[i] = _hx509_private_key_ref(key);
199
mem->keys[i + 1] = NULL;
204
static struct hx509_keyset_ops keyset_mem = {
221
_hx509_ks_mem_register(hx509_context context)
223
_hx509_ks_register(context, &keyset_mem);