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
@@ -54,23 +54,27 @@
54
54
  * copied and put under another distribution licence
55
55
  * [including the GNU Public Licence.] */
56
56
 
57
- #include <openssl/x509.h>
57
+ #include <openssl/asn1.h>
58
58
 
59
+ #include <ctype.h>
59
60
  #include <inttypes.h>
60
61
  #include <string.h>
61
62
 
62
- #include <openssl/asn1.h>
63
+ #include <openssl/bio.h>
63
64
  #include <openssl/mem.h>
64
- #include <openssl/obj.h>
65
65
 
66
66
  #include "charmap.h"
67
- #include "../asn1/internal.h"
67
+ #include "internal.h"
68
68
 
69
- /*
70
- * ASN1_STRING_print_ex() and X509_NAME_print_ex(). Enhanced string and name
71
- * printing routines handling multibyte characters, RFC2253 and a host of
72
- * other options.
73
- */
69
+
70
+ // These flags must be distinct from |ESC_FLAGS| and fit in a byte.
71
+
72
+ // Character is a valid PrintableString character
73
+ #define CHARTYPE_PRINTABLESTRING 0x10
74
+ // Character needs escaping if it is the first character
75
+ #define CHARTYPE_FIRST_ESC_2253 0x20
76
+ // Character needs escaping if it is the last character
77
+ #define CHARTYPE_LAST_ESC_2253 0x40
74
78
 
75
79
  #define CHARTYPE_BS_ESC (ASN1_STRFLGS_ESC_2253 | CHARTYPE_FIRST_ESC_2253 | CHARTYPE_LAST_ESC_2253)
76
80
 
@@ -79,26 +83,12 @@
79
83
  ASN1_STRFLGS_ESC_CTRL | \
80
84
  ASN1_STRFLGS_ESC_MSB)
81
85
 
82
- static int send_bio_chars(void *arg, const void *buf, int len)
86
+ static int maybe_write(BIO *out, const void *buf, int len)
83
87
  {
84
- if (!arg)
85
- return 1;
86
- if (BIO_write(arg, buf, len) != len)
87
- return 0;
88
- return 1;
88
+ /* If |out| is NULL, ignore the output but report the length. */
89
+ return out == NULL || BIO_write(out, buf, len) == len;
89
90
  }
90
91
 
91
- static int send_fp_chars(void *arg, const void *buf, int len)
92
- {
93
- if (!arg)
94
- return 1;
95
- if (fwrite(buf, 1, len, arg) != (unsigned int)len)
96
- return 0;
97
- return 1;
98
- }
99
-
100
- typedef int char_io (void *arg, const void *buf, int len);
101
-
102
92
  /*
103
93
  * This function handles display of strings, one character at a time. It is
104
94
  * passed an unsigned long for each character because it could come from 2 or
@@ -108,20 +98,20 @@ typedef int char_io (void *arg, const void *buf, int len);
108
98
  #define HEX_SIZE(type) (sizeof(type)*2)
109
99
 
110
100
  static int do_esc_char(uint32_t c, unsigned char flags, char *do_quotes,
111
- char_io *io_ch, void *arg)
101
+ BIO *out)
112
102
  {
113
103
  unsigned char chflgs, chtmp;
114
104
  char tmphex[HEX_SIZE(uint32_t) + 3];
115
105
 
116
106
  if (c > 0xffff) {
117
107
  BIO_snprintf(tmphex, sizeof tmphex, "\\W%08" PRIX32, c);
118
- if (!io_ch(arg, tmphex, 10))
108
+ if (!maybe_write(out, tmphex, 10))
119
109
  return -1;
120
110
  return 10;
121
111
  }
122
112
  if (c > 0xff) {
123
113
  BIO_snprintf(tmphex, sizeof tmphex, "\\U%04" PRIX32, c);
124
- if (!io_ch(arg, tmphex, 6))
114
+ if (!maybe_write(out, tmphex, 6))
125
115
  return -1;
126
116
  return 6;
127
117
  }
@@ -135,19 +125,19 @@ static int do_esc_char(uint32_t c, unsigned char flags, char *do_quotes,
135
125
  if (chflgs & ASN1_STRFLGS_ESC_QUOTE) {
136
126
  if (do_quotes)
137
127
  *do_quotes = 1;
138
- if (!io_ch(arg, &chtmp, 1))
128
+ if (!maybe_write(out, &chtmp, 1))
139
129
  return -1;
140
130
  return 1;
141
131
  }
142
- if (!io_ch(arg, "\\", 1))
132
+ if (!maybe_write(out, "\\", 1))
143
133
  return -1;
144
- if (!io_ch(arg, &chtmp, 1))
134
+ if (!maybe_write(out, &chtmp, 1))
145
135
  return -1;
146
136
  return 2;
147
137
  }
148
138
  if (chflgs & (ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_ESC_MSB)) {
149
139
  BIO_snprintf(tmphex, 11, "\\%02X", chtmp);
150
- if (!io_ch(arg, tmphex, 3))
140
+ if (!maybe_write(out, tmphex, 3))
151
141
  return -1;
152
142
  return 3;
153
143
  }
@@ -156,11 +146,11 @@ static int do_esc_char(uint32_t c, unsigned char flags, char *do_quotes,
156
146
  * character itself: backslash.
157
147
  */
