367
367
const char *residue, hx509_lock lock, outformat format)
370
struct ks_file *f = NULL;
370
struct ks_file *ksf = NULL;
371
371
hx509_private_key *keys = NULL;
373
373
struct pem_ctx pem_ctx;
380
380
if (lock == NULL)
381
381
lock = _hx509_empty_lock;
383
f = calloc(1, sizeof(*f));
383
ksf = calloc(1, sizeof(*ksf));
385
385
hx509_clear_error_string(context);
388
ksf->format = format;
390
f->fn = strdup(residue);
390
ksf->fn = strdup(residue);
391
if (ksf->fn == NULL) {
392
392
hx509_clear_error_string(context);
472
472
for (i = 0; keys[i]; i++)
473
_hx509_certs_keys_add(context, f->certs, keys[i]);
473
_hx509_certs_keys_add(context, ksf->certs, keys[i]);
474
474
_hx509_certs_keys_free(context, keys);
486
486
_hx509_collector_free(pem_ctx.c);
508
508
file_free(hx509_certs certs, void *data)
510
struct ks_file *f = data;
511
hx509_certs_free(&f->certs);
510
struct ks_file *ksf = data;
511
hx509_certs_free(&ksf->certs);
542
542
if (_hx509_cert_private_key_exportable(c)) {
543
543
hx509_private_key key = _hx509_cert_private_key(c);
544
ret = _hx509_private_key_export(context, key, &data);
544
ret = _hx509_private_key_export(context, key,
545
HX509_KEY_FORMAT_DER, &data);
547
548
hx509_pem_write(context, _hx509_private_pem_name(key), NULL, sc->f,
558
559
file_store(hx509_context context,
559
560
hx509_certs certs, void *data, int flags, hx509_lock lock)
561
struct ks_file *f = data;
562
struct ks_file *ksf = data;
562
563
struct store_ctx sc;
565
sc.f = fopen(f->fn, "w");
566
sc.f = fopen(ksf->fn, "w");
566
567
if (sc.f == NULL) {
567
568
hx509_set_error_string(context, 0, ENOENT,
568
569
"Failed to open file %s for writing");
571
572
rk_cloexec_file(sc.f);
572
sc.format = f->format;
573
sc.format = ksf->format;
574
ret = hx509_certs_iter(context, f->certs, store_func, &sc);
575
ret = hx509_certs_iter_f(context, ksf->certs, store_func, &sc);
580
581
file_add(hx509_context context, hx509_certs certs, void *data, hx509_cert c)
582
struct ks_file *f = data;
583
return hx509_certs_add(context, f->certs, c);
583
struct ks_file *ksf = data;
584
return hx509_certs_add(context, ksf->certs, c);
587
588
file_iter_start(hx509_context context,
588
589
hx509_certs certs, void *data, void **cursor)
590
struct ks_file *f = data;
591
return hx509_certs_start_seq(context, f->certs, cursor);
591
struct ks_file *ksf = data;
592
return hx509_certs_start_seq(context, ksf->certs, cursor);
595
596
file_iter(hx509_context context,
596
597
hx509_certs certs, void *data, void *iter, hx509_cert *cert)
598
struct ks_file *f = data;
599
return hx509_certs_next_cert(context, f->certs, iter, cert);
599
struct ks_file *ksf = data;
600
return hx509_certs_next_cert(context, ksf->certs, iter, cert);
608
struct ks_file *f = data;
609
return hx509_certs_end_seq(context, f->certs, cursor);
609
struct ks_file *ksf = data;
610
return hx509_certs_end_seq(context, ksf->certs, cursor);
616
617
hx509_private_key **keys)
618
struct ks_file *f = data;
619
return _hx509_certs_keys_get(context, f->certs, keys);
619
struct ks_file *ksf = data;
620
return _hx509_certs_keys_get(context, ksf->certs, keys);
626
627
hx509_private_key key)
628
struct ks_file *f = data;
629
return _hx509_certs_keys_add(context, f->certs, key);
629
struct ks_file *ksf = data;
630
return _hx509_certs_keys_add(context, ksf->certs, key);
632
633
static struct hx509_keyset_ops keyset_file = {