grpc 1.41.0 → 1.41.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +4 -3
  3. data/etc/roots.pem +335 -326
  4. data/src/ruby/ext/grpc/extconf.rb +1 -1
  5. data/src/ruby/lib/grpc/version.rb +1 -1
  6. data/third_party/boringssl-with-bazel/err_data.c +278 -272
  7. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  8. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  9. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
  10. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
  11. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
  12. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  13. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
  14. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +6 -43
  15. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  16. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
  17. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  18. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  19. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +25 -0
  20. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
  21. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
  22. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
  23. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
  24. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
  25. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
  26. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  27. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  28. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  29. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  30. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  31. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  32. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  33. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
  34. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
  35. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
  36. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
  37. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  38. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
  39. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
  40. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +1 -1
  41. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  42. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  43. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
  44. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
  45. data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
  46. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  47. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  48. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  49. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  50. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  51. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  52. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
  53. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
  54. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  55. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  56. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
  57. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  58. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
  59. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
  60. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
  61. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
  62. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
  63. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
  64. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
  65. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
  66. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
  67. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
  68. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
  69. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
  70. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
  71. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
  72. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  73. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
  74. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
  75. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
  76. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
  77. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
  78. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
  79. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
  80. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
  81. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
  82. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  83. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  84. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
  85. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -0
  86. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
  87. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +304 -192
  88. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
  89. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -3
  90. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
  91. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  92. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
  93. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
  94. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  95. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
  96. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
  97. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
  98. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
  99. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
  100. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +26 -12
  101. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
  102. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +50 -76
  103. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +0 -131
  104. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
  105. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
  106. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
  107. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
  108. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
  109. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
  110. data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
  111. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  112. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
  113. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
  114. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -16
  115. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
  116. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
  117. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
  118. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
  119. metadata +39 -38
@@ -66,53 +66,47 @@
66
66
  #include "internal.h"
67
67
 
68
68
 
69
+ static int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out,
70
+ const ASN1_ITEM *it, int tag, int aclass,
71
+ int optional);
69
72
  static int asn1_i2d_ex_primitive(ASN1_VALUE **pval, unsigned char **out,
70
- const ASN1_ITEM *it, int tag, int aclass);
71
- static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype,
72
- const ASN1_ITEM *it);
73
+ const ASN1_ITEM *it, int tag, int aclass,
74
+ int optional);
75
+ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *out_omit,
76
+ int *putype, const ASN1_ITEM *it);
73
77
  static int asn1_set_seq_out(STACK_OF(ASN1_VALUE) *sk, unsigned char **out,
74
- int skcontlen, const ASN1_ITEM *item,
75
- int do_sort, int iclass);
78
+ int skcontlen, const ASN1_ITEM *item, int do_sort);
76
79
  static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
77
80
  const ASN1_TEMPLATE *tt, int tag, int aclass);
78
- static int asn1_item_flags_i2d(ASN1_VALUE *val, unsigned char **out,
79
- const ASN1_ITEM *it, int flags);
80
81
 
81
82
  /*
82
83
  * Top level i2d equivalents
83
84
  */
84
85
 
85
86
  int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it)
86
- {
87
- return asn1_item_flags_i2d(val, out, it, 0);
88
- }
89
-
90
- /*
91
- * Encode an ASN1 item, this is use by the standard 'i2d' function. 'out'
92
- * points to a buffer to output the data to. The new i2d has one additional
93
- * feature. If the output buffer is NULL (i.e. *out == NULL) then a buffer is
94
- * allocated and populated with the encoding.
95
- */
96
-
97
- static int asn1_item_flags_i2d(ASN1_VALUE *val, unsigned char **out,
98
- const ASN1_ITEM *it, int flags)
99
87
  {
100
88
  if (out && !*out) {
101
89
  unsigned char *p, *buf;
102
- int len;
103
- len = ASN1_item_ex_i2d(&val, NULL, it, -1, flags);
104
- if (len <= 0)
90
+ int len = ASN1_item_ex_i2d(&val, NULL, it, /*tag=*/-1, /*aclass=*/0);
91
+ if (len <= 0) {
105
92
  return len;
93
+ }
106
94
  buf = OPENSSL_malloc(len);
107
- if (!buf)
95
+ if (!buf) {
96
+ OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
108
97
  return -1;
98
+ }
109
99
  p = buf;
110
- ASN1_item_ex_i2d(&val, &p, it, -1, flags);
100
+ int len2 = ASN1_item_ex_i2d(&val, &p, it, /*tag=*/-1, /*aclass=*/0);
101
+ if (len2 <= 0) {
102
+ return len2;
103
+ }
104
+ assert(len == len2);
111
105
  *out = buf;
112
106
  return len;
113
107
  }
114
108
 
115
- return ASN1_item_ex_i2d(&val, out, it, -1, flags);
109
+ return ASN1_item_ex_i2d(&val, out, it, /*tag=*/-1, /*aclass=*/0);
116
110
  }
117
111
 
118
112
  /*
@@ -122,27 +116,48 @@ static int asn1_item_flags_i2d(ASN1_VALUE *val, unsigned char **out,
122
116
 
123
117
  int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
124
118
  const ASN1_ITEM *it, int tag, int aclass)
119
+ {
120
+ int ret = asn1_item_ex_i2d_opt(pval, out, it, tag, aclass, /*optional=*/0);
121
+ assert(ret != 0);
122
+ return ret;
123
+ }
124
+
125
+ /* asn1_item_ex_i2d_opt behaves like |ASN1_item_ex_i2d| but, if |optional| is
126
+ * non-zero and |*pval| is omitted, it returns zero and writes no bytes. */
127
+ int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out,
128
+ const ASN1_ITEM *it, int tag, int aclass,
129
+ int optional)
125
130
  {
126
131
  const ASN1_TEMPLATE *tt = NULL;
127
132
  int i, seqcontlen, seqlen;
128
- const ASN1_EXTERN_FUNCS *ef;
129
- const ASN1_AUX *aux = it->funcs;
130
- ASN1_aux_cb *asn1_cb = 0;
131
133
 
132
- if ((it->itype != ASN1_ITYPE_PRIMITIVE) && !*pval)
133
- return 0;
134
+ /* Historically, |aclass| was repurposed to pass additional flags into the
135
+ * encoding process. */
136
+ assert((aclass & ASN1_TFLG_TAG_CLASS) == aclass);
137
+ /* If not overridding the tag, |aclass| is ignored and should be zero. */
138
+ assert(tag != -1 || aclass == 0);
134
139
 
135
- if (aux && aux->asn1_cb)
136
- asn1_cb = aux->asn1_cb;
140
+ /* All fields are pointers, except for boolean |ASN1_ITYPE_PRIMITIVE|s.
141
+ * Optional primitives are handled later. */
142
+ if ((it->itype != ASN1_ITYPE_PRIMITIVE) && !*pval) {
143
+ if (optional) {
144
+ return 0;
145
+ }
146
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
147
+ return -1;
148
+ }
137
149
 
138
150
  switch (it->itype) {
139
151
 
140
152
  case ASN1_ITYPE_PRIMITIVE:
141
- if (it->templates)
142
- return asn1_template_ex_i2d(pval, out, it->templates,
143
- tag, aclass);
144
- return asn1_i2d_ex_primitive(pval, out, it, tag, aclass);
145
- break;
153
+ if (it->templates) {
154
+ if (it->templates->flags & ASN1_TFLG_OPTIONAL) {
155
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
156
+ return -1;
157
+ }
158
+ return asn1_template_ex_i2d(pval, out, it->templates, tag, aclass);
159
+ }
160
+ return asn1_i2d_ex_primitive(pval, out, it, tag, aclass, optional);
146
161
 
147
162
  case ASN1_ITYPE_MSTRING:
148
163
  /*
@@ -153,9 +168,9 @@ int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
153
168
  OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
154
169
  return -1;
155
170
  }
156
- return asn1_i2d_ex_primitive(pval, out, it, -1, aclass);
171
+ return asn1_i2d_ex_primitive(pval, out, it, -1, 0, optional);
157
172
 
158
- case ASN1_ITYPE_CHOICE:
173
+ case ASN1_ITYPE_CHOICE: {
159
174
  /*
160
175
  * It never makes sense for CHOICE types to have implicit tagging, so if
161
176
  * tag != -1, then this looks like an error in the template.
@@ -164,31 +179,39 @@ int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
164
179
  OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
165
180
  return -1;
166
181
  }
167
- if (asn1_cb && !asn1_cb(ASN1_OP_I2D_PRE, pval, it, NULL))
168
- return 0;
169
182
  i = asn1_get_choice_selector(pval, it);
170
- if ((i >= 0) && (i < it->tcount)) {
171
- ASN1_VALUE **pchval;
172
- const ASN1_TEMPLATE *chtt;
173
- chtt = it->templates + i;
174
- pchval = asn1_get_field_ptr(pval, chtt);
175
- return asn1_template_ex_i2d(pchval, out, chtt, -1, aclass);
176
- }
177
- /* Fixme: error condition if selector out of range */
178
- if (asn1_cb && !asn1_cb(ASN1_OP_I2D_POST, pval, it, NULL))
179
- return 0;
180
- break;
183
+ if (i < 0 || i >= it->tcount) {
184
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_NO_MATCHING_CHOICE_TYPE);
185
+ return -1;
186
+ }
187
+ const ASN1_TEMPLATE *chtt = it->templates + i;
188
+ if (chtt->flags & ASN1_TFLG_OPTIONAL) {
189
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
190
+ return -1;
191
+ }
192
+ ASN1_VALUE **pchval = asn1_get_field_ptr(pval, chtt);
193
+ return asn1_template_ex_i2d(pchval, out, chtt, -1, 0);
194
+ }
181
195
 
182
- case ASN1_ITYPE_EXTERN:
196
+ case ASN1_ITYPE_EXTERN: {
183
197
  /* If new style i2d it does all the work */
184
- ef = it->funcs;
185
- return ef->asn1_ex_i2d(pval, out, it, tag, aclass);
198
+ const ASN1_EXTERN_FUNCS *ef = it->funcs;
199
+ int ret = ef->asn1_ex_i2d(pval, out, it, tag, aclass);
200
+ if (ret == 0) {
201
+ /* |asn1_ex_i2d| should never return zero. We have already checked
202
+ * for optional values generically, and |ASN1_ITYPE_EXTERN| fields
203
+ * must be pointers. */
204
+ OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR);
205
+ return -1;
206
+ }
207
+ return ret;
208
+ }
186
209
 
187
- case ASN1_ITYPE_SEQUENCE:
210
+ case ASN1_ITYPE_SEQUENCE: {
188
211
  i = asn1_enc_restore(&seqcontlen, out, pval, it);
189
212
  /* An error occurred */
190
213
  if (i < 0)
191
- return 0;
214
+ return -1;
192
215
  /* We have a valid cached encoding... */
193
216
  if (i > 0)
194
217
  return seqcontlen;
@@ -197,12 +220,8 @@ int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
197
220
  /* If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL */
198
221
  if (tag == -1) {
199
222
  tag = V_ASN1_SEQUENCE;
200
- /* Retain any other flags in aclass */
201
- aclass = (aclass & ~ASN1_TFLG_TAG_CLASS)
202
- | V_ASN1_UNIVERSAL;
223
+ aclass = V_ASN1_UNIVERSAL;
203
224
  }
204
- if (asn1_cb && !asn1_cb(ASN1_OP_I2D_PRE, pval, it, NULL))
205
- return 0;
206
225
  /* First work out sequence content length */
207
226
  for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
208
227
  const ASN1_TEMPLATE *seqtt;
@@ -210,9 +229,9 @@ int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
210
229
  int tmplen;
211
230
  seqtt = asn1_do_adb(pval, tt, 1);
212
231
  if (!seqtt)
213
- return 0;
232
+ return -1;
214
233
  pseqval = asn1_get_field_ptr(pval, seqtt);
215
- tmplen = asn1_template_ex_i2d(pseqval, NULL, seqtt, -1, aclass);
234
+ tmplen = asn1_template_ex_i2d(pseqval, NULL, seqtt, -1, 0);
216
235
  if (tmplen == -1 || (tmplen > INT_MAX - seqcontlen))
217
236
  return -1;
218
237
  seqcontlen += tmplen;
@@ -228,40 +247,49 @@ int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
228
247
  ASN1_VALUE **pseqval;
229
248
  seqtt = asn1_do_adb(pval, tt, 1);
230
249
  if (!seqtt)
231
- return 0;
250
+ return -1;
232
251
  pseqval = asn1_get_field_ptr(pval, seqtt);
233
- /* FIXME: check for errors in enhanced version */
234
- asn1_template_ex_i2d(pseqval, out, seqtt, -1, aclass);
252
+ if (asn1_template_ex_i2d(pseqval, out, seqtt, -1, 0) < 0) {
253
+ return -1;
254
+ }
235
255
  }
236
- if (asn1_cb && !asn1_cb(ASN1_OP_I2D_POST, pval, it, NULL))
237
- return 0;
238
256
  return seqlen;
257
+ }
239
258
 
240
259
  default:
241
- return 0;
242
-
260
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
261
+ return -1;
243
262
  }
244
- return 0;
245
263
  }
246
264
 
265
+ /* asn1_template_ex_i2d behaves like |asn1_item_ex_i2d_opt| but uses an
266
+ * |ASN1_TEMPLATE| instead of an |ASN1_ITEM|. An |ASN1_TEMPLATE| wraps an
267
+ * |ASN1_ITEM| with modifiers such as tagging, SEQUENCE or SET, etc. Instead of
268
+ * taking an |optional| parameter, it uses the |ASN1_TFLG_OPTIONAL| flag. */
247
269
  static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
248
270
  const ASN1_TEMPLATE *tt, int tag, int iclass)
249
271
  {
250
272
  int i, ret, flags, ttag, tclass;
251
273
  size_t j;
252
274
  flags = tt->flags;
275
+
276
+ /* Historically, |iclass| was repurposed to pass additional flags into the
277
+ * encoding process. */
278
+ assert((iclass & ASN1_TFLG_TAG_CLASS) == iclass);
279
+ /* If not overridding the tag, |iclass| is ignored and should be zero. */
280
+ assert(tag != -1 || iclass == 0);
281
+
253
282
  /*
254
283
  * Work out tag and class to use: tagging may come either from the
255
284
  * template or the arguments, not both because this would create
256
- * ambiguity. Additionally the iclass argument may contain some
257
- * additional flags which should be noted and passed down to other
258
- * levels.
285
+ * ambiguity.
259
286
  */
260
287
  if (flags & ASN1_TFLG_TAG_MASK) {
261
288
  /* Error if argument and template tagging */
262
- if (tag != -1)
263
- /* FIXME: error code here */
289
+ if (tag != -1) {
290
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
264
291
  return -1;
292
+ }
265
293
  /* Get tagging from template */
266
294
  ttag = tt->tag;
267
295
  tclass = flags & ASN1_TFLG_TAG_CLASS;
@@ -273,14 +301,12 @@ static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
273
301
  ttag = -1;
274
302
  tclass = 0;
275
303
  }
276
- /*
277
- * Remove any class mask from iflag.
278
- */
279
- iclass &= ~ASN1_TFLG_TAG_CLASS;
304
+
305
+ const int optional = (flags & ASN1_TFLG_OPTIONAL) != 0;
280
306
 
281
307
  /*
282
- * At this point 'ttag' contains the outer tag to use, 'tclass' is the
283
- * class and iclass is any flags passed to this function.
308
+ * At this point 'ttag' contains the outer tag to use, and 'tclass' is the
309
+ * class.
284
310
  */
285
311
 
286
312
  if (flags & ASN1_TFLG_SK_MASK) {
@@ -290,16 +316,22 @@ static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
290
316
  int skcontlen, sklen;
291
317
  ASN1_VALUE *skitem;
292
318
 
293
- if (!*pval)
294
- return 0;
319
+ if (!*pval) {
320
+ if (optional) {
321
+ return 0;
322
+ }
323
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
324
+ return -1;
325
+ }
295
326
 
296
327
  if (flags & ASN1_TFLG_SET_OF) {
297
328
  isset = 1;
298
- /* 2 means we reorder */
299
- if (flags & ASN1_TFLG_SEQUENCE_OF)
300
- isset = 2;
301
- } else
329
+ /* Historically, types with both bits set were mutated when
330
+ * serialized to apply the sort. We no longer support this. */
331
+ assert((flags & ASN1_TFLG_SEQUENCE_OF) == 0);
332
+ } else {
302
333
  isset = 0;
334
+ }
303
335
 
304
336
  /*
305
337
  * Work out inner tag value: if EXPLICIT or no tagging use underlying
@@ -322,7 +354,7 @@ static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
322
354
  int tmplen;
323
355
  skitem = sk_ASN1_VALUE_value(sk, j);
324
356
  tmplen = ASN1_item_ex_i2d(&skitem, NULL, ASN1_ITEM_ptr(tt->item),
325
- -1, iclass);
357
+ -1, 0);
326
358
  if (tmplen == -1 || (skcontlen > INT_MAX - tmplen))
327
359
  return -1;
328
360
  skcontlen += tmplen;
@@ -346,30 +378,36 @@ static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
346
378
  /* SET or SEQUENCE and IMPLICIT tag */
347
379
  ASN1_put_object(out, /*constructed=*/1, skcontlen, sktag, skaclass);
348
380
  /* And the stuff itself */
349
- asn1_set_seq_out(sk, out, skcontlen, ASN1_ITEM_ptr(tt->item),
350
- isset, iclass);
381
+ if (!asn1_set_seq_out(sk, out, skcontlen, ASN1_ITEM_ptr(tt->item),
382
+ isset)) {
383
+ return -1;
384
+ }
351
385
  return ret;
352
386
  }
353
387
 
354
388
  if (flags & ASN1_TFLG_EXPTAG) {
355
389
  /* EXPLICIT tagging */
356
390
  /* Find length of tagged item */
357
- i = ASN1_item_ex_i2d(pval, NULL, ASN1_ITEM_ptr(tt->item), -1, iclass);
358
- if (!i)
359
- return 0;
391
+ i = asn1_item_ex_i2d_opt(pval, NULL, ASN1_ITEM_ptr(tt->item), -1, 0,
392
+ optional);
393
+ if (i <= 0)
394
+ return i;
360
395
  /* Find length of EXPLICIT tag */
361
396
  ret = ASN1_object_size(/*constructed=*/1, i, ttag);
362
397
  if (out && ret != -1) {
363
398
  /* Output tag and item */
364
399
  ASN1_put_object(out, /*constructed=*/1, i, ttag, tclass);
365
- ASN1_item_ex_i2d(pval, out, ASN1_ITEM_ptr(tt->item), -1, iclass);
400
+ if (ASN1_item_ex_i2d(pval, out, ASN1_ITEM_ptr(tt->item), -1,
401
+ 0) < 0) {
402
+ return -1;
403
+ }
366
404
  }
367
405
  return ret;
368
406
  }
369
407
 
370
- /* Either normal or IMPLICIT tagging: combine class and flags */
371
- return ASN1_item_ex_i2d(pval, out, ASN1_ITEM_ptr(tt->item),
372
- ttag, tclass | iclass);
408
+ /* Either normal or IMPLICIT tagging */
409
+ return asn1_item_ex_i2d_opt(pval, out, ASN1_ITEM_ptr(tt->item),
410
+ ttag, tclass, optional);
373
411
 
374
412
  }
375
413
 
@@ -378,7 +416,6 @@ static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
378
416
  typedef struct {
379
417
  unsigned char *data;
380
418
  int length;
381
- ASN1_VALUE *field;
382
419
  } DER_ENC;
383
420
 
384
421
  static int der_cmp(const void *a, const void *b)
@@ -392,99 +429,96 @@ static int der_cmp(const void *a, const void *b)
392
429
  return d1->length - d2->length;
393
430
  }
394
431
 
395
- /* Output the content octets of SET OF or SEQUENCE OF */
396
-
432
+ /* asn1_set_seq_out writes |sk| to |out| under the i2d output convention,
433
+ * excluding the tag and length. It returns one on success and zero on error.
434
+ * |skcontlen| must be the total encoded size. If |do_sort| is non-zero, the
435
+ * elements are sorted for a SET OF type. Each element of |sk| has type
436
+ * |item|. */
397
437
  static int asn1_set_seq_out(STACK_OF(ASN1_VALUE) *sk, unsigned char **out,
398
- int skcontlen, const ASN1_ITEM *item,
399
- int do_sort, int iclass)
438
+ int skcontlen, const ASN1_ITEM *item, int do_sort)
400
439
  {
401
- size_t i;
402
- ASN1_VALUE *skitem;
403
- unsigned char *tmpdat = NULL, *p = NULL;
404
- DER_ENC *derlst = NULL, *tder;
405
- if (do_sort) {
406
- /* Don't need to sort less than 2 items */
407
- if (sk_ASN1_VALUE_num(sk) < 2)
408
- do_sort = 0;
409
- else {
410
- derlst = OPENSSL_malloc(sk_ASN1_VALUE_num(sk)
411
- * sizeof(*derlst));
412
- if (!derlst)
413
- return 0;
414
- tmpdat = OPENSSL_malloc(skcontlen);
415
- if (!tmpdat) {
416
- OPENSSL_free(derlst);
440
+ /* No need to sort if there are fewer than two items. */
441
+ if (!do_sort || sk_ASN1_VALUE_num(sk) < 2) {
442
+ for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
443
+ ASN1_VALUE *skitem = sk_ASN1_VALUE_value(sk, i);
444
+ if (ASN1_item_ex_i2d(&skitem, out, item, -1, 0) < 0) {
417
445
  return 0;
418
446
  }
419
447
  }
420
- }
421
- /* If not sorting just output each item */
422
- if (!do_sort) {
423
- for (i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
424
- skitem = sk_ASN1_VALUE_value(sk, i);
425
- ASN1_item_ex_i2d(&skitem, out, item, -1, iclass);
426
- }
427
448
  return 1;
428
449
  }
429
- p = tmpdat;
430
-
431
- /* Doing sort: build up a list of each member's DER encoding */
432
- for (i = 0, tder = derlst; i < sk_ASN1_VALUE_num(sk); i++, tder++) {
433
- skitem = sk_ASN1_VALUE_value(sk, i);
434
- tder->data = p;
435
- tder->length = ASN1_item_ex_i2d(&skitem, &p, item, -1, iclass);
436
- tder->field = skitem;
450
+
451
+ if (sk_ASN1_VALUE_num(sk) > ((size_t)-1) / sizeof(DER_ENC)) {
452
+ OPENSSL_PUT_ERROR(ASN1, ERR_R_OVERFLOW);
453
+ return 0;
454
+ }
455
+
456
+ int ret = 0;
457
+ unsigned char *const buf = OPENSSL_malloc(skcontlen);
458
+ DER_ENC *encoded = OPENSSL_malloc(sk_ASN1_VALUE_num(sk) * sizeof(*encoded));
459
+ if (encoded == NULL || buf == NULL) {
460
+ OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
461
+ goto err;
462
+ }
463
+
464
+ /* Encode all the elements into |buf| and populate |encoded|. */
465
+ unsigned char *p = buf;
466
+ for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
467
+ ASN1_VALUE *skitem = sk_ASN1_VALUE_value(sk, i);
468
+ encoded[i].data = p;
469
+ encoded[i].length = ASN1_item_ex_i2d(&skitem, &p, item, -1, 0);
470
+ if (encoded[i].length < 0) {
471
+ goto err;
472
+ }
473
+ assert(p - buf <= skcontlen);
437
474
  }
438
475
 
439
- /* Now sort them */
440
- qsort(derlst, sk_ASN1_VALUE_num(sk), sizeof(*derlst), der_cmp);
441
- /* Output sorted DER encoding */
476
+ qsort(encoded, sk_ASN1_VALUE_num(sk), sizeof(*encoded), der_cmp);
477
+
478
+ /* Output the elements in sorted order. */
442
479
  p = *out;
443
- for (i = 0, tder = derlst; i < sk_ASN1_VALUE_num(sk); i++, tder++) {
444
- OPENSSL_memcpy(p, tder->data, tder->length);
445
- p += tder->length;
480
+ for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
481
+ OPENSSL_memcpy(p, encoded[i].data, encoded[i].length);
482
+ p += encoded[i].length;
446
483
  }
447
484
  *out = p;
448
- /* If do_sort is 2 then reorder the STACK */
449
- if (do_sort == 2) {
450
- for (i = 0, tder = derlst; i < sk_ASN1_VALUE_num(sk); i++, tder++)
451
- (void)sk_ASN1_VALUE_set(sk, i, tder->field);
452
- }
453
- OPENSSL_free(derlst);
454
- OPENSSL_free(tmpdat);
455
- return 1;
485
+
486
+ ret = 1;
487
+
488
+ err:
489
+ OPENSSL_free(encoded);
490
+ OPENSSL_free(buf);
491
+ return ret;
456
492
  }
457
493
 
494
+ /* asn1_i2d_ex_primitive behaves like |ASN1_item_ex_i2d| but |item| must be a
495
+ * a PRIMITIVE or MSTRING type that is not an |ASN1_ITEM_TEMPLATE|. */
458
496
  static int asn1_i2d_ex_primitive(ASN1_VALUE **pval, unsigned char **out,
459
- const ASN1_ITEM *it, int tag, int aclass)
497
+ const ASN1_ITEM *it, int tag, int aclass,
498
+ int optional)
460
499
  {
461
- int len;
462
- int utype;
463
- int usetag;
464
-
465
- utype = it->utype;
466
-
467
- /*
468
- * Get length of content octets and maybe find out the underlying type.
469
- */
470
-
471
- len = asn1_ex_i2c(pval, NULL, &utype, it);
500
+ /* Get length of content octets and maybe find out the underlying type. */
501
+ int omit;
502
+ int utype = it->utype;
503
+ int len = asn1_ex_i2c(pval, NULL, &omit, &utype, it);
504
+ if (len < 0) {
505
+ return -1;
506
+ }
507
+ if (omit) {
508
+ if (optional) {
509
+ return 0;
510
+ }
511
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
512
+ return -1;
513
+ }
472
514
 
473
515
  /*
474
516
  * If SEQUENCE, SET or OTHER then header is included in pseudo content
475
517
  * octets so don't include tag+length. We need to check here because the
476
518
  * call to asn1_ex_i2c() could change utype.
477
519
  */
478
- if ((utype == V_ASN1_SEQUENCE) || (utype == V_ASN1_SET) ||
479
- (utype == V_ASN1_OTHER))
480
- usetag = 0;
481
- else
482
- usetag = 1;
483
-
484
- /* -1 means omit type */
485
-
486
- if (len == -1)
487
- return 0;
520
+ int usetag = utype != V_ASN1_SEQUENCE && utype != V_ASN1_SET &&
521
+ utype != V_ASN1_OTHER;
488
522
 
489
523
  /* If not implicitly tagged get tag from underlying type */
490
524
  if (tag == -1)
@@ -492,21 +526,42 @@ static int asn1_i2d_ex_primitive(ASN1_VALUE **pval, unsigned char **out,
492
526
 
493
527
  /* Output tag+length followed by content octets */
494
528
  if (out) {
495
- if (usetag)
529
+ if (usetag) {
496
530
  ASN1_put_object(out, /*constructed=*/0, len, tag, aclass);
497
- asn1_ex_i2c(pval, *out, &utype, it);
531
+ }
532
+ int len2 = asn1_ex_i2c(pval, *out, &omit, &utype, it);
533
+ if (len2 < 0) {
534
+ return -1;
535
+ }
536
+ assert(len == len2);
537
+ assert(!omit);
498
538
  *out += len;
499
539
  }
500
540
 
501
- if (usetag)
541
+ if (usetag) {
502
542
  return ASN1_object_size(/*constructed=*/0, len, tag);
543
+ }
503
544
  return len;
504
545
  }
505
546
 
506
- /* Produce content octets from a structure */
507
-
508
- static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *putype,
509
- const ASN1_ITEM *it)
547
+ /* asn1_ex_i2c writes the |*pval| to |cout| under the i2d output convention,
548
+ * excluding the tag and length. It returns the number of bytes written,
549
+ * possibly zero, on success or -1 on error. If |*pval| should be omitted, it
550
+ * returns zero and sets |*out_omit| to true.
551
+ *
552
+ * If |it| is an MSTRING or ANY type, it gets the underlying type from |*pval|,
553
+ * which must be an |ASN1_STRING| or |ASN1_TYPE|, respectively. It then updates
554
+ * |*putype| with the tag number of type used, or |V_ASN1_OTHER| if it was not a
555
+ * universal type. If |*putype| is set to |V_ASN1_SEQUENCE|, |V_ASN1_SET|, or
556
+ * |V_ASN1_OTHER|, it additionally outputs the tag and length, so the caller
557
+ * must not do so.
558
+ *
559
+ * Otherwise, |*putype| must contain |it->utype|.
560
+ *
561
+ * WARNING: Unlike most functions in this file, |asn1_ex_i2c| can return zero
562
+ * without omitting the element. ASN.1 values may have empty contents. */
563
+ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *out_omit,
564
+ int *putype, const ASN1_ITEM *it)
510
565
  {
511
566
  ASN1_BOOLEAN *tbool = NULL;
512
567
  ASN1_STRING *strtmp;
@@ -520,23 +575,51 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *putype,
520
575
  * |ASN1_PRIMITIVE_FUNCS| table of callbacks. */
521
576
  assert(it->funcs == NULL);
522
577
 
578
+ *out_omit = 0;
579
+
523
580
  /* Should type be omitted? */
524
581
  if ((it->itype != ASN1_ITYPE_PRIMITIVE)
525
582
  || (it->utype != V_ASN1_BOOLEAN)) {
526
- if (!*pval)
527
- return -1;
583
+ if (!*pval) {
584
+ *out_omit = 1;
585
+ return 0;
586
+ }
528
587
  }
529
588
 
530
589
  if (it->itype == ASN1_ITYPE_MSTRING) {
531
590
  /* If MSTRING type set the underlying type */
532
591
  strtmp = (ASN1_STRING *)*pval;
533
592
  utype = strtmp->type;
593
+ if (utype < 0 && utype != V_ASN1_OTHER) {
594
+ /* MSTRINGs can have type -1 when default-constructed. */
595
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
596
+ return -1;
597
+ }
598
+ /* Negative INTEGER and ENUMERATED values use |ASN1_STRING| type values
599
+ * that do not match their corresponding utype values. INTEGERs cannot
600
+ * participate in MSTRING types, but ENUMERATEDs can.
601
+ *
602
+ * TODO(davidben): Is this a bug? Although arguably one of the MSTRING
603
+ * types should contain more values, rather than less. See
604
+ * https://crbug.com/boringssl/412. But it is not possible to fit all
605
+ * possible ANY values into an |ASN1_STRING|, so matching the spec here
606
+ * is somewhat hopeless. */
607
+ if (utype == V_ASN1_NEG_INTEGER) {
608
+ utype = V_ASN1_INTEGER;
609
+ } else if (utype == V_ASN1_NEG_ENUMERATED) {
610
+ utype = V_ASN1_ENUMERATED;
611
+ }
534
612
  *putype = utype;
535
613
  } else if (it->utype == V_ASN1_ANY) {
536
614
  /* If ANY set type and pointer to value */
537
615
  ASN1_TYPE *typ;
538
616
  typ = (ASN1_TYPE *)*pval;
539
617
  utype = typ->type;
618
+ if (utype < 0 && utype != V_ASN1_OTHER) {
619
+ /* |ASN1_TYPE|s can have type -1 when default-constructed. */
620
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
621
+ return -1;
622
+ }
540
623
  *putype = utype;
541
624
  pval = &typ->value.asn1_value;
542
625
  } else
@@ -547,8 +630,11 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *putype,
547
630
  otmp = (ASN1_OBJECT *)*pval;
548
631
  cont = otmp->data;
549
632
  len = otmp->length;
550
- if (cont == NULL || len == 0)
633
+ if (len == 0) {
634
+ /* Some |ASN1_OBJECT|s do not have OIDs and cannot be serialized. */
635
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT);
551
636
  return -1;
637
+ }
552
638
  break;
553
639
 
554
640
  case V_ASN1_NULL:
@@ -558,34 +644,39 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *putype,
558
644
 
559
645
  case V_ASN1_BOOLEAN:
560
646
  tbool = (ASN1_BOOLEAN *)pval;
561
- if (*tbool == -1)
562
- return -1;
647
+ if (*tbool == -1) {
648
+ *out_omit = 1;
649
+ return 0;
650
+ }
563
651
  if (it->utype != V_ASN1_ANY) {
564
652
  /*
565
653
  * Default handling if value == size field then omit
566
654
  */
567
- if (*tbool && (it->size > 0))
568
- return -1;
569
- if (!*tbool && !it->size)
570
- return -1;
655
+ if ((*tbool && (it->size > 0)) ||
656
+ (!*tbool && !it->size)) {
657
+ *out_omit = 1;
658
+ return 0;
659
+ }
571
660
  }
572
661
  c = *tbool ? 0xff : 0x00;
573
662
  cont = &c;
574
663
  len = 1;
575
664
  break;
576
665
 
577
- case V_ASN1_BIT_STRING:
578
- return i2c_ASN1_BIT_STRING((ASN1_BIT_STRING *)*pval,
579
- cout ? &cout : NULL);
580
- break;
666
+ case V_ASN1_BIT_STRING: {
667
+ int ret = i2c_ASN1_BIT_STRING((ASN1_BIT_STRING *)*pval,
668
+ cout ? &cout : NULL);
669
+ /* |i2c_ASN1_BIT_STRING| returns zero on error instead of -1. */
670
+ return ret <= 0 ? -1 : ret;
671
+ }
581
672
 
582
673
  case V_ASN1_INTEGER:
583
- case V_ASN1_ENUMERATED:
584
- /*
585
- * These are all have the same content format as ASN1_INTEGER
586
- */
587
- return i2c_ASN1_INTEGER((ASN1_INTEGER *)*pval, cout ? &cout : NULL);
588
- break;
674
+ case V_ASN1_ENUMERATED: {
675
+ /* |i2c_ASN1_INTEGER| also handles ENUMERATED. */
676
+ int ret = i2c_ASN1_INTEGER((ASN1_INTEGER *)*pval, cout ? &cout : NULL);
677
+ /* |i2c_ASN1_INTEGER| returns zero on error instead of -1. */
678
+ return ret <= 0 ? -1 : ret;
679
+ }
589
680
 
590
681
  case V_ASN1_OCTET_STRING:
591
682
  case V_ASN1_NUMERICSTRING: