x509_acert.c 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. /*
  2. * Copyright 2021 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  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
  8. */
  9. #include <string.h>
  10. #include <crypto/ctype.h>
  11. #include <openssl/asn1t.h>
  12. #include <openssl/err.h>
  13. #include <openssl/x509.h>
  14. #include <openssl/x509v3.h>
  15. #include "x509_acert.h"
  16. /*
  17. * OpenSSL ASN.1 template translation of RFC 5755 4.1.
  18. */
  19. ASN1_SEQUENCE(OSSL_OBJECT_DIGEST_INFO) = {
  20. ASN1_EMBED(OSSL_OBJECT_DIGEST_INFO, digestedObjectType, ASN1_ENUMERATED),
  21. ASN1_OPT(OSSL_OBJECT_DIGEST_INFO, otherObjectTypeID, ASN1_OBJECT),
  22. ASN1_EMBED(OSSL_OBJECT_DIGEST_INFO, digestAlgorithm, X509_ALGOR),
  23. ASN1_EMBED(OSSL_OBJECT_DIGEST_INFO, objectDigest, ASN1_BIT_STRING),
  24. } ASN1_SEQUENCE_END(OSSL_OBJECT_DIGEST_INFO)
  25. ASN1_SEQUENCE(OSSL_ISSUER_SERIAL) = {
  26. ASN1_SEQUENCE_OF(OSSL_ISSUER_SERIAL, issuer, GENERAL_NAME),
  27. ASN1_EMBED(OSSL_ISSUER_SERIAL, serial, ASN1_INTEGER),
  28. ASN1_OPT(OSSL_ISSUER_SERIAL, issuerUID, ASN1_BIT_STRING),
  29. } ASN1_SEQUENCE_END(OSSL_ISSUER_SERIAL)
  30. ASN1_SEQUENCE(X509_ACERT_ISSUER_V2FORM) = {
  31. ASN1_SEQUENCE_OF_OPT(X509_ACERT_ISSUER_V2FORM, issuerName, GENERAL_NAME),
  32. ASN1_IMP_OPT(X509_ACERT_ISSUER_V2FORM, baseCertificateId, OSSL_ISSUER_SERIAL, 0),
  33. ASN1_IMP_OPT(X509_ACERT_ISSUER_V2FORM, objectDigestInfo, OSSL_OBJECT_DIGEST_INFO, 1),
  34. } ASN1_SEQUENCE_END(X509_ACERT_ISSUER_V2FORM)
  35. ASN1_CHOICE(X509_ACERT_ISSUER) = {
  36. ASN1_SEQUENCE_OF(X509_ACERT_ISSUER, u.v1Form, GENERAL_NAME),
  37. ASN1_IMP(X509_ACERT_ISSUER, u.v2Form, X509_ACERT_ISSUER_V2FORM, 0),
  38. } ASN1_CHOICE_END(X509_ACERT_ISSUER)
  39. ASN1_SEQUENCE(X509_HOLDER) = {
  40. ASN1_IMP_OPT(X509_HOLDER, baseCertificateID, OSSL_ISSUER_SERIAL, 0),
  41. ASN1_IMP_SEQUENCE_OF_OPT(X509_HOLDER, entityName, GENERAL_NAME, 1),
  42. ASN1_IMP_OPT(X509_HOLDER, objectDigestInfo, OSSL_OBJECT_DIGEST_INFO, 2),
  43. } ASN1_SEQUENCE_END(X509_HOLDER)
  44. ASN1_SEQUENCE(X509_ACERT_INFO) = {
  45. ASN1_EMBED(X509_ACERT_INFO, version, ASN1_INTEGER),
  46. ASN1_EMBED(X509_ACERT_INFO, holder, X509_HOLDER),
  47. ASN1_EMBED(X509_ACERT_INFO, issuer, X509_ACERT_ISSUER),
  48. ASN1_EMBED(X509_ACERT_INFO, signature, X509_ALGOR),
  49. ASN1_EMBED(X509_ACERT_INFO, serialNumber, ASN1_INTEGER),
  50. ASN1_EMBED(X509_ACERT_INFO, validityPeriod, X509_VAL),
  51. ASN1_SEQUENCE_OF(X509_ACERT_INFO, attributes, X509_ATTRIBUTE),
  52. ASN1_OPT(X509_ACERT_INFO, issuerUID, ASN1_BIT_STRING),
  53. ASN1_SEQUENCE_OF_OPT(X509_ACERT_INFO, extensions, X509_EXTENSION),
  54. } ASN1_SEQUENCE_END(X509_ACERT_INFO)
  55. ASN1_SEQUENCE(X509_ACERT) = {
  56. ASN1_SIMPLE(X509_ACERT, acinfo, X509_ACERT_INFO),
  57. ASN1_EMBED(X509_ACERT, sig_alg, X509_ALGOR),
  58. ASN1_EMBED(X509_ACERT, signature, ASN1_BIT_STRING),
  59. } ASN1_SEQUENCE_END(X509_ACERT)
  60. IMPLEMENT_ASN1_FUNCTIONS(X509_ACERT)
  61. IMPLEMENT_ASN1_DUP_FUNCTION(X509_ACERT)
  62. IMPLEMENT_ASN1_ALLOC_FUNCTIONS(X509_ACERT_INFO)
  63. IMPLEMENT_ASN1_ALLOC_FUNCTIONS(OSSL_ISSUER_SERIAL)
  64. IMPLEMENT_ASN1_ALLOC_FUNCTIONS(OSSL_OBJECT_DIGEST_INFO)
  65. IMPLEMENT_ASN1_ALLOC_FUNCTIONS(X509_ACERT_ISSUER_V2FORM)
  66. IMPLEMENT_PEM_rw(X509_ACERT, X509_ACERT, PEM_STRING_ACERT, X509_ACERT)
  67. static X509_NAME *get_dirName(const GENERAL_NAMES *names)
  68. {
  69. GENERAL_NAME *dirName;
  70. if (sk_GENERAL_NAME_num(names) != 1)
  71. return NULL;
  72. dirName = sk_GENERAL_NAME_value(names, 0);
  73. if (dirName->type != GEN_DIRNAME)
  74. return NULL;
  75. return dirName->d.directoryName;
  76. }
  77. void OSSL_OBJECT_DIGEST_INFO_get0_digest(const OSSL_OBJECT_DIGEST_INFO *o,
  78. int *digestedObjectType,
  79. const X509_ALGOR **digestAlgorithm,
  80. const ASN1_BIT_STRING **digest)
  81. {
  82. if (digestedObjectType != NULL)
  83. *digestedObjectType = ASN1_ENUMERATED_get(&o->digestedObjectType);
  84. if (digestAlgorithm != NULL)
  85. *digestAlgorithm = &o->digestAlgorithm;
  86. if (digest != NULL)
  87. *digest = &o->objectDigest;
  88. }
  89. const X509_NAME *OSSL_ISSUER_SERIAL_get0_issuer(const OSSL_ISSUER_SERIAL *isss)
  90. {
  91. return get_dirName(isss->issuer);
  92. }
  93. const ASN1_INTEGER *OSSL_ISSUER_SERIAL_get0_serial(const OSSL_ISSUER_SERIAL *isss)
  94. {
  95. return &isss->serial;
  96. }
  97. const ASN1_BIT_STRING *OSSL_ISSUER_SERIAL_get0_issuerUID(const OSSL_ISSUER_SERIAL *isss)
  98. {
  99. return isss->issuerUID;
  100. }
  101. long X509_ACERT_get_version(const X509_ACERT *x)
  102. {
  103. return ASN1_INTEGER_get(&x->acinfo->version);
  104. }
  105. void X509_ACERT_get0_signature(const X509_ACERT *x,
  106. const ASN1_BIT_STRING **psig,
  107. const X509_ALGOR **palg)
  108. {
  109. if (psig != NULL)
  110. *psig = &x->signature;
  111. if (palg != NULL)
  112. *palg = &x->sig_alg;
  113. }
  114. int X509_ACERT_get_signature_nid(const X509_ACERT *x)
  115. {
  116. return OBJ_obj2nid(x->sig_alg.algorithm);
  117. }
  118. const GENERAL_NAMES *X509_ACERT_get0_holder_entityName(const X509_ACERT *x)
  119. {
  120. return x->acinfo->holder.entityName;
  121. }
  122. const OSSL_ISSUER_SERIAL *X509_ACERT_get0_holder_baseCertId(const X509_ACERT *x)
  123. {
  124. return x->acinfo->holder.baseCertificateID;
  125. }
  126. const OSSL_OBJECT_DIGEST_INFO *X509_ACERT_get0_holder_digest(const X509_ACERT *x)
  127. {
  128. return x->acinfo->holder.objectDigestInfo;
  129. }
  130. const X509_NAME *X509_ACERT_get0_issuerName(const X509_ACERT *x)
  131. {
  132. if (x->acinfo->issuer.type != X509_ACERT_ISSUER_V2
  133. || x->acinfo->issuer.u.v2Form == NULL)
  134. return NULL;
  135. return get_dirName(x->acinfo->issuer.u.v2Form->issuerName);
  136. }
  137. const ASN1_BIT_STRING *X509_ACERT_get0_issuerUID(const X509_ACERT *x)
  138. {
  139. return x->acinfo->issuerUID;
  140. }
  141. const X509_ALGOR *X509_ACERT_get0_info_sigalg(const X509_ACERT *x)
  142. {
  143. return &x->acinfo->signature;
  144. }
  145. const ASN1_INTEGER *X509_ACERT_get0_serialNumber(const X509_ACERT *x)
  146. {
  147. return &x->acinfo->serialNumber;
  148. }
  149. const ASN1_GENERALIZEDTIME *X509_ACERT_get0_notBefore(const X509_ACERT *x)
  150. {
  151. return x->acinfo->validityPeriod.notBefore;
  152. }
  153. const ASN1_GENERALIZEDTIME *X509_ACERT_get0_notAfter(const X509_ACERT *x)
  154. {
  155. return x->acinfo->validityPeriod.notAfter;
  156. }
  157. /* Attribute management functions */
  158. int X509_ACERT_get_attr_count(const X509_ACERT *x)
  159. {
  160. return X509at_get_attr_count(x->acinfo->attributes);
  161. }
  162. int X509_ACERT_get_attr_by_NID(const X509_ACERT *x, int nid, int lastpos)
  163. {
  164. return X509at_get_attr_by_NID(x->acinfo->attributes, nid, lastpos);
  165. }
  166. int X509_ACERT_get_attr_by_OBJ(const X509_ACERT *x, const ASN1_OBJECT *obj,
  167. int lastpos)
  168. {
  169. return X509at_get_attr_by_OBJ(x->acinfo->attributes, obj, lastpos);
  170. }
  171. X509_ATTRIBUTE *X509_ACERT_get_attr(const X509_ACERT *x, int loc)
  172. {
  173. return X509at_get_attr(x->acinfo->attributes, loc);
  174. }
  175. X509_ATTRIBUTE *X509_ACERT_delete_attr(X509_ACERT *x, int loc)
  176. {
  177. return X509at_delete_attr(x->acinfo->attributes, loc);
  178. }
  179. int X509_ACERT_add1_attr(X509_ACERT *x, X509_ATTRIBUTE *attr)
  180. {
  181. STACK_OF(X509_ATTRIBUTE) **attrs = &x->acinfo->attributes;
  182. return X509at_add1_attr(attrs, attr) != NULL;
  183. }
  184. int X509_ACERT_add1_attr_by_OBJ(X509_ACERT *x, const ASN1_OBJECT *obj,
  185. int type, const void *bytes, int len)
  186. {
  187. STACK_OF(X509_ATTRIBUTE) **attrs = &x->acinfo->attributes;
  188. return X509at_add1_attr_by_OBJ(attrs, obj, type, bytes, len) != NULL;
  189. }
  190. int X509_ACERT_add1_attr_by_NID(X509_ACERT *x, int nid, int type,
  191. const void *bytes, int len)
  192. {
  193. STACK_OF(X509_ATTRIBUTE) **attrs = &x->acinfo->attributes;
  194. return X509at_add1_attr_by_NID(attrs, nid, type, bytes, len) != NULL;
  195. }
  196. int X509_ACERT_add1_attr_by_txt(X509_ACERT *x, const char *attrname, int type,
  197. const unsigned char *bytes, int len)
  198. {
  199. STACK_OF(X509_ATTRIBUTE) **attrs = &x->acinfo->attributes;
  200. return X509at_add1_attr_by_txt(attrs, attrname, type, bytes, len) != NULL;
  201. }
  202. static int check_asn1_attribute(const char **value)
  203. {
  204. const char *p = *value;
  205. if (strncmp(p, "ASN1:", 5) != 0)
  206. return 0;
  207. p += 5;
  208. while (ossl_isspace(*p))
  209. p++;
  210. *value = p;
  211. return 1;
  212. }
  213. int X509_ACERT_add_attr_nconf(CONF *conf, const char *section,
  214. X509_ACERT *acert)
  215. {
  216. int ret = 0, i;
  217. STACK_OF(CONF_VALUE) *attr_sk = NCONF_get_section(conf, section);
  218. if (attr_sk == NULL)
  219. goto err;
  220. for (i = 0; i < sk_CONF_VALUE_num(attr_sk); i++) {
  221. CONF_VALUE *v = sk_CONF_VALUE_value(attr_sk, i);
  222. const char *value = v->value;
  223. if (value == NULL) {
  224. ERR_raise_data(ERR_LIB_X509, X509_R_INVALID_ATTRIBUTES,
  225. "name=%s,section=%s",v->name, section);
  226. goto err;
  227. }
  228. if (check_asn1_attribute(&value) == 1) {
  229. int att_len;
  230. unsigned char *att_data = NULL;
  231. ASN1_TYPE *asn1 = ASN1_generate_nconf(value, conf);
  232. if (asn1 == NULL)
  233. goto err;
  234. att_len = i2d_ASN1_TYPE(asn1, &att_data);
  235. ret = X509_ACERT_add1_attr_by_txt(acert, v->name, V_ASN1_SEQUENCE,
  236. att_data, att_len);
  237. OPENSSL_free(att_data);
  238. ASN1_TYPE_free(asn1);
  239. if (!ret)
  240. goto err;
  241. } else {
  242. ret = X509_ACERT_add1_attr_by_txt(acert, v->name,
  243. V_ASN1_OCTET_STRING,
  244. (unsigned char *)value,
  245. strlen(value));
  246. if (!ret)
  247. goto err;
  248. }
  249. }
  250. ret = 1;
  251. err:
  252. return ret;
  253. }
  254. void *X509_ACERT_get_ext_d2i(const X509_ACERT *x, int nid, int *crit, int *idx)
  255. {
  256. return X509V3_get_d2i(x->acinfo->extensions, nid, crit, idx);
  257. }
  258. int X509_ACERT_add1_ext_i2d(X509_ACERT *x, int nid, void *value, int crit,
  259. unsigned long flags)
  260. {
  261. return X509V3_add1_i2d(&x->acinfo->extensions, nid, value, crit, flags);
  262. }
  263. const STACK_OF(X509_EXTENSION) *X509_ACERT_get0_extensions(const X509_ACERT *x)
  264. {
  265. return x->acinfo->extensions;
  266. }