summaryrefslogtreecommitdiff
path: root/src/libstrongswan/crypto/pkcs7.h
blob: 74bd25361957eb39dcc7d83897cf820353ee4f02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/**
 * @file pkcs7.h
 * 
 * @brief Interface of pkcs7_t.
 * 
 */

/*
 * Copyright (C) 2005 Jan Hutter, Martin Willi
 * Copyright (C) 2002-2008 Andreas Steffen
 *
 * Hochschule fuer Technik Rapperswil, Switzerland
 *
 * 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.
 *
 * RCSID $Id: pkcs7.h 3437 2008-02-01 22:26:01Z andreas $
 */

#ifndef _PKCS7_H
#define _PKCS7_H

typedef struct pkcs7_t pkcs7_t;

#include <library.h>
#include <crypto/x509.h>
#include <crypto/pkcs9.h>
#include <crypto/rsa/rsa_private_key.h>
#include <crypto/crypters/crypter.h>
#include <utils/iterator.h>

/**
 * @brief PKCS#7 contentInfo object.
 * 
 * @b Constructors:
 *  -pkcs7_create_from_chunk()
 *  -pkcs7_create_from_data()
 *
 * @ingroup crypto
 */
struct pkcs7_t {
	/**
	 * @brief Check if the PKCS#7 contentType is data
	 * 
	 * @param this			calling object
	 * @return				TRUE if the contentType is data
	 */
	bool (*is_data) (pkcs7_t *this);

	/**
	 * @brief Check if the PKCS#7 contentType is signedData
	 * 
	 * @param this			calling object
	 * @return				TRUE if the contentType is signedData
	 */
	bool (*is_signedData) (pkcs7_t *this);

	/**
	 * @brief Check if the PKCS#7 contentType is envelopedData
	 * 
	 * @param this			calling object
	 * @return				TRUE if the contentType is envelopedData
	 */
	bool (*is_envelopedData) (pkcs7_t *this);

	/**
	 * @brief Parse a PKCS#7 data content.
	 * 
	 * @param this			calling object
	 * @return				TRUE if parsing was successful
	 */
	bool (*parse_data) (pkcs7_t *this);

	/**
	 * @brief Parse a PKCS#7 signedData content.
	 * 
	 * @param this			calling object
	 * @param cacert		cacert used to verify the signature
	 * @return				TRUE if parsing was successful
	 */
	bool (*parse_signedData) (pkcs7_t *this, x509_t *cacert);

	/**
	 * @brief Parse a PKCS#7 envelopedData content.
	 * 
	 * @param this			calling object
	 * @param serialNumber	serialNumber of the request
	 * @param key			RSA private key used to decrypt the symmetric key
	 * @return				TRUE if parsing was successful
	 */
	bool (*parse_envelopedData) (pkcs7_t *this, chunk_t serialNumber, rsa_private_key_t *key);

	/**
	 * @brief Returns the parsed data object
	 *
	 * @param this			calling object
	 * @return				chunk containing the data object
	 */
	chunk_t (*get_data) (pkcs7_t *this);

	/**
	 * @brief Returns the a DER-encoded contentInfo object
	 *
	 * @param this			calling object
	 * @return				chunk containing the contentInfo object
	 */
	chunk_t (*get_contentInfo) (pkcs7_t *this);

	/**
	 * @brief Create an iterator for the certificates.
	 * 
	 * @param this			calling object
	 * @return				iterator for the certificates
	 */
	iterator_t *(*create_certificate_iterator) (pkcs7_t *this);

	/**
	 * @brief Add a certificate.
	 * 
	 * @param this			calling object
	 * @param cert			certificate to be included
	 */
	void (*set_certificate) (pkcs7_t *this, x509_t *cert);

	/**
	 * @brief Add authenticated attributes.
	 * 
	 * @param this			calling object
	 * @param attributes	attributes to be included
	 */
	void (*set_attributes) (pkcs7_t *this, pkcs9_t *attributes);

	/**
	 * @brief Build a data object
	 *
	 * @param this			PKCS#7 data to be built
	 * @return				TRUE if build was successful
	 */
	bool (*build_data) (pkcs7_t *this);

	/**
	 * @brief Build an envelopedData object
	 *
	 * @param this			PKCS#7 data object to envelop
	 * @param cert			receivers's certificate
	 * @param alg			encryption algorithm
	 * @return				TRUE if build was successful
	 */
	bool (*build_envelopedData) (pkcs7_t *this, x509_t *cert, encryption_algorithm_t alg);

	/**
	 * @brief Build an signedData object
	 *
	 * @param this			PKCS#7 data object to sign
	 * @param key			signer's RSA private key
	 * @param alg			digest algorithm used for signature
	 * @return				TRUE if build was successful
	 */
	bool (*build_signedData) (pkcs7_t *this, rsa_private_key_t *key, hash_algorithm_t alg);

	/**
	 * @brief Destroys the contentInfo object.
	 *
	 * @param this			PKCS#7 contentInfo object to destroy
	 */
	void (*destroy) (pkcs7_t *this);
};

/**
 * @brief Read a PKCS#7 contentInfo object from a DER encoded chunk.
 * 
 * @param chunk		chunk containing DER encoded data
 * @param level		ASN.1 parsing start level
 * @return 			created pkcs7_contentInfo object, or NULL if invalid.
 * 
 * @ingroup crypto
 */
pkcs7_t *pkcs7_create_from_chunk(chunk_t chunk, u_int level);

/**
 * @brief Create a PKCS#7 contentInfo object
 * 
 * @param chunk			chunk containing data
 * @return 				created pkcs7_contentInfo object.
 * 
 * @ingroup crypto
 */
pkcs7_t *pkcs7_create_from_data(chunk_t data);

/**
 * @brief Read a X.509 certificate from a DER encoded file.
 * 
 * @param filename 	file containing DER encoded data
 * @param label		label describing kind of PKCS#7 file
 * @return 			created pkcs7_t object, or NULL if invalid.
 * 
 * @ingroup crypto
 */
pkcs7_t *pkcs7_create_from_file(const char *filename, const char *label);


#endif /* _PKCS7_H */