diff options
author | kn <> | 2022-07-16 18:36:36 +0000 |
---|---|---|
committer | kn <> | 2022-07-16 18:36:36 +0000 |
commit | 60a538c90ce96e2672ca0034b69a459f023f95f0 (patch) | |
tree | 5fba541b9e26fb4b3428ec48f9eef4b804130d4c /src | |
parent | b0feed9914f2dcfff56098c2e8a5cb96bdb41abd (diff) | |
download | openbsd-60a538c90ce96e2672ca0034b69a459f023f95f0.tar.gz openbsd-60a538c90ce96e2672ca0034b69a459f023f95f0.tar.bz2 openbsd-60a538c90ce96e2672ca0034b69a459f023f95f0.zip |
Add ESSCertIDv2 ASN.1 boilerplate
Guard the new code under LIBRESSL_INTERNAL to defer symbol addition and
minor library bump (thanks tb).
ts/ts.h bits from
RFC 5035 Enhanced Security Services (ESS) Update:
Adding CertID Algorithm Agility
ts/ts_asn1.c bits expanded from
ASN1_SEQUENCE(ESS_CERT_ID_V2) = {
ASN1_OPT(ESS_CERT_ID_V2, hash_alg, X509_ALGOR),
ASN1_SIMPLE(ESS_CERT_ID_V2, hash, ASN1_OCTET_STRING),
ASN1_OPT(ESS_CERT_ID_V2, issuer_serial, ESS_ISSUER_SERIAL)
} static_ASN1_SEQUENCE_END(ESS_CERT_ID_V2)
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_CERT_ID_V2)
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_CERT_ID_V2)
ASN1_SEQUENCE(ESS_SIGNING_CERT_V2) = {
ASN1_SEQUENCE_OF(ESS_SIGNING_CERT_V2, cert_ids, ESS_CERT_ID_V2),
ASN1_SEQUENCE_OF_OPT(ESS_SIGNING_CERT_V2, policy_info, POLICYINFO)
} static_ASN1_SEQUENCE_END(ESS_SIGNING_CERT_V2)
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_SIGNING_CERT_V2)
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_SIGNING_CERT_V2)
Feedback OK tb
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/ts/ts.h | 47 | ||||
-rw-r--r-- | src/lib/libcrypto/ts/ts_asn1.c | 125 |
2 files changed, 170 insertions, 2 deletions
diff --git a/src/lib/libcrypto/ts/ts.h b/src/lib/libcrypto/ts/ts.h index b2fe32bf77..6d4b2dd3a6 100644 --- a/src/lib/libcrypto/ts/ts.h +++ b/src/lib/libcrypto/ts/ts.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ts.h,v 1.12 2022/07/16 15:02:29 kn Exp $ */ | 1 | /* $OpenBSD: ts.h,v 1.13 2022/07/16 18:36:36 kn Exp $ */ |
2 | /* Written by Zoltan Glozik (zglozik@opentsa.org) for the OpenSSL | 2 | /* Written by Zoltan Glozik (zglozik@opentsa.org) for the OpenSSL |
3 | * project 2002, 2003, 2004. | 3 | * project 2002, 2003, 2004. |
4 | */ | 4 | */ |
@@ -264,6 +264,34 @@ typedef struct ESS_signing_cert { | |||
264 | STACK_OF(POLICYINFO) *policy_info; | 264 | STACK_OF(POLICYINFO) *policy_info; |
265 | } ESS_SIGNING_CERT; | 265 | } ESS_SIGNING_CERT; |
266 | 266 | ||
267 | #ifdef LIBRESSL_INTERNAL | ||
268 | /* | ||
269 | * ESSCertIDv2 ::= SEQUENCE { | ||
270 | * hashAlgorithm AlgorithmIdentifier | ||
271 | * DEFAULT {algorithm id-sha256}, | ||
272 | * certHash Hash, | ||
273 | * issuerSerial IssuerSerial OPTIONAL } | ||
274 | */ | ||
275 | |||
276 | typedef struct ESS_cert_id_v2 { | ||
277 | X509_ALGOR *hash_alg; /* Default SHA-256. */ | ||
278 | ASN1_OCTET_STRING *hash; | ||
279 | ESS_ISSUER_SERIAL *issuer_serial; | ||
280 | } ESS_CERT_ID_V2; | ||
281 | |||
282 | DECLARE_STACK_OF(ESS_CERT_ID_V2) | ||
283 | |||
284 | /* | ||
285 | * SigningCertificateV2 ::= SEQUENCE { | ||
286 | * certs SEQUENCE OF ESSCertIDv2, | ||
287 | * policies SEQUENCE OF PolicyInformation OPTIONAL } | ||
288 | */ | ||
289 | |||
290 | typedef struct ESS_signing_cert_v2 { | ||
291 | STACK_OF(ESS_CERT_ID_V2) *cert_ids; | ||
292 | STACK_OF(POLICYINFO) *policy_info; | ||
293 | } ESS_SIGNING_CERT_V2; | ||
294 | #endif /* LIBRESSL_INTERNAL */ | ||
267 | 295 | ||
268 | TS_REQ *TS_REQ_new(void); | 296 | TS_REQ *TS_REQ_new(void); |
269 | void TS_REQ_free(TS_REQ *a); | 297 | void TS_REQ_free(TS_REQ *a); |
@@ -351,6 +379,23 @@ ESS_SIGNING_CERT *d2i_ESS_SIGNING_CERT(ESS_SIGNING_CERT **a, | |||
351 | const unsigned char **pp, long length); | 379 | const unsigned char **pp, long length); |
352 | ESS_SIGNING_CERT *ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT *a); | 380 | ESS_SIGNING_CERT *ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT *a); |
353 | 381 | ||
382 | #ifdef LIBRESSL_INTERNAL | ||
383 | ESS_CERT_ID_V2 *ESS_CERT_ID_V2_new(void); | ||
384 | void ESS_CERT_ID_V2_free(ESS_CERT_ID_V2 *a); | ||
385 | int i2d_ESS_CERT_ID_V2(const ESS_CERT_ID_V2 *a, unsigned char **pp); | ||
386 | ESS_CERT_ID_V2 *d2i_ESS_CERT_ID_V2(ESS_CERT_ID_V2 **a, const unsigned char **pp, | ||
387 | long length); | ||
388 | ESS_CERT_ID_V2 *ESS_CERT_ID_V2_dup(ESS_CERT_ID_V2 *a); | ||
389 | |||
390 | ESS_SIGNING_CERT_V2 *ESS_SIGNING_CERT_V2_new(void); | ||
391 | void ESS_SIGNING_CERT_V2_free(ESS_SIGNING_CERT_V2 *a); | ||
392 | int i2d_ESS_SIGNING_CERT_V2(const ESS_SIGNING_CERT_V2 *a, | ||
393 | unsigned char **pp); | ||
394 | ESS_SIGNING_CERT_V2 *d2i_ESS_SIGNING_CERT_V2(ESS_SIGNING_CERT_V2 **a, | ||
395 | const unsigned char **pp, long length); | ||
396 | ESS_SIGNING_CERT_V2 *ESS_SIGNING_CERT_V2_dup(ESS_SIGNING_CERT_V2 *a); | ||
397 | #endif /* LIBRESSL_INTERNAL */ | ||
398 | |||
354 | int TS_REQ_set_version(TS_REQ *a, long version); | 399 | int TS_REQ_set_version(TS_REQ *a, long version); |
355 | long TS_REQ_get_version(const TS_REQ *a); | 400 | long TS_REQ_get_version(const TS_REQ *a); |
356 | 401 | ||
diff --git a/src/lib/libcrypto/ts/ts_asn1.c b/src/lib/libcrypto/ts/ts_asn1.c index bc89f1368a..c4316d13f8 100644 --- a/src/lib/libcrypto/ts/ts_asn1.c +++ b/src/lib/libcrypto/ts/ts_asn1.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ts_asn1.c,v 1.11 2017/01/29 17:49:23 beck Exp $ */ | 1 | /* $OpenBSD: ts_asn1.c,v 1.12 2022/07/16 18:36:36 kn Exp $ */ |
2 | /* Written by Nils Larsch for the OpenSSL project 2004. | 2 | /* Written by Nils Larsch for the OpenSSL project 2004. |
3 | */ | 3 | */ |
4 | /* ==================================================================== | 4 | /* ==================================================================== |
@@ -846,6 +846,129 @@ ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT *x) | |||
846 | return ASN1_item_dup(&ESS_SIGNING_CERT_it, x); | 846 | return ASN1_item_dup(&ESS_SIGNING_CERT_it, x); |
847 | } | 847 | } |
848 | 848 | ||
849 | static const ASN1_TEMPLATE ESS_CERT_ID_V2_seq_tt[] = { | ||
850 | { | ||
851 | .flags = ASN1_TFLG_OPTIONAL, | ||
852 | .tag = 0, | ||
853 | .offset = offsetof(ESS_CERT_ID_V2, hash_alg), | ||
854 | .field_name = "hash_alg", | ||
855 | .item = &X509_ALGOR_it, | ||
856 | }, | ||
857 | { | ||
858 | .flags = 0, | ||
859 | .tag = 0, | ||
860 | .offset = offsetof(ESS_CERT_ID_V2, hash), | ||
861 | .field_name = "hash", | ||
862 | .item = &ASN1_OCTET_STRING_it, | ||
863 | }, | ||
864 | { | ||
865 | .flags = ASN1_TFLG_OPTIONAL, | ||
866 | .tag = 0, | ||
867 | .offset = offsetof(ESS_CERT_ID_V2, issuer_serial), | ||
868 | .field_name = "issuer_serial", | ||
869 | .item = &ESS_ISSUER_SERIAL_it, | ||
870 | }, | ||
871 | }; | ||
872 | |||
873 | static const ASN1_ITEM ESS_CERT_ID_V2_it = { | ||
874 | .itype = ASN1_ITYPE_SEQUENCE, | ||
875 | .utype = V_ASN1_SEQUENCE, | ||
876 | .templates = ESS_CERT_ID_V2_seq_tt, | ||
877 | .tcount = sizeof(ESS_CERT_ID_V2_seq_tt) / sizeof(ASN1_TEMPLATE), | ||
878 | .funcs = NULL, | ||
879 | .size = sizeof(ESS_CERT_ID_V2), | ||
880 | .sname = "ESS_CERT_ID_V2", | ||
881 | }; | ||
882 | |||
883 | ESS_CERT_ID_V2 * | ||
884 | d2i_ESS_CERT_ID_V2(ESS_CERT_ID_V2 **a, const unsigned char **in, long len) | ||
885 | { | ||
886 | return (ESS_CERT_ID_V2 *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, | ||
887 | &ESS_CERT_ID_V2_it); | ||
888 | } | ||
889 | |||
890 | int | ||
891 | i2d_ESS_CERT_ID_V2(const ESS_CERT_ID_V2 *a, unsigned char **out) | ||
892 | { | ||
893 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &ESS_CERT_ID_V2_it); | ||
894 | } | ||
895 | |||
896 | ESS_CERT_ID_V2 * | ||
897 | ESS_CERT_ID_V2_new(void) | ||
898 | { | ||
899 | return (ESS_CERT_ID_V2 *)ASN1_item_new(&ESS_CERT_ID_V2_it); | ||
900 | } | ||
901 | |||
902 | void | ||
903 | ESS_CERT_ID_V2_free(ESS_CERT_ID_V2 *a) | ||
904 | { | ||
905 | ASN1_item_free((ASN1_VALUE *)a, &ESS_CERT_ID_V2_it); | ||
906 | } | ||
907 | |||
908 | ESS_CERT_ID_V2 * | ||
909 | ESS_CERT_ID_V2_dup(ESS_CERT_ID_V2 *x) | ||
910 | { | ||
911 | return ASN1_item_dup(&ESS_CERT_ID_V2_it, x); | ||
912 | } | ||
913 | |||
914 | static const ASN1_TEMPLATE ESS_SIGNING_CERT_V2_seq_tt[] = { | ||
915 | { | ||
916 | .flags = ASN1_TFLG_SEQUENCE_OF, | ||
917 | .tag = 0, | ||
918 | .offset = offsetof(ESS_SIGNING_CERT_V2, cert_ids), | ||
919 | .field_name = "cert_ids", | ||
920 | .item = &ESS_CERT_ID_V2_it, | ||
921 | }, | ||
922 | { | ||
923 | .flags = ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL, | ||
924 | .tag = 0, | ||
925 | .offset = offsetof(ESS_SIGNING_CERT_V2, policy_info), | ||
926 | .field_name = "policy_info", | ||
927 | .item = &POLICYINFO_it, | ||
928 | }, | ||
929 | }; | ||
930 | |||
931 | static const ASN1_ITEM ESS_SIGNING_CERT_V2_it = { | ||
932 | .itype = ASN1_ITYPE_SEQUENCE, | ||
933 | .utype = V_ASN1_SEQUENCE, | ||
934 | .templates = ESS_SIGNING_CERT_V2_seq_tt, | ||
935 | .tcount = sizeof(ESS_SIGNING_CERT_V2_seq_tt) / sizeof(ASN1_TEMPLATE), | ||
936 | .funcs = NULL, | ||
937 | .size = sizeof(ESS_SIGNING_CERT_V2), | ||
938 | .sname = "ESS_SIGNING_CERT_V2", | ||
939 | }; | ||
940 | |||
941 | ESS_SIGNING_CERT_V2 * | ||
942 | d2i_ESS_SIGNING_CERT_V2(ESS_SIGNING_CERT_V2 **a, const unsigned char **in, long len) | ||
943 | { | ||
944 | return (ESS_SIGNING_CERT_V2 *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, | ||
945 | &ESS_SIGNING_CERT_V2_it); | ||
946 | } | ||
947 | |||
948 | int | ||
949 | i2d_ESS_SIGNING_CERT_V2(const ESS_SIGNING_CERT_V2 *a, unsigned char **out) | ||
950 | { | ||
951 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &ESS_SIGNING_CERT_V2_it); | ||
952 | } | ||
953 | |||
954 | ESS_SIGNING_CERT_V2 * | ||
955 | ESS_SIGNING_CERT_V2_new(void) | ||
956 | { | ||
957 | return (ESS_SIGNING_CERT_V2 *)ASN1_item_new(&ESS_SIGNING_CERT_V2_it); | ||
958 | } | ||
959 | |||
960 | void | ||
961 | ESS_SIGNING_CERT_V2_free(ESS_SIGNING_CERT_V2 *a) | ||
962 | { | ||
963 | ASN1_item_free((ASN1_VALUE *)a, &ESS_SIGNING_CERT_V2_it); | ||
964 | } | ||
965 | |||
966 | ESS_SIGNING_CERT_V2 * | ||
967 | ESS_SIGNING_CERT_V2_dup(ESS_SIGNING_CERT_V2 *x) | ||
968 | { | ||
969 | return ASN1_item_dup(&ESS_SIGNING_CERT_V2_it, x); | ||
970 | } | ||
971 | |||
849 | /* Getting encapsulated TS_TST_INFO object from PKCS7. */ | 972 | /* Getting encapsulated TS_TST_INFO object from PKCS7. */ |
850 | TS_TST_INFO * | 973 | TS_TST_INFO * |
851 | PKCS7_to_TS_TST_INFO(PKCS7 *token) | 974 | PKCS7_to_TS_TST_INFO(PKCS7 *token) |