Initial commit for Certificate Transparency support
[openssl.git] / crypto / ct / ct_locl.h
1 /* crypto/ct/ct_locl.h */
2 /*
3  * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
4  * 2015.
5  */
6 /* ====================================================================
7  * Copyright (c) 2015 The OpenSSL Project.  All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in
18  *    the documentation and/or other materials provided with the
19  *    distribution.
20  *
21  * 3. All advertising materials mentioning features or use of this
22  *    software must display the following acknowledgment:
23  *    "This product includes software developed by the OpenSSL Project
24  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25  *
26  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27  *    endorse or promote products derived from this software without
28  *    prior written permission. For written permission, please contact
29  *    licensing@OpenSSL.org.
30  *
31  * 5. Products derived from this software may not be called "OpenSSL"
32  *    nor may "OpenSSL" appear in their names without prior written
33  *    permission of the OpenSSL Project.
34  *
35  * 6. Redistributions of any form whatsoever must retain the following
36  *    acknowledgment:
37  *    "This product includes software developed by the OpenSSL Project
38  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
44  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51  * OF THE POSSIBILITY OF SUCH DAMAGE.
52  * ====================================================================
53  *
54  */
55 #ifndef HEADER_CT_LOCL_H
56 # define HEADER_CT_LOCL_H
57
58 # ifdef __cplusplus
59 extern "C" {
60 # endif
61
62 # ifndef OPENSSL_NO_CT
63
64 /* All hashes are currently SHA256 */
65 #  define SCT_V1_HASHLEN  32
66 /* Minimum RSA key size, from RFC6962 */
67 #  define SCT_MIN_RSA_BITS 2048
68
69 /*
70  * From RFC6962: opaque SerializedSCT<1..2^16-1>; struct { SerializedSCT
71  * sct_list <1..2^16-1>; } SignedCertificateTimestampList;
72  */
73
74 #  define MAX_SCT_SIZE            65535
75 #  define MAX_SCT_LIST_SIZE       MAX_SCT_SIZE
76
77 typedef enum {
78     UNSET_ENTRY = -1,
79     X509_ENTRY = 0,
80     PRECERT_ENTRY = 1
81 } log_entry_type_t;
82
83 typedef enum {
84     UNSET_VERSION = -1,
85     SCT_V1 = 0
86 } sct_version_t;
87
88 typedef struct {
89     sct_version_t version;
90     /* If version is not SCT_V1 this contains the encoded SCT */
91     unsigned char *sct;
92     size_t sct_len;
93     /*
94      * If version is SCT_V1 fields below contain components of the SCT. "logid",
95      * "ext" and "sig" point to buffers allocated with OPENSSL_malloc().
96      */
97     unsigned char *log_id;
98     size_t log_id_len;
99
100     /*
101      * Note, we cannot distinguish between an unset timestamp, and one
102      * that is set to 0.  However since CT didn't exist in 1970, no real
103      * SCT should ever be set as such.
104      */
105     uint64_t timestamp;
106     unsigned char *ext;
107     size_t ext_len;
108     unsigned char hash_alg;
109     unsigned char sig_alg;
110     unsigned char *sig;
111     size_t sig_len;
112     /* Log entry type */
113     log_entry_type_t entry_type;
114 } SCT;
115
116 DECLARE_STACK_OF(SCT)
117
118 /*
119  * Allocate new SCT.
120  * Caller is responsible for calling SCT_free when done.
121  */
122 SCT *SCT_new(void);
123
124 /*
125  * Free SCT and underlying datastructures.
126  */
127 void SCT_free(SCT *sct);
128
129 /*
130  * Set the version of an SCT.
131  * Returns 1 on success, 0 if the version is unrecognized.
132  */
133 int SCT_set_version(SCT *sct, sct_version_t version);
134
135 /*
136  * Set the log entry type of an SCT.
137  * Returns 1 on success.
138  */
139 int SCT_set_log_entry_type(SCT *sct, log_entry_type_t entry_type);
140
141 /*
142  * Set the log id of an SCT to point directly to the *logid specified.
143  * The SCT takes ownership of the specified pointer.
144  * Returns 1 on success.
145  */
146 int SCT_set0_log_id(SCT *sct, unsigned char *log_id, size_t log_id_len);
147
148 /*
149  * Set the timestamp of an SCT.
150  */
151 void SCT_set_timestamp(SCT *sct, uint64_t timestamp);
152
153 /*
154  * Set the signature type of an SCT
155  * Currently NID_sha256WithRSAEncryption or NID_ecdsa_with_SHA256.
156  * Returns 1 on success.
157  */
158 int SCT_set_signature_nid(SCT *sct, int nid);
159
160 /*
161  * Set the extensions of an SCT to point directly to the *ext specified.
162  * The SCT takes ownership of the specified pointer.
163  */
164 void SCT_set0_extensions(SCT *sct, unsigned char *ext, size_t ext_len);
165
166 /*
167  * Set the signature of an SCT to point directly to the *sig specified.
168  * The SCT takes ownership of the specified pointer.
169  */
170 void SCT_set0_signature(SCT *sct, unsigned char *sig, size_t sig_len);
171
172 /*
173  * Returns the version of the SCT.
174  */
175 sct_version_t SCT_get_version(const SCT *sct);
176
177 /*
178  * Returns the log entry type of the SCT.
179  */
180 log_entry_type_t SCT_get_log_entry_type(const SCT *sct);
181
182 /*
183  * Set *logid to point to the log id for the SCT. logid must not be NULL.
184  * The SCT retains ownership of this pointer.
185  * Returns length of the data pointed to.
186  */
187 size_t SCT_get0_log_id(const SCT *sct, unsigned char **log_id);
188
189 /*
190  * Returns the timestamp for the SCT.
191  */
192 uint64_t SCT_get_timestamp(const SCT *sct);
193
194 /*
195  * Return the nid for the signature used by the SCT.
196  * Currently NID_sha256WithRSAEncryption or NID_ecdsa_with_SHA256 (or NID_undef)
197  */
198 int SCT_get_signature_nid(const SCT *sct);
199
200 /*
201  * Set *ext to point to the extension data for the SCT. ext must not be NULL.
202  * The SCT retains ownership of this pointer.
203  * Returns length of the data pointed to.
204  */
205 size_t SCT_get0_extensions(const SCT *sct, unsigned char **ext);
206
207 /*
208  * Set *sig to point to the signature for the SCT. sig must not be NULL.
209  * The SCT retains ownership of this pointer.
210  * Returns length of the data pointed to.
211  */
212 size_t SCT_get0_signature(const SCT *sct, unsigned char **sig);
213
214
215 # endif
216
217 /* BEGIN ERROR CODES */
218 /*
219  * The following lines are auto generated by the script mkerr.pl. Any changes
220  * made after this point may be overwritten when the script is next run.
221  */
222 void ERR_load_CT_strings(void);
223
224 /* Error codes for the CT functions. */
225
226 /* Function codes. */
227 # define CT_F_SCT_NEW                                     100
228 # define CT_F_SCT_SET0_LOG_ID                             101
229 # define CT_F_SCT_SET_LOG_ENTRY_TYPE                      102
230 # define CT_F_SCT_SET_SIGNATURE_NID                       103
231 # define CT_F_SCT_SET_VERSION                             104
232
233 /* Reason codes. */
234 # define CT_R_INVALID_LOG_ID_LENGTH                       100
235 # define CT_R_UNRECOGNIZED_SIGNATURE_NID                  101
236 # define CT_R_UNSUPPORTED_ENTRY_TYPE                      102
237 # define CT_R_UNSUPPORTED_VERSION                         103
238
239 #ifdef  __cplusplus
240 }
241 #endif
242 #endif