2 * Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #include <openssl/ts.h>
11 #include <openssl/err.h>
12 #include <openssl/asn1t.h>
15 ASN1_SEQUENCE(TS_MSG_IMPRINT
) = {
16 ASN1_SIMPLE(TS_MSG_IMPRINT
, hash_algo
, X509_ALGOR
),
17 ASN1_SIMPLE(TS_MSG_IMPRINT
, hashed_msg
, ASN1_OCTET_STRING
)
18 } static_ASN1_SEQUENCE_END(TS_MSG_IMPRINT
)
20 IMPLEMENT_ASN1_FUNCTIONS_const(TS_MSG_IMPRINT
)
21 IMPLEMENT_ASN1_DUP_FUNCTION(TS_MSG_IMPRINT
)
22 TS_MSG_IMPRINT
*d2i_TS_MSG_IMPRINT_bio(BIO
*bp
, TS_MSG_IMPRINT
**a
)
24 return ASN1_d2i_bio_of(TS_MSG_IMPRINT
, TS_MSG_IMPRINT_new
,
25 d2i_TS_MSG_IMPRINT
, bp
, a
);
28 int i2d_TS_MSG_IMPRINT_bio(BIO
*bp
, TS_MSG_IMPRINT
*a
)
30 return ASN1_i2d_bio_of_const(TS_MSG_IMPRINT
, i2d_TS_MSG_IMPRINT
, bp
, a
);
32 #ifndef OPENSSL_NO_STDIO
33 TS_MSG_IMPRINT
*d2i_TS_MSG_IMPRINT_fp(FILE *fp
, TS_MSG_IMPRINT
**a
)
35 return ASN1_d2i_fp_of(TS_MSG_IMPRINT
, TS_MSG_IMPRINT_new
,
36 d2i_TS_MSG_IMPRINT
, fp
, a
);
39 int i2d_TS_MSG_IMPRINT_fp(FILE *fp
, TS_MSG_IMPRINT
*a
)
41 return ASN1_i2d_fp_of_const(TS_MSG_IMPRINT
, i2d_TS_MSG_IMPRINT
, fp
, a
);
45 ASN1_SEQUENCE(TS_REQ
) = {
46 ASN1_SIMPLE(TS_REQ
, version
, ASN1_INTEGER
),
47 ASN1_SIMPLE(TS_REQ
, msg_imprint
, TS_MSG_IMPRINT
),
48 ASN1_OPT(TS_REQ
, policy_id
, ASN1_OBJECT
),
49 ASN1_OPT(TS_REQ
, nonce
, ASN1_INTEGER
),
50 ASN1_OPT(TS_REQ
, cert_req
, ASN1_FBOOLEAN
),
51 ASN1_IMP_SEQUENCE_OF_OPT(TS_REQ
, extensions
, X509_EXTENSION
, 0)
52 } static_ASN1_SEQUENCE_END(TS_REQ
)
54 IMPLEMENT_ASN1_FUNCTIONS_const(TS_REQ
)
55 IMPLEMENT_ASN1_DUP_FUNCTION(TS_REQ
)
56 TS_REQ
*d2i_TS_REQ_bio(BIO
*bp
, TS_REQ
**a
)
58 return ASN1_d2i_bio_of(TS_REQ
, TS_REQ_new
, d2i_TS_REQ
, bp
, a
);
61 int i2d_TS_REQ_bio(BIO
*bp
, TS_REQ
*a
)
63 return ASN1_i2d_bio_of_const(TS_REQ
, i2d_TS_REQ
, bp
, a
);
65 #ifndef OPENSSL_NO_STDIO
66 TS_REQ
*d2i_TS_REQ_fp(FILE *fp
, TS_REQ
**a
)
68 return ASN1_d2i_fp_of(TS_REQ
, TS_REQ_new
, d2i_TS_REQ
, fp
, a
);
71 int i2d_TS_REQ_fp(FILE *fp
, TS_REQ
*a
)
73 return ASN1_i2d_fp_of_const(TS_REQ
, i2d_TS_REQ
, fp
, a
);
77 ASN1_SEQUENCE(TS_ACCURACY
) = {
78 ASN1_OPT(TS_ACCURACY
, seconds
, ASN1_INTEGER
),
79 ASN1_IMP_OPT(TS_ACCURACY
, millis
, ASN1_INTEGER
, 0),
80 ASN1_IMP_OPT(TS_ACCURACY
, micros
, ASN1_INTEGER
, 1)
81 } static_ASN1_SEQUENCE_END(TS_ACCURACY
)
83 IMPLEMENT_ASN1_FUNCTIONS_const(TS_ACCURACY
)
84 IMPLEMENT_ASN1_DUP_FUNCTION(TS_ACCURACY
)
86 ASN1_SEQUENCE(TS_TST_INFO
) = {
87 ASN1_SIMPLE(TS_TST_INFO
, version
, ASN1_INTEGER
),
88 ASN1_SIMPLE(TS_TST_INFO
, policy_id
, ASN1_OBJECT
),
89 ASN1_SIMPLE(TS_TST_INFO
, msg_imprint
, TS_MSG_IMPRINT
),
90 ASN1_SIMPLE(TS_TST_INFO
, serial
, ASN1_INTEGER
),
91 ASN1_SIMPLE(TS_TST_INFO
, time
, ASN1_GENERALIZEDTIME
),
92 ASN1_OPT(TS_TST_INFO
, accuracy
, TS_ACCURACY
),
93 ASN1_OPT(TS_TST_INFO
, ordering
, ASN1_FBOOLEAN
),
94 ASN1_OPT(TS_TST_INFO
, nonce
, ASN1_INTEGER
),
95 ASN1_EXP_OPT(TS_TST_INFO
, tsa
, GENERAL_NAME
, 0),
96 ASN1_IMP_SEQUENCE_OF_OPT(TS_TST_INFO
, extensions
, X509_EXTENSION
, 1)
97 } static_ASN1_SEQUENCE_END(TS_TST_INFO
)
99 IMPLEMENT_ASN1_FUNCTIONS_const(TS_TST_INFO
)
100 IMPLEMENT_ASN1_DUP_FUNCTION(TS_TST_INFO
)
101 TS_TST_INFO
*d2i_TS_TST_INFO_bio(BIO
*bp
, TS_TST_INFO
**a
)
103 return ASN1_d2i_bio_of(TS_TST_INFO
, TS_TST_INFO_new
, d2i_TS_TST_INFO
, bp
,
107 int i2d_TS_TST_INFO_bio(BIO
*bp
, TS_TST_INFO
*a
)
109 return ASN1_i2d_bio_of_const(TS_TST_INFO
, i2d_TS_TST_INFO
, bp
, a
);
111 #ifndef OPENSSL_NO_STDIO
112 TS_TST_INFO
*d2i_TS_TST_INFO_fp(FILE *fp
, TS_TST_INFO
**a
)
114 return ASN1_d2i_fp_of(TS_TST_INFO
, TS_TST_INFO_new
, d2i_TS_TST_INFO
, fp
,
118 int i2d_TS_TST_INFO_fp(FILE *fp
, TS_TST_INFO
*a
)
120 return ASN1_i2d_fp_of_const(TS_TST_INFO
, i2d_TS_TST_INFO
, fp
, a
);
124 ASN1_SEQUENCE(TS_STATUS_INFO
) = {
125 ASN1_SIMPLE(TS_STATUS_INFO
, status
, ASN1_INTEGER
),
126 ASN1_SEQUENCE_OF_OPT(TS_STATUS_INFO
, text
, ASN1_UTF8STRING
),
127 ASN1_OPT(TS_STATUS_INFO
, failure_info
, ASN1_BIT_STRING
)
128 } static_ASN1_SEQUENCE_END(TS_STATUS_INFO
)
130 IMPLEMENT_ASN1_FUNCTIONS_const(TS_STATUS_INFO
)
131 IMPLEMENT_ASN1_DUP_FUNCTION(TS_STATUS_INFO
)
133 static int ts_resp_set_tst_info(TS_RESP
*a
)
137 status
= ASN1_INTEGER_get(a
->status_info
->status
);
140 if (status
!= 0 && status
!= 1) {
141 TSerr(TS_F_TS_RESP_SET_TST_INFO
, TS_R_TOKEN_PRESENT
);
144 TS_TST_INFO_free(a
->tst_info
);
145 a
->tst_info
= PKCS7_to_TS_TST_INFO(a
->token
);
147 TSerr(TS_F_TS_RESP_SET_TST_INFO
,
148 TS_R_PKCS7_TO_TS_TST_INFO_FAILED
);
151 } else if (status
== 0 || status
== 1) {
152 TSerr(TS_F_TS_RESP_SET_TST_INFO
, TS_R_TOKEN_NOT_PRESENT
);
159 static int ts_resp_cb(int op
, ASN1_VALUE
**pval
, const ASN1_ITEM
*it
,
162 TS_RESP
*ts_resp
= (TS_RESP
*)*pval
;
163 if (op
== ASN1_OP_NEW_POST
) {
164 ts_resp
->tst_info
= NULL
;
165 } else if (op
== ASN1_OP_FREE_POST
) {
166 TS_TST_INFO_free(ts_resp
->tst_info
);
167 } else if (op
== ASN1_OP_D2I_POST
) {
168 if (ts_resp_set_tst_info(ts_resp
) == 0)
174 ASN1_SEQUENCE_cb(TS_RESP
, ts_resp_cb
) = {
175 ASN1_SIMPLE(TS_RESP
, status_info
, TS_STATUS_INFO
),
176 ASN1_OPT(TS_RESP
, token
, PKCS7
),
177 } static_ASN1_SEQUENCE_END_cb(TS_RESP
, TS_RESP
)
179 IMPLEMENT_ASN1_FUNCTIONS_const(TS_RESP
)
181 IMPLEMENT_ASN1_DUP_FUNCTION(TS_RESP
)
183 TS_RESP
*d2i_TS_RESP_bio(BIO
*bp
, TS_RESP
**a
)
185 return ASN1_d2i_bio_of(TS_RESP
, TS_RESP_new
, d2i_TS_RESP
, bp
, a
);
188 int i2d_TS_RESP_bio(BIO
*bp
, TS_RESP
*a
)
190 return ASN1_i2d_bio_of_const(TS_RESP
, i2d_TS_RESP
, bp
, a
);
192 #ifndef OPENSSL_NO_STDIO
193 TS_RESP
*d2i_TS_RESP_fp(FILE *fp
, TS_RESP
**a
)
195 return ASN1_d2i_fp_of(TS_RESP
, TS_RESP_new
, d2i_TS_RESP
, fp
, a
);
198 int i2d_TS_RESP_fp(FILE *fp
, TS_RESP
*a
)
200 return ASN1_i2d_fp_of_const(TS_RESP
, i2d_TS_RESP
, fp
, a
);
204 /* Getting encapsulated TS_TST_INFO object from PKCS7. */
205 TS_TST_INFO
*PKCS7_to_TS_TST_INFO(PKCS7
*token
)
207 PKCS7_SIGNED
*pkcs7_signed
;
209 ASN1_TYPE
*tst_info_wrapper
;
210 ASN1_OCTET_STRING
*tst_info_der
;
211 const unsigned char *p
;
213 if (!PKCS7_type_is_signed(token
)) {
214 TSerr(TS_F_PKCS7_TO_TS_TST_INFO
, TS_R_BAD_PKCS7_TYPE
);
217 if (PKCS7_get_detached(token
)) {
218 TSerr(TS_F_PKCS7_TO_TS_TST_INFO
, TS_R_DETACHED_CONTENT
);
221 pkcs7_signed
= token
->d
.sign
;
222 enveloped
= pkcs7_signed
->contents
;
223 if (OBJ_obj2nid(enveloped
->type
) != NID_id_smime_ct_TSTInfo
) {
224 TSerr(TS_F_PKCS7_TO_TS_TST_INFO
, TS_R_BAD_PKCS7_TYPE
);
227 tst_info_wrapper
= enveloped
->d
.other
;
228 if (tst_info_wrapper
->type
!= V_ASN1_OCTET_STRING
) {
229 TSerr(TS_F_PKCS7_TO_TS_TST_INFO
, TS_R_BAD_TYPE
);
232 tst_info_der
= tst_info_wrapper
->value
.octet_string
;
233 p
= tst_info_der
->data
;
234 return d2i_TS_TST_INFO(NULL
, &p
, tst_info_der
->length
);