1 /* $NetBSD: ks_mem.c,v 1.1.1.2 2014/04/24 12:45:42 pettai Exp $ */
4 * Copyright (c) 2005 - 2006 Kungliga Tekniska Högskolan
5 * (Royal Institute of Technology, Stockholm, Sweden).
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the Institute nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 * Should use two hash/tree certificates intead of a array. Criteria
40 * should be subject and subjectKeyIdentifier since those two are
41 * commonly seached on in CMS and path building.
50 hx509_private_key
*keys
;
54 mem_init(hx509_context context
,
55 hx509_certs certs
, void **data
, int flags
,
56 const char *residue
, hx509_lock lock
)
59 mem
= calloc(1, sizeof(*mem
));
62 if (residue
== NULL
|| residue
[0] == '\0')
63 residue
= "anonymous";
64 mem
->name
= strdup(residue
);
65 if (mem
->name
== NULL
) {
74 mem_free(hx509_certs certs
, void *data
)
76 struct mem_data
*mem
= data
;
79 for (i
= 0; i
< mem
->certs
.len
; i
++)
80 hx509_cert_free(mem
->certs
.val
[i
]);
82 for (i
= 0; mem
->keys
&& mem
->keys
[i
]; i
++)
83 hx509_private_key_free(&mem
->keys
[i
]);
92 mem_add(hx509_context context
, hx509_certs certs
, void *data
, hx509_cert c
)
94 struct mem_data
*mem
= data
;
97 val
= realloc(mem
->certs
.val
,
98 (mem
->certs
.len
+ 1) * sizeof(mem
->certs
.val
[0]));
102 mem
->certs
.val
= val
;
103 mem
->certs
.val
[mem
->certs
.len
] = hx509_cert_ref(c
);
110 mem_iter_start(hx509_context context
,
115 unsigned long *iter
= malloc(sizeof(*iter
));
127 mem_iter(hx509_context contexst
,
133 unsigned long *iter
= cursor
;
134 struct mem_data
*mem
= data
;
136 if (*iter
>= mem
->certs
.len
) {
141 *cert
= hx509_cert_ref(mem
->certs
.val
[*iter
]);
147 mem_iter_end(hx509_context context
,
157 mem_getkeys(hx509_context context
,
160 hx509_private_key
**keys
)
162 struct mem_data
*mem
= data
;
165 for (i
= 0; mem
->keys
&& mem
->keys
[i
]; i
++)
167 *keys
= calloc(i
+ 1, sizeof(**keys
));
168 for (i
= 0; mem
->keys
&& mem
->keys
[i
]; i
++) {
169 (*keys
)[i
] = _hx509_private_key_ref(mem
->keys
[i
]);
170 if ((*keys
)[i
] == NULL
) {
172 hx509_private_key_free(&(*keys
)[i
]);
173 hx509_set_error_string(context
, 0, ENOMEM
, "out of memory");
182 mem_addkey(hx509_context context
,
185 hx509_private_key key
)
187 struct mem_data
*mem
= data
;
191 for (i
= 0; mem
->keys
&& mem
->keys
[i
]; i
++)
193 ptr
= realloc(mem
->keys
, (i
+ 2) * sizeof(*mem
->keys
));
195 hx509_set_error_string(context
, 0, ENOMEM
, "out of memory");
199 mem
->keys
[i
] = _hx509_private_key_ref(key
);
200 mem
->keys
[i
+ 1] = NULL
;
205 static struct hx509_keyset_ops keyset_mem
= {
222 _hx509_ks_mem_register(hx509_context context
)
224 _hx509_ks_register(context
, &keyset_mem
);