SCT_new.pod 6.3 KB
Newer Older
R
Rob Percival 已提交
1 2 3 4
=pod

=head1 NAME

5 6 7 8 9 10 11 12 13 14
SCT_new, SCT_new_from_base64, SCT_free, SCT_LIST_free,
SCT_get_version, SCT_set_version,
SCT_get_log_entry_type, SCT_set_log_entry_type,
SCT_get0_log_id, SCT_set0_log_id, SCT_set1_log_id,
SCT_get_timestamp, SCT_set_timestamp,
SCT_get_signature_nid, SCT_set_signature_nid,
SCT_get0_signature, SCT_set0_signature, SCT_set1_signature,
SCT_get0_extensions, SCT_set0_extensions, SCT_set1_extensions,
SCT_get_source, SCT_set_source
 - A Certificate Transparency Signed Certificate Timestamp
R
Rob Percival 已提交
15 16 17 18 19

=head1 SYNOPSIS

 #include <openssl/ct.h>

R
Rob Percival 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
 typedef enum {
  CT_LOG_ENTRY_TYPE_NOT_SET = -1,
  CT_LOG_ENTRY_TYPE_X509 = 0,
  CT_LOG_ENTRY_TYPE_PRECERT = 1
 } ct_log_entry_type_t;

 typedef enum {
  SCT_VERSION_NOT_SET = -1,
  SCT_VERSION_V1 = 0
 } sct_version_t;

 typedef enum {
  SCT_SOURCE_UNKNOWN,
  SCT_SOURCE_TLS_EXTENSION,
  SCT_SOURCE_X509V3_EXTENSION,
  SCT_SOURCE_OCSP_STAPLED_RESPONSE
 } sct_source_t;

R
Rob Percival 已提交
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
 SCT *SCT_new(void);
 SCT *SCT_new_from_base64(unsigned char version,
                          const char *logid_base64,
                          ct_log_entry_type_t entry_type,
                          uint64_t timestamp,
                          const char *extensions_base64,
                          const char *signature_base64);

 void SCT_free(SCT *sct);
 void SCT_LIST_free(STACK_OF(SCT) *a);

 sct_version_t SCT_get_version(const SCT *sct);
 int SCT_set_version(SCT *sct, sct_version_t version);

 ct_log_entry_type_t SCT_get_log_entry_type(const SCT *sct);
 int SCT_set_log_entry_type(SCT *sct, ct_log_entry_type_t entry_type);

 size_t SCT_get0_log_id(const SCT *sct, unsigned char **log_id);
 int SCT_set0_log_id(SCT *sct, unsigned char *log_id, size_t log_id_len);
 int SCT_set1_log_id(SCT *sct, const unsigned char *log_id, size_t log_id_len);

 uint64_t SCT_get_timestamp(const SCT *sct);
 void SCT_set_timestamp(SCT *sct, uint64_t timestamp);

 int SCT_get_signature_nid(const SCT *sct);
 int SCT_set_signature_nid(SCT *sct, int nid);

 size_t SCT_get0_signature(const SCT *sct, unsigned char **sig);
 void SCT_set0_signature(SCT *sct, unsigned char *sig, size_t sig_len);
 int SCT_set1_signature(SCT *sct, const unsigned char *sig, size_t sig_len);

69 70 71 72
 size_t SCT_get0_extensions(const SCT *sct, unsigned char **ext);
 void SCT_set0_extensions(SCT *sct, unsigned char *ext, size_t ext_len);
 int SCT_set1_extensions(SCT *sct, const unsigned char *ext, size_t ext_len);

R
Rob Percival 已提交
73 74 75 76 77 78 79 80 81 82 83
 sct_source_t SCT_get_source(const SCT *sct);
 int SCT_set_source(SCT *sct, sct_source_t source);

=head1 DESCRIPTION

Signed Certificate Timestamps (SCTs) are defined by RFC 6962, Section 3.2.
They constitute a promise by a Certificate Transparency (CT) log to publicly
record a certificate. By cryptographically verifying that a log did indeed issue
an SCT, some confidence can be gained that the certificate is publicly known.

An internal representation of an SCT can be created in one of two ways.
84
The first option is to create a blank SCT, using SCT_new(), and then populate
R
Rob Percival 已提交
85 86
it using:

R
Rich Salz 已提交
87
=over 2
R
Rob Percival 已提交
88

R
Rich Salz 已提交
89 90 91
=item *

SCT_set_version() to set the SCT version.
R
Rob Percival 已提交
92 93 94

Only SCT_VERSION_V1 is currently supported.

R
Rich Salz 已提交
95 96 97
=item *

SCT_set_log_entry_type() to set the type of certificate the SCT was issued for:
R
Rob Percival 已提交
98 99 100 101

B<CT_LOG_ENTRY_TYPE_X509> for a normal certificate.
B<CT_LOG_ENTRY_TYPE_PRECERT> for a pre-certificate.

R
Rich Salz 已提交
102 103 104
=item *

SCT_set0_log_id() or SCT_set1_log_id() to set the LogID of the CT log that the SCT came from.
R
Rob Percival 已提交
105 106 107 108

The former takes ownership, whereas the latter makes a copy.
See RFC 6962, Section 3.2 for the definition of LogID.

R
Rich Salz 已提交
109 110 111 112 113 114 115
=item *

SCT_set_timestamp() to set the time the SCT was issued (epoch time in milliseconds).

=item *

SCT_set_signature_nid() to set the NID of the signature.
R
Rob Percival 已提交
116

R
Rich Salz 已提交
117
=item *
R
Rob Percival 已提交
118

R
Rich Salz 已提交
119
SCT_set0_signature() or SCT_set1_signature() to set the raw signature value.
R
Rob Percival 已提交
120 121 122

The former takes ownership, whereas the latter makes a copy.

R
Rich Salz 已提交
123 124 125
=item *

SCT_set0_extensions() or B<SCT_set1_extensions> to provide SCT extensions.
R
Rob Percival 已提交
126 127 128 129 130 131

The former takes ownership, whereas the latter makes a copy.

=back

Alternatively, the SCT can be pre-populated from the following data using
132
SCT_new_from_base64():
R
Rob Percival 已提交
133

R
Rich Salz 已提交
134 135 136 137 138
=over 2

=item *

The SCT version (only SCT_VERSION_V1 is currently supported).
R
Rob Percival 已提交
139

R
Rich Salz 已提交
140
=item *
R
Rob Percival 已提交
141

R
Rich Salz 已提交
142
The LogID (see RFC 6962, Section 3.2), base64 encoded.
R
Rob Percival 已提交
143

R
Rich Salz 已提交
144
=item *
R
Rob Percival 已提交
145

R
Rich Salz 已提交
146
The type of certificate the SCT was issued for:
R
Rob Percival 已提交
147 148 149
B<CT_LOG_ENTRY_TYPE_X509> for a normal certificate.
B<CT_LOG_ENTRY_TYPE_PRECERT> for a pre-certificate.

R
Rich Salz 已提交
150 151 152 153 154 155 156
=item *

The time that the SCT was issued (epoch time in milliseconds).

=item *

The SCT extensions, base64 encoded.
R
Rob Percival 已提交
157

R
Rich Salz 已提交
158
=item *
R
Rob Percival 已提交
159

R
Rich Salz 已提交
160
The SCT signature, base64 encoded.
R
Rob Percival 已提交
161 162 163

=back

164
SCT_set_source() can be used to record where the SCT was found
R
Rob Percival 已提交
165 166 167 168 169 170 171 172
(TLS extension, X.509 certificate extension or OCSP response). This is not
required for verifying the SCT.

=head1 NOTES

Some of the setters return int, instead of void. These will all return 1 on
success, 0 on failure. They will not make changes on failure.

173 174
All of the setters will reset the validation status of the SCT to
SCT_VALIDATION_STATUS_NOT_SET (see L<SCT_validate(3)>).
R
Rob Percival 已提交
175

176
SCT_set_source() will call SCT_set_log_entry_type() if the type of
R
Rob Percival 已提交
177 178 179 180
certificate the SCT was issued for can be inferred from where the SCT was found.
For example, an SCT found in an X.509 extension must have been issued for a pre-
certificate.

181
SCT_set_source() will not refuse unknown values.
R
Rob Percival 已提交
182 183 184

=head1 RETURN VALUES

185
SCT_set_version() returns 1 if the specified version is supported, 0 otherwise.
R
Rob Percival 已提交
186

187
SCT_set_log_entry_type() returns 1 if the specified log entry type is supported, 0 otherwise.
R
Rob Percival 已提交
188

189
SCT_set0_log_id() and B<SCT_set1_log_id> return 1 if the specified LogID is a
F
FdaSilvaYY 已提交
190
valid SHA-256 hash, 0 otherwise. Additionally, B<SCT_set1_log_id> returns 0 if
R
Rob Percival 已提交
191 192 193 194 195 196 197
malloc fails.

B<SCT_set_signature_nid> returns 1 if the specified NID is supported, 0 otherwise.

B<SCT_set1_extensions> and B<SCT_set1_signature> return 1 if the supplied buffer
is copied successfully, 0 otherwise (i.e. if malloc fails).

198
B<SCT_set_source> returns 1 on success, 0 otherwise.
R
Rob Percival 已提交
199 200 201

=head1 SEE ALSO

202
L<ct(7)>,
R
Rich Salz 已提交
203
L<SCT_validate(3)>,
R
Rob Percival 已提交
204 205
L<OBJ_nid2obj(3)>

R
Rob Percival 已提交
206 207 208 209
=head1 HISTORY

These functions were added in OpenSSL 1.1.0.

R
Rob Percival 已提交
210 211
=head1 COPYRIGHT

R
Rich Salz 已提交
212
Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved.
R
Rob Percival 已提交
213 214 215 216 217 218 219

Licensed under the OpenSSL license (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut