1
0

x_ietfatt.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /*
  2. * Copyright 2021-2024 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 <openssl/err.h>
  10. #include <openssl/asn1t.h>
  11. #include <openssl/x509_acert.h>
  12. /*-
  13. * Definition of IetfAttrSyntax from RFC 5755 4.4
  14. *
  15. * IetfAttrSyntax ::= SEQUENCE {
  16. * policyAuthority [0] GeneralNames OPTIONAL,
  17. * values SEQUENCE OF CHOICE {
  18. * octets OCTET STRING,
  19. * oid OBJECT IDENTIFIER,
  20. * string UTF8String
  21. * }
  22. * }
  23. *
  24. * Section 4.4.2 states that all values in the sequence MUST use the
  25. * same choice of value (octet, oid or string).
  26. */
  27. struct OSSL_IETF_ATTR_SYNTAX_VALUE_st {
  28. int type;
  29. union {
  30. ASN1_OCTET_STRING *octets;
  31. ASN1_OBJECT *oid;
  32. ASN1_UTF8STRING *string;
  33. } u;
  34. };
  35. struct OSSL_IETF_ATTR_SYNTAX_st {
  36. GENERAL_NAMES *policyAuthority;
  37. int type;
  38. STACK_OF(OSSL_IETF_ATTR_SYNTAX_VALUE) *values;
  39. };
  40. ASN1_CHOICE(OSSL_IETF_ATTR_SYNTAX_VALUE) = {
  41. ASN1_SIMPLE(OSSL_IETF_ATTR_SYNTAX_VALUE, u.octets, ASN1_OCTET_STRING),
  42. ASN1_SIMPLE(OSSL_IETF_ATTR_SYNTAX_VALUE, u.oid, ASN1_OBJECT),
  43. ASN1_SIMPLE(OSSL_IETF_ATTR_SYNTAX_VALUE, u.string, ASN1_UTF8STRING),
  44. } ASN1_CHOICE_END(OSSL_IETF_ATTR_SYNTAX_VALUE)
  45. ASN1_SEQUENCE(OSSL_IETF_ATTR_SYNTAX) = {
  46. ASN1_IMP_SEQUENCE_OF_OPT(OSSL_IETF_ATTR_SYNTAX, policyAuthority, GENERAL_NAME, 0),
  47. ASN1_SEQUENCE_OF(OSSL_IETF_ATTR_SYNTAX, values, OSSL_IETF_ATTR_SYNTAX_VALUE),
  48. } ASN1_SEQUENCE_END(OSSL_IETF_ATTR_SYNTAX)
  49. IMPLEMENT_ASN1_ALLOC_FUNCTIONS(OSSL_IETF_ATTR_SYNTAX)
  50. IMPLEMENT_ASN1_ALLOC_FUNCTIONS(OSSL_IETF_ATTR_SYNTAX_VALUE)
  51. OSSL_IETF_ATTR_SYNTAX *d2i_OSSL_IETF_ATTR_SYNTAX (OSSL_IETF_ATTR_SYNTAX **a,
  52. const unsigned char **in,
  53. long len)
  54. {
  55. OSSL_IETF_ATTR_SYNTAX *ias;
  56. int i;
  57. ias = (OSSL_IETF_ATTR_SYNTAX *) ASN1_item_d2i((ASN1_VALUE **)a, in, len,
  58. OSSL_IETF_ATTR_SYNTAX_it());
  59. if (ias == NULL)
  60. return ias;
  61. for (i = 0; i < sk_OSSL_IETF_ATTR_SYNTAX_VALUE_num(ias->values); i++)
  62. {
  63. OSSL_IETF_ATTR_SYNTAX_VALUE *val;
  64. val = sk_OSSL_IETF_ATTR_SYNTAX_VALUE_value(ias->values, i);
  65. if (i == 0)
  66. ias->type = val->type;
  67. else if (val->type != ias->type)
  68. goto invalid_types;
  69. }
  70. return ias;
  71. invalid_types:
  72. OSSL_IETF_ATTR_SYNTAX_free(ias);
  73. if (a)
  74. *a = NULL;
  75. ERR_raise(ERR_LIB_X509V3, ERR_R_PASSED_INVALID_ARGUMENT);
  76. return NULL;
  77. }
  78. int i2d_OSSL_IETF_ATTR_SYNTAX (const OSSL_IETF_ATTR_SYNTAX *a,
  79. unsigned char **out)
  80. {
  81. return ASN1_item_i2d((const ASN1_VALUE *)a, out, OSSL_IETF_ATTR_SYNTAX_it());
  82. }
  83. int OSSL_IETF_ATTR_SYNTAX_get_value_num(const OSSL_IETF_ATTR_SYNTAX *a)
  84. {
  85. if (a->values == NULL)
  86. return 0;
  87. return sk_OSSL_IETF_ATTR_SYNTAX_VALUE_num(a->values);
  88. }
  89. const GENERAL_NAMES *
  90. OSSL_IETF_ATTR_SYNTAX_get0_policyAuthority(const OSSL_IETF_ATTR_SYNTAX *a)
  91. {
  92. return a->policyAuthority;
  93. }
  94. void OSSL_IETF_ATTR_SYNTAX_set0_policyAuthority(OSSL_IETF_ATTR_SYNTAX *a,
  95. GENERAL_NAMES *names)
  96. {
  97. GENERAL_NAMES_free(a->policyAuthority);
  98. a->policyAuthority = names;
  99. }
  100. void *OSSL_IETF_ATTR_SYNTAX_get0_value(const OSSL_IETF_ATTR_SYNTAX *a,
  101. int ind, int *type)
  102. {
  103. OSSL_IETF_ATTR_SYNTAX_VALUE *val;
  104. val = sk_OSSL_IETF_ATTR_SYNTAX_VALUE_value(a->values, ind);
  105. if (val == NULL)
  106. return NULL;
  107. if (type != NULL)
  108. *type = val->type;
  109. switch (val->type) {
  110. case OSSL_IETFAS_OCTETS:
  111. return val->u.octets;
  112. case OSSL_IETFAS_OID:
  113. return val->u.oid;
  114. case OSSL_IETFAS_STRING:
  115. return val->u.string;
  116. }
  117. return NULL;
  118. }
  119. int OSSL_IETF_ATTR_SYNTAX_add1_value(OSSL_IETF_ATTR_SYNTAX *a, int type,
  120. void *data)
  121. {
  122. OSSL_IETF_ATTR_SYNTAX_VALUE *val;
  123. if (data == NULL)
  124. return 0;
  125. if (a->values == NULL) {
  126. if ((a->values = sk_OSSL_IETF_ATTR_SYNTAX_VALUE_new_null()) == NULL)
  127. goto err;
  128. a->type = type;
  129. }
  130. if (type != a->type) {
  131. ERR_raise(ERR_LIB_X509V3, ERR_R_PASSED_INVALID_ARGUMENT);
  132. return 0;
  133. }
  134. if ((val = OSSL_IETF_ATTR_SYNTAX_VALUE_new()) == NULL)
  135. goto err;
  136. val->type = type;
  137. switch (type) {
  138. case OSSL_IETFAS_OCTETS:
  139. val->u.octets = data;
  140. break;
  141. case OSSL_IETFAS_OID:
  142. val->u.oid = data;
  143. break;
  144. case OSSL_IETFAS_STRING:
  145. val->u.string = data;
  146. break;
  147. default:
  148. OSSL_IETF_ATTR_SYNTAX_VALUE_free(val);
  149. ERR_raise(ERR_LIB_X509V3, ERR_R_PASSED_INVALID_ARGUMENT);
  150. return 0;
  151. }
  152. if (sk_OSSL_IETF_ATTR_SYNTAX_VALUE_push(a->values, val) <= 0) {
  153. OSSL_IETF_ATTR_SYNTAX_VALUE_free(val);
  154. return 0;
  155. }
  156. return 1;
  157. err:
  158. ERR_raise(ERR_LIB_X509V3, ERR_R_CRYPTO_LIB);
  159. return 0;
  160. }
  161. int OSSL_IETF_ATTR_SYNTAX_print(BIO *bp, OSSL_IETF_ATTR_SYNTAX *a, int indent)
  162. {
  163. int i;
  164. if (a->policyAuthority != NULL) {
  165. for (i = 0; i < sk_GENERAL_NAME_num(a->policyAuthority); i++) {
  166. if (BIO_printf(bp, "%*s", indent, "") <= 0)
  167. goto err;
  168. if (GENERAL_NAME_print(bp, sk_GENERAL_NAME_value(a->policyAuthority,
  169. i)) <= 0)
  170. goto err;
  171. if (BIO_printf(bp, "\n") <= 0)
  172. goto err;
  173. }
  174. }
  175. for (i = 0; i < OSSL_IETF_ATTR_SYNTAX_get_value_num(a); i++) {
  176. char oidstr[80];
  177. int ietf_type;
  178. void *attr_value = OSSL_IETF_ATTR_SYNTAX_get0_value(a, i, &ietf_type);
  179. if (attr_value == NULL)
  180. goto err;
  181. if (BIO_printf(bp, "%*s", indent, "") <= 0)
  182. goto err;
  183. switch (ietf_type) {
  184. case OSSL_IETFAS_OID:
  185. OBJ_obj2txt(oidstr, sizeof(oidstr), attr_value, 0);
  186. BIO_printf(bp, "%.*s", (int) sizeof(oidstr), oidstr);
  187. break;
  188. case OSSL_IETFAS_OCTETS:
  189. case OSSL_IETFAS_STRING:
  190. ASN1_STRING_print(bp, attr_value);
  191. break;
  192. }
  193. }
  194. if (BIO_printf(bp, "\n") <= 0)
  195. goto err;
  196. return 1;
  197. err:
  198. return 0;
  199. }