/*
 * Copyright (C) 2008-2015 Tobias Brunner
 * Copyright (C) 2008 Martin Willi
 * HSR Hochschule fuer Technik Rapperswil
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

/**
 * @defgroup stroke_ca stroke_ca
 * @{ @ingroup stroke
 */

#ifndef STROKE_CA_H_
#define STROKE_CA_H_

#include <stroke_msg.h>
#include <credentials/sets/mem_cred.h>

typedef struct stroke_ca_t stroke_ca_t;

/**
 * ipsec.conf ca section handling.
 */
struct stroke_ca_t {

	/**
	 * Implements credential_set_t
	 */
	credential_set_t set;

	/**
	 * Add a CA to the set using a stroke_msg_t.
	 *
	 * @param msg		stroke message containing CA info
	 */
	void (*add)(stroke_ca_t *this, stroke_msg_t *msg);

	/**
	 * Remove a CA from the set using a stroke_msg_t.
	 *
	 * @param msg		stroke message containing CA info
	 */
	void (*del)(stroke_ca_t *this, stroke_msg_t *msg);

	/**
	 * List CA sections to stroke console.
	 *
	 * @param msg		stroke message
	 */
	void (*list)(stroke_ca_t *this, stroke_msg_t *msg, FILE *out);

	/**
	 * Get a reference to a CA certificate if it is already stored,
	 * otherwise returns the same certificate.
	 *
	 * @param cert		certificate to check
	 * @return			reference to stored CA certificate, or original
	 */
	certificate_t *(*get_cert_ref)(stroke_ca_t *this, certificate_t *cert);

	/**
	 * Reload CA certificates referenced in CA sections. Flushes the certificate
	 * cache.
	 */
	void (*reload_certs)(stroke_ca_t *this);

	/**
	 * Replace automatically loaded CA certificates.  Flushes the certificate
	 * cache.
	 *
	 * @param certs		credential set to take certificates from (not modified)
	 */
	void (*replace_certs)(stroke_ca_t *this, mem_cred_t *certs);

	/**
	 * Destroy a stroke_ca instance.
	 */
	void (*destroy)(stroke_ca_t *this);
};

/**
 * Create a stroke_ca instance.
 */
stroke_ca_t *stroke_ca_create();

#endif /** STROKE_CA_H_ @}*/
