5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#ifndef _KEYSTORE_H
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define _KEYSTORE_H
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Module: keystore.h
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: This module contains the structure definitions for processing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package keystore files.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#ifdef __cplusplus
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern "C" {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <openssl/evp.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <openssl/x509.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgerr.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* keystore structures */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* this opaque type represents a keystore */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef void *keystore_handle_t;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* flags passed to open_keystore */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* opens keystore read-only. Attempts to modify results in an error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define KEYSTORE_ACCESS_READONLY 0x00000001L
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* opens keystore read-write */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define KEYSTORE_ACCESS_READWRITE 0x00000002L
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * tells open_keystore to fall back to app-generic paths in the case that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the app-specific paths do not exist.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define KEYSTORE_PATH_SOFT 0x00000010L
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * tells open_keystore to use the app-specific paths no matter what,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * failing if they cannot be used for any reason.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define KEYSTORE_PATH_HARD 0x00000020L
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* masks off various types of flags */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define KEYSTORE_ACCESS_MASK 0x0000000FL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define KEYSTORE_PATH_MASK 0x000000F0L
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* default is read-only, soft */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define KEYSTORE_DFLT_FLAGS \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (KEYSTORE_ACCESS_READONLY|KEYSTORE_PATH_SOFT)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * possible encoding formats used by the library, used
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * by print_cert
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef enum {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland KEYSTORE_FORMAT_PEM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland KEYSTORE_FORMAT_DER,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland KEYSTORE_FORMAT_TEXT
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland} keystore_encoding_format_t;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * structure passed back to password callback for determining how
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to prompt for passphrase, and where to record errors
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef struct {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKG_ERR *err;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland} keystore_passphrase_data;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* max length of a passphrase. One could use a short story! */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define KEYSTORE_PASS_MAX 1024
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* callback for collecting passphrase when open_keystore() is called */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef int keystore_passphrase_cb(char *, int, int, void *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* names of the individual files within the keystore path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TRUSTSTORE "truststore"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define KEYSTORE "keystore"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define CERTSTORE "certstore"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* keystore.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int open_keystore(PKG_ERR *, char *, char *,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland keystore_passphrase_cb, long flags, keystore_handle_t *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int print_certs(PKG_ERR *, keystore_handle_t, char *,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland keystore_encoding_format_t, FILE *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int check_cert(PKG_ERR *, X509 *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int check_cert_and_key(PKG_ERR *, X509 *, EVP_PKEY *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int print_cert(PKG_ERR *, X509 *,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland keystore_encoding_format_t, char *, boolean_t, FILE *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int close_keystore(PKG_ERR *, keystore_handle_t,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland keystore_passphrase_cb);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int merge_ca_cert(PKG_ERR *, X509 *, keystore_handle_t);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int merge_cert_and_key(PKG_ERR *, X509 *, EVP_PKEY *,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *, keystore_handle_t);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int delete_cert_and_keys(PKG_ERR *, keystore_handle_t,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int find_key_cert_pair(PKG_ERR *, keystore_handle_t,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *, EVP_PKEY **, X509 **);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int find_ca_certs(PKG_ERR *, keystore_handle_t,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland STACK_OF(X509) **);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int find_cl_certs(PKG_ERR *, keystore_handle_t,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland STACK_OF(X509) **);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#ifdef __cplusplus
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif /* _KEYSTORE_H */