158
148
  if (chtmp == '\\' && flags & ESC_FLAGS) {
159
- if (!io_ch(arg, "\\\\", 2))
149
+ if (!maybe_write(out, "\\\\", 2))
160
150
  return -1;
161
151
  return 2;
162
152
  }
163
- if (!io_ch(arg, &chtmp, 1))
153
+ if (!maybe_write(out, &chtmp, 1))
164
154
  return -1;
165
155
  return 1;
166
156
  }
@@ -175,8 +165,7 @@ static int do_esc_char(uint32_t c, unsigned char flags, char *do_quotes,
175
165
  */
176
166
 
177
167
  static int do_buf(unsigned char *buf, int buflen,
178
- int type, unsigned char flags, char *quotes, char_io *io_ch,
179
- void *arg)
168
+ int type, unsigned char flags, char *quotes, BIO *out)
180
169
  {
181
170
  int i, outlen, len, charwidth;
182
171
  unsigned char orflags, *p, *q;
@@ -208,6 +197,8 @@ static int do_buf(unsigned char *buf, int buflen,
208
197
  orflags = CHARTYPE_FIRST_ESC_2253;
209
198
  else
210
199
  orflags = 0;
200
+ /* TODO(davidben): Replace this with |cbs_get_ucs2_be|, etc., to check
201
+ * for invalid codepoints. */
211
202
  switch (charwidth) {
212
203
  case 4:
213
204
  c = ((uint32_t)*p++) << 24;
@@ -248,17 +239,14 @@ static int do_buf(unsigned char *buf, int buflen,
248
239
  * otherwise each character will be > 0x7f and so the
249
240
  * character will never be escaped on first and last.
250
241
  */
251
- len =
252
- do_esc_char(utfbuf[i], (unsigned char)(flags | orflags),
253
- quotes, io_ch, arg);
242
+ len = do_esc_char(utfbuf[i], (unsigned char)(flags | orflags),
243
+ quotes, out);
254
244
  if (len < 0)
255
245
  return -1;
256
246
  outlen += len;
257
247
  }
258
248
  } else {
259
- len =
260
- do_esc_char(c, (unsigned char)(flags | orflags), quotes,
261
- io_ch, arg);
249
+ len = do_esc_char(c, (unsigned char)(flags | orflags), quotes, out);
262
250
  if (len < 0)
263
251
  return -1;
264
252
  outlen += len;
@@ -269,19 +257,18 @@ static int do_buf(unsigned char *buf, int buflen,
269
257
 
270
258
  /* This function hex dumps a buffer of characters */
271
259
 
272
- static int do_hex_dump(char_io *io_ch, void *arg, unsigned char *buf,
273
- int buflen)
260
+ static int do_hex_dump(BIO *out, unsigned char *buf, int buflen)
274
261
  {
275
262
  static const char hexdig[] = "0123456789ABCDEF";
276
263
  unsigned char *p, *q;
277
264
  char hextmp[2];
278
- if (arg) {
265
+ if (out) {
279
266
  p = buf;
280
267
  q = buf + buflen;
281
268
  while (p != q) {
282
269
  hextmp[0] = hexdig[*p >> 4];
283
270
  hextmp[1] = hexdig[*p & 0xf];
284
- if (!io_ch(arg, hextmp, 2))
271
+ if (!maybe_write(out, hextmp, 2))
285
272
  return -1;
286
273
  p++;
287
274
  }
@@ -292,41 +279,55 @@ static int do_hex_dump(char_io *io_ch, void *arg, unsigned char *buf,
292
279
  /*
293
280
  * "dump" a string. This is done when the type is unknown, or the flags
294
281
  * request it. We can either dump the content octets or the entire DER
295
- * encoding. This uses the RFC2253 #01234 format.
282
+ * encoding. This uses the RFC 2253 #01234 format.
296
283
  */
297
284
 
298
- static int do_dump(unsigned long lflags, char_io *io_ch, void *arg,
299
- const ASN1_STRING *str)
285
+ static int do_dump(unsigned long lflags, BIO *out, const ASN1_STRING *str)
300
286
  {
301
- /*
302
- * Placing the ASN1_STRING in a temp ASN1_TYPE allows the DER encoding to
303
- * readily obtained
304
- */
305
- ASN1_TYPE t;
306
- unsigned char *der_buf, *p;
307
- int outlen, der_len;
308
-
309
- if (!io_ch(arg, "#", 1))
287
+ if (!maybe_write(out, "#", 1)) {
310
288
  return -1;
289
+ }
290
+
311
291
  /* If we don't dump DER encoding just dump content octets */
312
292
  if (!(lflags & ASN1_STRFLGS_DUMP_DER)) {
313
- outlen = do_hex_dump(io_ch, arg, str->data, str->length);
314
- if (outlen < 0)
293
+ int outlen = do_hex_dump(out, str->data, str->length);
294
+ if (outlen < 0) {
315
295
  return -1;
296
+ }
316
297
  return outlen + 1;
317
298
  }
299
+
300
+ /*
301
+ * Placing the ASN1_STRING in a temporary ASN1_TYPE allows the DER encoding
302
+ * to readily obtained.
303
+ */
304
+ ASN1_TYPE t;
318
305
  t.type = str->type;
319
- t.value.ptr = (char *)str;
320
- der_len = i2d_ASN1_TYPE(&t, NULL);
321
- der_buf = OPENSSL_malloc(der_len);
322
- if (!der_buf)
306
+ /* Negative INTEGER and ENUMERATED values are the only case where
307
+ * |ASN1_STRING| and |ASN1_TYPE| types do not match.
308
+ *
309
+ * TODO(davidben): There are also some type fields which, in |ASN1_TYPE|, do
310
+ * not correspond to |ASN1_STRING|. It is unclear whether those are allowed
311
+ * in |ASN1_STRING| at all, or what the space of allowed types is.
312
+ * |ASN1_item_ex_d2i| will never produce such a value so, for now, we say
313
+ * this is an invalid input. But this corner of the library in general
314
+ * should be more robust. */
315
+ if (t.type == V_ASN1_NEG_INTEGER) {
316
+ t.type = V_ASN1_INTEGER;
317
+ } else if (t.type == V_ASN1_NEG_ENUMERATED) {
318
+ t.type = V_ASN1_ENUMERATED;
319
+ }
320
+ t.value.asn1_string = (ASN1_STRING *)str;
321
+ unsigned char *der_buf = NULL;
322
+ int der_len = i2d_ASN1_TYPE(&t, &der_buf);
323
+ if (der_len < 0) {
323
324
  return -1;
324
- p = der_buf;
325
- i2d_ASN1_TYPE(&t, &p);
326
- outlen = do_hex_dump(io_ch, arg, der_buf, der_len);
325
+ }
326
+ int outlen = do_hex_dump(out, der_buf, der_len);
327
327
  OPENSSL_free(der_buf);
328
- if (outlen < 0)
328
+ if (outlen < 0) {
329
329
  return -1;
330
+ }
330
331
  return outlen + 1;
331
332
  }
332
333
 
@@ -353,8 +354,7 @@ static const signed char tag2nbyte[] = {
353
354
  * an error occurred.
354
355
  */
355
356
 
356
- static int do_print_ex(char_io *io_ch, void *arg, unsigned long lflags,
357
- const ASN1_STRING *str)
357
+ int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long lflags)
358
358
  {
359
359
  int outlen, len;
360
360
  int type;
@@ -372,7 +372,7 @@ static int do_print_ex(char_io *io_ch, void *arg, unsigned long lflags,
372
372
  const char *tagname;
373
373
  tagname = ASN1_tag2str(type);
374
374
  outlen += strlen(tagname);
375
- if (!io_ch(arg, tagname, outlen) || !io_ch(arg, ":", 1))
375
+ if (!maybe_write(out, tagname, outlen) || !maybe_write(out, ":", 1))
376
376
  return -1;
377
377
  outlen++;
378
378
  }
@@ -396,7 +396,7 @@ static int do_print_ex(char_io *io_ch, void *arg, unsigned long lflags,
396
396
  }
397
397
 
398
398
  if (type == -1) {
399
- len = do_dump(lflags, io_ch, arg, str);
399
+ len = do_dump(lflags, out, str);
400
400
  if (len < 0)
401
401
  return -1;
402
402
  outlen += len;
@@ -415,217 +415,39 @@ static int do_print_ex(char_io *io_ch, void *arg, unsigned long lflags,
415
415
  type |= BUF_TYPE_CONVUTF8;
416
416
  }
417
417
 
418
- len = do_buf(str->data, str->length, type, flags, &quotes, io_ch, NULL);
418
+ len = do_buf(str->data, str->length, type, flags, &quotes, NULL);
419
419
  if (len < 0)
420
420
  return -1;
421
421
  outlen += len;
422
422
  if (quotes)
423
423
  outlen += 2;
424
- if (!arg)
424
+ if (!out)
425
425
  return outlen;
426
- if (quotes && !io_ch(arg, "\"", 1))
426
+ if (quotes && !maybe_write(out, "\"", 1))
427
427
  return -1;
428
- if (do_buf(str->data, str->length, type, flags, NULL, io_ch, arg) < 0)
428
+ if (do_buf(str->data, str->length, type, flags, NULL, out) < 0)
429
429
  return -1;
430
- if (quotes && !io_ch(arg, "\"", 1))
430
+ if (quotes && !maybe_write(out, "\"", 1))
431
431
  return -1;
432
432
  return outlen;
433
433
  }
434
434
 
435
- /* Used for line indenting: print 'indent' spaces */
436
-
437
- static int do_indent(char_io *io_ch, void *arg, int indent)
438
- {
439
- int i;
440
- for (i = 0; i < indent; i++)
441
- if (!io_ch(arg, " ", 1))
442
- return 0;
443
- return 1;
444
- }
445
-
446
- #define FN_WIDTH_LN 25
447
- #define FN_WIDTH_SN 10
448
-
449
- static int do_name_ex(char_io *io_ch, void *arg, const X509_NAME *n,
450
- int indent, unsigned long flags)
435
+ int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str,
436
+ unsigned long flags)
451
437
  {
452
- int i, prev = -1, orflags, cnt;
453
- int fn_opt, fn_nid;
454
- ASN1_OBJECT *fn;
455
- ASN1_STRING *val;
456
- X509_NAME_ENTRY *ent;
457
- char objtmp[80];
458
- const char *objbuf;
459
- int outlen, len;
460
- const char *sep_dn, *sep_mv, *sep_eq;
461
- int sep_dn_len, sep_mv_len, sep_eq_len;
462
- if (indent < 0)
463
- indent = 0;
464
- outlen = indent;
465
- if (!do_indent(io_ch, arg, indent))
466
- return -1;
467
- switch (flags & XN_FLAG_SEP_MASK) {
468
- case XN_FLAG_SEP_MULTILINE:
469
- sep_dn = "\n";
470
- sep_dn_len = 1;
471
- sep_mv = " + ";
472
- sep_mv_len = 3;
473
- break;
474
-
475
- case XN_FLAG_SEP_COMMA_PLUS:
476
- sep_dn = ",";
477
- sep_dn_len = 1;
478
- sep_mv = "+";
479
- sep_mv_len = 1;
480
- indent = 0;
481
- break;
482
-
483
- case XN_FLAG_SEP_CPLUS_SPC:
484
- sep_dn = ", ";
485
- sep_dn_len = 2;
486
- sep_mv = " + ";
487
- sep_mv_len = 3;
488
- indent = 0;
489
- break;
490
-
491
- case XN_FLAG_SEP_SPLUS_SPC:
492
- sep_dn = "; ";
493
- sep_dn_len = 2;
494
- sep_mv = " + ";
495
- sep_mv_len = 3;
496
- indent = 0;
497
- break;
498
-
499
- default:
500
- return -1;
501
- }
502
-
503
- if (flags & XN_FLAG_SPC_EQ) {
504
- sep_eq = " = ";
505
- sep_eq_len = 3;
506
- } else {
507
- sep_eq = "=";
508
- sep_eq_len = 1;
509
- }
510
-
511
- fn_opt = flags & XN_FLAG_FN_MASK;
512
-
513
- cnt = X509_NAME_entry_count(n);
514
- for (i = 0; i < cnt; i++) {
515
- if (flags & XN_FLAG_DN_REV)
516
- ent = X509_NAME_get_entry(n, cnt - i - 1);
517
- else
518
- ent = X509_NAME_get_entry(n, i);
519
- if (prev != -1) {
520
- if (prev == ent->set) {
521
- if (!io_ch(arg, sep_mv, sep_mv_len))
522
- return -1;
523
- outlen += sep_mv_len;
524
- } else {
525
- if (!io_ch(arg, sep_dn, sep_dn_len))
526
- return -1;
527
- outlen += sep_dn_len;
528
- if (!do_indent(io_ch, arg, indent))
529
- return -1;
530
- outlen += indent;
531
- }
532
- }
533
- prev = ent->set;
534
- fn = X509_NAME_ENTRY_get_object(ent);
535
- val = X509_NAME_ENTRY_get_data(ent);
536
- fn_nid = OBJ_obj2nid(fn);
537
- if (fn_opt != XN_FLAG_FN_NONE) {
538
- int objlen, fld_len;
539
- if ((fn_opt == XN_FLAG_FN_OID) || (fn_nid == NID_undef)) {
540
- OBJ_obj2txt(objtmp, sizeof objtmp, fn, 1);
541
- fld_len = 0; /* XXX: what should this be? */
542
- objbuf = objtmp;
543
- } else {
544
- if (fn_opt == XN_FLAG_FN_SN) {
545
- fld_len = FN_WIDTH_SN;
546
- objbuf = OBJ_nid2sn(fn_nid);
547
- } else if (fn_opt == XN_FLAG_FN_LN) {
548
- fld_len = FN_WIDTH_LN;
549
- objbuf = OBJ_nid2ln(fn_nid);
550
- } else {
551
- fld_len = 0; /* XXX: what should this be? */
552
- objbuf = "";
553
- }
554
- }
555
- objlen = strlen(objbuf);
556
- if (!io_ch(arg, objbuf, objlen))
557
- return -1;
558
- if ((objlen < fld_len) && (flags & XN_FLAG_FN_ALIGN)) {
559
- if (!do_indent(io_ch, arg, fld_len - objlen))
560
- return -1;
561
- outlen += fld_len - objlen;
562
- }
563
- if (!io_ch(arg, sep_eq, sep_eq_len))
564
- return -1;
565
- outlen += objlen + sep_eq_len;
566
- }
567
- /*
568
- * If the field name is unknown then fix up the DER dump flag. We
569
- * might want to limit this further so it will DER dump on anything
570
- * other than a few 'standard' fields.
571
- */
572
- if ((fn_nid == NID_undef) && (flags & XN_FLAG_DUMP_UNKNOWN_FIELDS))
573
- orflags = ASN1_STRFLGS_DUMP_ALL;
574
- else
575
- orflags = 0;
576
-
577
- len = do_print_ex(io_ch, arg, flags | orflags, val);
578
- if (len < 0)
438
+ BIO *bio = NULL;
439
+ if (fp != NULL) {
440
+ /* If |fp| is NULL, this function returns the number of bytes without
441
+ * writing. */
442
+ bio = BIO_new_fp(fp, BIO_NOCLOSE);
443
+ if (bio == NULL) {
579
444
  return -1;
580
- outlen += len;
581
- }
582
- return outlen;
583
- }
584
-
585
- /* Wrappers round the main functions */
586
-
587
- int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent,
588
- unsigned long flags)
589
- {
590
- if (flags == XN_FLAG_COMPAT)
591
- return X509_NAME_print(out, nm, indent);
592
- return do_name_ex(send_bio_chars, out, nm, indent, flags);
593
- }
594
-
595
- #ifndef OPENSSL_NO_FP_API
596
- int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, int indent,
597
- unsigned long flags)
598
- {
599
- if (flags == XN_FLAG_COMPAT) {
600
- BIO *btmp;
601
- int ret;
602
- btmp = BIO_new_fp(fp, BIO_NOCLOSE);
603
- if (!btmp)
604
- return -1;
605
- ret = X509_NAME_print(btmp, nm, indent);
606
- BIO_free(btmp);
607
- return ret;
445
+ }
608
446
  }
609
- return do_name_ex(send_fp_chars, fp, nm, indent, flags);
610
- }
611
- #endif
612
-
613
- int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long flags)
614
- {
615
- return do_print_ex(send_bio_chars, out, flags, str);
616
- }
617
-
618
- #ifndef OPENSSL_NO_FP_API
619
- int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str, unsigned long flags)
620
- {
621
- return do_print_ex(send_fp_chars, fp, flags, str);
447
+ int ret = ASN1_STRING_print_ex(bio, str, flags);
448
+ BIO_free(bio);
449
+ return ret;
622
450
  }
623
- #endif
624
-
625
- /*
626
- * Utility function: convert any string type to UTF8, returns number of bytes
627
- * in output string or a negative error code
628
- */
629
451
 
630
452
  int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in)
631
453
  {
@@ -643,11 +465,186 @@ int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in)
643
465
  stmp.data = NULL;
644
466
  stmp.length = 0;
645
467
  stmp.flags = 0;
646
- ret =
647
- ASN1_mbstring_copy(&str, in->data, in->length, mbflag,
648
- B_ASN1_UTF8STRING);
468
+ ret = ASN1_mbstring_copy(&str, in->data, in->length, mbflag,
469
+ B_ASN1_UTF8STRING);
649
470
  if (ret < 0)
650
471
  return ret;
651
472
  *out = stmp.data;
652
473
  return stmp.length;
653
474
  }
475
+
476
+ int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v)
477
+ {
478
+ int i, n;
479
+ char buf[80];
480
+ const char *p;
481
+
482
+ if (v == NULL)
483
+ return (0);
484
+ n = 0;
485
+ p = (const char *)v->data;
486
+ for (i = 0; i < v->length; i++) {
487
+ if ((p[i] > '~') || ((p[i] < ' ') &&
488
+ (p[i] != '\n') && (p[i] != '\r')))
489
+ buf[n] = '.';
490
+ else
491
+ buf[n] = p[i];
492
+ n++;
493
+ if (n >= 80) {
494
+ if (BIO_write(bp, buf, n) <= 0)
495
+ return (0);
496
+ n = 0;
497
+ }
498
+ }
499
+ if (n > 0)
500
+ if (BIO_write(bp, buf, n) <= 0)
501
+ return (0);
502
+ return (1);
503
+ }
504
+
505
+ int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm)
506
+ {
507
+ if (tm->type == V_ASN1_UTCTIME)
508
+ return ASN1_UTCTIME_print(bp, tm);
509
+ if (tm->type == V_ASN1_GENERALIZEDTIME)
510
+ return ASN1_GENERALIZEDTIME_print(bp, tm);
511
+ BIO_write(bp, "Bad time value", 14);
512
+ return (0);
513
+ }
514
+
515
+ static const char *const mon[12] = {
516
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
517
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
518
+ };
519
+
520
+ int ASN1_GENERALIZEDTIME_print(BIO *bp, const ASN1_GENERALIZEDTIME *tm)
521
+ {
522
+ char *v;
523
+ int gmt = 0;
524
+ int i;
525
+ int y = 0, M = 0, d = 0, h = 0, m = 0, s = 0;
526
+ char *f = NULL;
527
+ int f_len = 0;
528
+
529
+ i = tm->length;
530
+ v = (char *)tm->data;
531
+
532
+ if (i < 12)
533
+ goto err;
534
+ if (v[i - 1] == 'Z')
535
+ gmt = 1;
536
+ for (i = 0; i < 12; i++)
537
+ if ((v[i] > '9') || (v[i] < '0'))
538
+ goto err;
539
+ y = (v[0] - '0') * 1000 + (v[1] - '0') * 100 + (v[2] - '0') * 10 + (v[3] -
540
+ '0');
541
+ M = (v[4] - '0') * 10 + (v[5] - '0');
542
+ if ((M > 12) || (M < 1))
543
+ goto err;
544
+ d = (v[6] - '0') * 10 + (v[7] - '0');
545
+ h = (v[8] - '0') * 10 + (v[9] - '0');
546
+ m = (v[10] - '0') * 10 + (v[11] - '0');
547
+ if (tm->length >= 14 &&
548
+ (v[12] >= '0') && (v[12] <= '9') &&
549
+ (v[13] >= '0') && (v[13] <= '9')) {
550
+ s = (v[12] - '0') * 10 + (v[13] - '0');
551
+ /* Check for fractions of seconds. */
552
+ if (tm->length >= 15 && v[14] == '.') {
553
+ int l = tm->length;
554
+ f = &v[14]; /* The decimal point. */
555
+ f_len = 1;
556
+ while (14 + f_len < l && f[f_len] >= '0' && f[f_len] <= '9')
557
+ ++f_len;
558
+ }
559
+ }
560
+
561
+ if (BIO_printf(bp, "%s %2d %02d:%02d:%02d%.*s %d%s",
562
+ mon[M - 1], d, h, m, s, f_len, f, y,
563
+ (gmt) ? " GMT" : "") <= 0)
564
+ return (0);
565
+ else
566
+ return (1);
567
+ err:
568
+ BIO_write(bp, "Bad time value", 14);
569
+ return (0);
570
+ }
571
+
572
+ // consume_two_digits is a helper function for ASN1_UTCTIME_print. If |*v|,
573
+ // assumed to be |*len| bytes long, has two leading digits, updates |*out| with
574
+ // their value, updates |v| and |len|, and returns one. Otherwise, returns
575
+ // zero.
576
+ static int consume_two_digits(int* out, const char **v, int *len) {
577
+ if (*len < 2|| !isdigit((*v)[0]) || !isdigit((*v)[1])) {
578
+ return 0;
579
+ }
580
+ *out = ((*v)[0] - '0') * 10 + ((*v)[1] - '0');
581
+ *len -= 2;
582
+ *v += 2;
583
+ return 1;
584
+ }
585
+
586
+ // consume_zulu_timezone is a helper function for ASN1_UTCTIME_print. If |*v|,
587
+ // assumed to be |*len| bytes long, starts with "Z" then it updates |*v| and
588
+ // |*len| and returns one. Otherwise returns zero.
589
+ static int consume_zulu_timezone(const char **v, int *len) {
590
+ if (*len == 0 || (*v)[0] != 'Z') {
591
+ return 0;
592
+ }
593
+
594
+ *len -= 1;
595
+ *v += 1;
596
+ return 1;
597
+ }
598
+
599
+ int ASN1_UTCTIME_print(BIO *bp, const ASN1_UTCTIME *tm) {
600
+ const char *v = (const char *)tm->data;
601
+ int len = tm->length;
602
+ int Y = 0, M = 0, D = 0, h = 0, m = 0, s = 0;
603
+
604
+ // YYMMDDhhmm are required to be present.
605
+ if (!consume_two_digits(&Y, &v, &len) ||
606
+ !consume_two_digits(&M, &v, &len) ||
607
+ !consume_two_digits(&D, &v, &len) ||
608
+ !consume_two_digits(&h, &v, &len) ||
609
+ !consume_two_digits(&m, &v, &len)) {
610
+ goto err;
611
+ }
612
+ // https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, requires seconds
613
+ // to be present, but historically this code has forgiven its absence.
614
+ consume_two_digits(&s, &v, &len);
615
+
616
+ // https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, specifies this
617
+ // interpretation of the year.
618
+ if (Y < 50) {
619
+ Y += 2000;
620
+ } else {
621
+ Y += 1900;
622
+ }
623
+ if (M > 12 || M == 0) {
624
+ goto err;
625
+ }
626
+ if (D > 31 || D == 0) {
627
+ goto err;
628
+ }
629
+ if (h > 23 || m > 59 || s > 60) {
630
+ goto err;
631
+ }
632
+
633
+ // https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, requires the "Z"
634
+ // to be present, but historically this code has forgiven its absence.
635
+ const int is_gmt = consume_zulu_timezone(&v, &len);
636
+
637
+ // https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, does not permit
638
+ // the specification of timezones using the +hhmm / -hhmm syntax, which is
639
+ // the only other thing that might legitimately be found at the end.
640
+ if (len) {
641
+ goto err;
642
+ }
643
+
644
+ return BIO_printf(bp, "%s %2d %02d:%02d:%02d %d%s", mon[M - 1], D, h, m, s, Y,
645
+ is_gmt ? " GMT" : "") > 0;
646
+
647
+ err:
648
+ BIO_write(bp, "Bad time value", 14);
649
+ return 0;
650
+ }