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,6 +66,10 @@
66
66
  #include <openssl/obj.h>
67
67
  #include <openssl/x509v3.h>
68
68
 
69
+ #include "internal.h"
70
+ #include "../x509/internal.h"
71
+
72
+
69
73
  static void *v2i_crld(const X509V3_EXT_METHOD *method,
70
74
  X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
71
75
  static int i2r_crldp(const X509V3_EXT_METHOD *method, void *pcrldp, BIO *out,
@@ -61,6 +61,11 @@
61
61
  #include <openssl/mem.h>
62
62
  #include <openssl/x509v3.h>
63
63
 
64
+ #include "internal.h"
65
+
66
+
67
+ typedef BIT_STRING_BITNAME ENUMERATED_NAMES;
68
+
64
69
  static const ENUMERATED_NAMES crl_reasons[] = {
65
70
  {CRL_REASON_UNSPECIFIED, "Unspecified", "unspecified"},
66
71
  {CRL_REASON_KEY_COMPROMISE, "Key Compromise", "keyCompromise"},
@@ -66,6 +66,7 @@
66
66
  #include <openssl/x509v3.h>
67
67
 
68
68
  #include "../internal.h"
69
+ #include "../x509/internal.h"
69
70
 
70
71
 
71
72
  static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method,
@@ -389,25 +390,73 @@ static int nc_dn(X509_NAME *nm, X509_NAME *base)
389
390
  return X509_V_OK;
390
391
  }
391
392
 
393
+ static int starts_with(const CBS *cbs, uint8_t c)
394
+ {
395
+ return CBS_len(cbs) > 0 && CBS_data(cbs)[0] == c;
396
+ }
397
+
398
+ static int equal_case(const CBS *a, const CBS *b)
399
+ {
400
+ if (CBS_len(a) != CBS_len(b)) {
401
+ return 0;
402
+ }
403
+ /* Note we cannot use |OPENSSL_strncasecmp| because that would stop
404
+ * iterating at NUL. */
405
+ const uint8_t *a_data = CBS_data(a), *b_data = CBS_data(b);
406
+ for (size_t i = 0; i < CBS_len(a); i++) {
407
+ if (OPENSSL_tolower(a_data[i]) != OPENSSL_tolower(b_data[i])) {
408
+ return 0;
409
+ }
410
+ }
411
+ return 1;
412
+ }
413
+
414
+ static int has_suffix_case(const CBS *a, const CBS *b)
415
+ {
416
+ if (CBS_len(a) < CBS_len(b)) {
417
+ return 0;
418
+ }
419
+ CBS copy = *a;
420
+ CBS_skip(&copy, CBS_len(a) - CBS_len(b));
421
+ return equal_case(&copy, b);
422
+ }
423
+
392
424
  static int nc_dns(ASN1_IA5STRING *dns, ASN1_IA5STRING *base)
393
425
  {
394
- char *baseptr = (char *)base->data;
395
- char *dnsptr = (char *)dns->data;
426
+ CBS dns_cbs, base_cbs;
427
+ CBS_init(&dns_cbs, dns->data, dns->length);
428
+ CBS_init(&base_cbs, base->data, base->length);
429
+
396
430
  /* Empty matches everything */
397
- if (!*baseptr)
431
+ if (CBS_len(&base_cbs) == 0) {
398
432
  return X509_V_OK;
433
+ }
434
+
435
+ /* If |base_cbs| begins with a '.', do a simple suffix comparison. This is
436
+ * not part of RFC5280, but is part of OpenSSL's original behavior. */
437
+ if (starts_with(&base_cbs, '.')) {
438
+ if (has_suffix_case(&dns_cbs, &base_cbs)) {
439
+ return X509_V_OK;
440
+ }
441
+ return X509_V_ERR_PERMITTED_VIOLATION;
442
+ }
443
+
399
444
  /*
400
445
  * Otherwise can add zero or more components on the left so compare RHS
401
446
  * and if dns is longer and expect '.' as preceding character.
402
447
  */
403
- if (dns->length > base->length) {
404
- dnsptr += dns->length - base->length;
405
- if (*baseptr != '.' && dnsptr[-1] != '.')
448
+ if (CBS_len(&dns_cbs) > CBS_len(&base_cbs)) {
449
+ uint8_t dot;
450
+ if (!CBS_skip(&dns_cbs, CBS_len(&dns_cbs) - CBS_len(&base_cbs) - 1) ||
451
+ !CBS_get_u8(&dns_cbs, &dot) ||
452
+ dot != '.') {
406
453
  return X509_V_ERR_PERMITTED_VIOLATION;
454
+ }
407
455
  }
408
456
 
409
- if (OPENSSL_strcasecmp(baseptr, dnsptr))
457
+ if (!equal_case(&dns_cbs, &base_cbs)) {
410
458
  return X509_V_ERR_PERMITTED_VIOLATION;
459
+ }
411
460
 
412
461
  return X509_V_OK;
413
462
 
@@ -415,86 +464,94 @@ static int nc_dns(ASN1_IA5STRING *dns, ASN1_IA5STRING *base)
415
464
 
416
465
  static int nc_email(ASN1_IA5STRING *eml, ASN1_IA5STRING *base)
417
466
  {
418
- const char *baseptr = (char *)base->data;
419
- const char *emlptr = (char *)eml->data;
420
-
421
- const char *baseat = strchr(baseptr, '@');
422
- const char *emlat = strchr(emlptr, '@');
423
- if (!emlat)
467
+ CBS eml_cbs, base_cbs;
468
+ CBS_init(&eml_cbs, eml->data, eml->length);
469
+ CBS_init(&base_cbs, base->data, base->length);
470
+
471
+ /* TODO(davidben): In OpenSSL 1.1.1, this switched from the first '@' to the
472
+ * last one. Match them here, or perhaps do an actual parse. Looks like
473
+ * multiple '@'s may be allowed in quoted strings. */
474
+ CBS eml_local, base_local;
475
+ if (!CBS_get_until_first(&eml_cbs, &eml_local, '@')) {
424
476
  return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
477
+ }
478
+ int base_has_at = CBS_get_until_first(&base_cbs, &base_local, '@');
479
+
425
480
  /* Special case: inital '.' is RHS match */
426
- if (!baseat && (*baseptr == '.')) {
427
- if (eml->length > base->length) {
428
- emlptr += eml->length - base->length;
429
- if (!OPENSSL_strcasecmp(baseptr, emlptr))
430
- return X509_V_OK;
481
+ if (!base_has_at && starts_with(&base_cbs, '.')) {
482
+ if (has_suffix_case(&eml_cbs, &base_cbs)) {
483
+ return X509_V_OK;
431
484
  }
432
485
  return X509_V_ERR_PERMITTED_VIOLATION;
433
486
  }
434
487
 
435
488
  /* If we have anything before '@' match local part */
436
-
437
- if (baseat) {
438
- if (baseat != baseptr) {
439
- if ((baseat - baseptr) != (emlat - emlptr))
440
- return X509_V_ERR_PERMITTED_VIOLATION;
489
+ if (base_has_at) {
490
+ /* TODO(davidben): This interprets a constraint of "@example.com" as
491
+ * "example.com", which is not part of RFC5280. */
492
+ if (CBS_len(&base_local) > 0) {
441
493
  /* Case sensitive match of local part */
442
- if (strncmp(baseptr, emlptr, emlat - emlptr))
494
+ if (!CBS_mem_equal(&base_local, CBS_data(&eml_local),
495
+ CBS_len(&eml_local))) {
443
496
  return X509_V_ERR_PERMITTED_VIOLATION;
497
+ }
444
498
  }
445
499
  /* Position base after '@' */
446
- baseptr = baseat + 1;
500
+ assert(starts_with(&base_cbs, '@'));
501
+ CBS_skip(&base_cbs, 1);
447
502
  }
448
- emlptr = emlat + 1;
503
+
449
504
  /* Just have hostname left to match: case insensitive */
450
- if (OPENSSL_strcasecmp(baseptr, emlptr))
505
+ assert(starts_with(&eml_cbs, '@'));
506
+ CBS_skip(&eml_cbs, 1);
507
+ if (!equal_case(&base_cbs, &eml_cbs)) {
451
508
  return X509_V_ERR_PERMITTED_VIOLATION;
509
+ }
452
510
 
453
511
  return X509_V_OK;
454
-
455
512
  }
456
513
 
457
514
  static int nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base)
458
515
  {
459
- const char *baseptr = (char *)base->data;
460
- const char *hostptr = (char *)uri->data;
461
- const char *p = strchr(hostptr, ':');
462
- int hostlen;
516
+ CBS uri_cbs, base_cbs;
517
+ CBS_init(&uri_cbs, uri->data, uri->length);
518
+ CBS_init(&base_cbs, base->data, base->length);
519
+
463
520
  /* Check for foo:// and skip past it */
464
- if (!p || (p[1] != '/') || (p[2] != '/'))
521
+ CBS scheme;
522
+ uint8_t byte;
523
+ if (!CBS_get_until_first(&uri_cbs, &scheme, ':') ||
524
+ !CBS_skip(&uri_cbs, 1) || // Skip the colon
525
+ !CBS_get_u8(&uri_cbs, &byte) || byte != '/' ||
526
+ !CBS_get_u8(&uri_cbs, &byte) || byte != '/') {
465
527
  return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
466
- hostptr = p + 3;
467
-
468
- /* Determine length of hostname part of URI */
469
-
470
- /* Look for a port indicator as end of hostname first */
471
-
472
- p = strchr(hostptr, ':');
473
- /* Otherwise look for trailing slash */
474
- if (!p)
475
- p = strchr(hostptr, '/');
528
+ }
476
529
 
477
- if (!p)
478
- hostlen = strlen(hostptr);
479
- else
480
- hostlen = p - hostptr;
530
+ /* Look for a port indicator as end of hostname first. Otherwise look for
531
+ * trailing slash, or the end of the string.
532
+ * TODO(davidben): This is not a correct URI parser and mishandles IPv6
533
+ * literals. */
534
+ CBS host;
535
+ if (!CBS_get_until_first(&uri_cbs, &host, ':') &&
536
+ !CBS_get_until_first(&uri_cbs, &host, '/')) {
537
+ host = uri_cbs;
538
+ }
481
539
 
482
- if (hostlen == 0)
540
+ if (CBS_len(&host) == 0) {
483
541
  return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
542
+ }
484
543
 
485
544
  /* Special case: inital '.' is RHS match */
486
- if (*baseptr == '.') {
487
- if (hostlen > base->length) {
488
- p = hostptr + hostlen - base->length;
489
- if (!OPENSSL_strncasecmp(p, baseptr, base->length))
490
- return X509_V_OK;
545
+ if (starts_with(&base_cbs, '.')) {
546
+ if (has_suffix_case(&host, &base_cbs)) {
547
+ return X509_V_OK;
491
548
  }
492
549
  return X509_V_ERR_PERMITTED_VIOLATION;
493
550
  }
494
551
 
495
- if ((base->length != (int)hostlen)
496
- || OPENSSL_strncasecmp(hostptr, baseptr, hostlen))
552
+ if (!equal_case(&base_cbs, &host)) {
497
553
  return X509_V_ERR_PERMITTED_VIOLATION;
554
+ }
498
555
 
499
556
  return X509_V_OK;
500
557
 
@@ -75,7 +75,8 @@ static int i2r_pci(X509V3_EXT_METHOD *method, PROXY_CERT_INFO_EXTENSION *pci,
75
75
  i2a_ASN1_OBJECT(out, pci->proxyPolicy->policyLanguage);
76
76
  BIO_puts(out, "\n");
77
77
  if (pci->proxyPolicy->policy && pci->proxyPolicy->policy->data)
78
- BIO_printf(out, "%*sPolicy Text: %s\n", indent, "",
78
+ BIO_printf(out, "%*sPolicy Text: %.*s\n", indent, "",
79
+ pci->proxyPolicy->policy->length,
79
80
  pci->proxyPolicy->policy->data);
80
81
  return 1;
81
82
  }
@@ -218,7 +218,6 @@ static int unknown_ext_print(BIO *out, X509_EXTENSION *ext,
218
218
  }
219
219
  }
220
220
 
221
- #ifndef OPENSSL_NO_FP_API
222
221
  int X509V3_EXT_print_fp(FILE *fp, X509_EXTENSION *ext, int flag, int indent)
223
222
  {
224
223
  BIO *bio_tmp;
@@ -229,4 +228,3 @@ int X509V3_EXT_print_fp(FILE *fp, X509_EXTENSION *ext, int flag, int indent)
229
228
  BIO_free(bio_tmp);
230
229
  return ret;
231
230
  }
232
- #endif
@@ -68,6 +68,7 @@
68
68
  #include <openssl/x509v3.h>
69
69
 
70
70
  #include "../internal.h"
71
+ #include "../x509/internal.h"
71
72
  #include "internal.h"
72
73
 
73
74
  #define V1_ROOT (EXFLAG_V1|EXFLAG_SS)
@@ -88,42 +88,69 @@ static int ipv6_hex(unsigned char *out, const char *in, int inlen);
88
88
 
89
89
  /* Add a CONF_VALUE name value pair to stack */
90
90
 
91
- int X509V3_add_value(const char *name, const char *value,
92
- STACK_OF(CONF_VALUE) **extlist)
91
+ static int x509V3_add_len_value(const char *name, const char *value,
92
+ size_t value_len, int omit_value,
93
+ STACK_OF(CONF_VALUE) **extlist)
93
94
  {
94
95
  CONF_VALUE *vtmp = NULL;
95
96
  char *tname = NULL, *tvalue = NULL;
97
+ int extlist_was_null = *extlist == NULL;
96
98
  if (name && !(tname = OPENSSL_strdup(name)))
97
- goto err;
98
- if (value && !(tvalue = OPENSSL_strdup(value)))
99
- goto err;
99
+ goto malloc_err;
100
+ if (!omit_value) {
101
+ /* |CONF_VALUE| cannot represent strings with NULs. */
102
+ if (OPENSSL_memchr(value, 0, value_len)) {
103
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_VALUE);
104
+ goto err;
105
+ }
106
+ tvalue = OPENSSL_strndup(value, value_len);
107
+ if (tvalue == NULL) {
108
+ goto malloc_err;
109
+ }
110
+ }
100
111
  if (!(vtmp = CONF_VALUE_new()))
101
- goto err;
112
+ goto malloc_err;
102
113
  if (!*extlist && !(*extlist = sk_CONF_VALUE_new_null()))
103
- goto err;
114
+ goto malloc_err;
104
115
  vtmp->section = NULL;
105
116
  vtmp->name = tname;
106
117
  vtmp->value = tvalue;
107
118
  if (!sk_CONF_VALUE_push(*extlist, vtmp))
108
- goto err;
119
+ goto malloc_err;
109
120
  return 1;
110
- err:
121
+ malloc_err:
111
122
  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
112
- if (vtmp)
113
- OPENSSL_free(vtmp);
114
- if (tname)
115
- OPENSSL_free(tname);
116
- if (tvalue)
117
- OPENSSL_free(tvalue);
123
+ err:
124
+ if (extlist_was_null) {
125
+ sk_CONF_VALUE_free(*extlist);
126
+ *extlist = NULL;
127
+ }
128
+ OPENSSL_free(vtmp);
129
+ OPENSSL_free(tname);
130
+ OPENSSL_free(tvalue);
118
131
  return 0;
119
132
  }
120
133
 
134
+ int X509V3_add_value(const char *name, const char *value,
135
+ STACK_OF(CONF_VALUE) **extlist)
136
+ {
137
+ return x509V3_add_len_value(name, value, value != NULL ? strlen(value) : 0,
138
+ /*omit_value=*/value == NULL, extlist);
139
+ }
140
+
121
141
  int X509V3_add_value_uchar(const char *name, const unsigned char *value,
122
142
  STACK_OF(CONF_VALUE) **extlist)
123
143
  {
124
144
  return X509V3_add_value(name, (const char *)value, extlist);
125
145
  }
126
146
 
147
+ int x509V3_add_value_asn1_string(const char *name, const ASN1_STRING *value,
148
+ STACK_OF(CONF_VALUE) **extlist)
149
+ {
150
+ return x509V3_add_len_value(name, (const char *)value->data, value->length,
151
+ /*omit_value=*/0, extlist);
152
+ }
153
+
127
154
  /* Free function for STACK_OF(CONF_VALUE) */
128
155
 
129
156
  void X509V3_conf_free(CONF_VALUE *conf)
@@ -268,7 +295,7 @@ ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *method, const char *value)
268
295
  return aint;
269
296
  }
270
297
 
271
- int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint,
298
+ int X509V3_add_value_int(const char *name, const ASN1_INTEGER *aint,
272
299
  STACK_OF(CONF_VALUE) **extlist)
273
300
  {
274
301
  char *strtmp;
@@ -631,27 +658,45 @@ static void str_free(OPENSSL_STRING str)
631
658
 
632
659
  static int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email)
633
660
  {
634
- char *emtmp;
635
661
  /* First some sanity checks */
636
662
  if (email->type != V_ASN1_IA5STRING)
637
663
  return 1;
638
- if (!email->data || !email->length)
664
+ if (email->data == NULL || email->length == 0)
665
+ return 1;
666
+ /* |OPENSSL_STRING| cannot represent strings with embedded NULs. Do not
667
+ * report them as outputs. */
668
+ if (OPENSSL_memchr(email->data, 0, email->length) != NULL)
639
669
  return 1;
670
+
671
+ char *emtmp = NULL;
640
672
  if (!*sk)
641
673
  *sk = sk_OPENSSL_STRING_new(sk_strcmp);
642
674
  if (!*sk)
643
- return 0;
675
+ goto err;
676
+
677
+ emtmp = OPENSSL_strndup((char *)email->data, email->length);
678
+ if (emtmp == NULL) {
679
+ goto err;
680
+ }
681
+
644
682
  /* Don't add duplicates */
645
683
  sk_OPENSSL_STRING_sort(*sk);
646
- if (sk_OPENSSL_STRING_find(*sk, NULL, (char *)email->data))
684
+ if (sk_OPENSSL_STRING_find(*sk, NULL, emtmp)) {
685
+ OPENSSL_free(emtmp);
647
686
  return 1;
648
- emtmp = OPENSSL_strdup((char *)email->data);
649
- if (!emtmp || !sk_OPENSSL_STRING_push(*sk, emtmp)) {
650
- X509_email_free(*sk);
651
- *sk = NULL;
652
- return 0;
687
+ }
688
+ if (!sk_OPENSSL_STRING_push(*sk, emtmp)) {
689
+ goto err;
653
690
  }
654
691
  return 1;
692
+
693
+ err:
694
+ /* TODO(davidben): Fix the error-handling in this file. It currently relies
695
+ * on |append_ia5| leaving |*sk| at NULL on error. */
696
+ OPENSSL_free(emtmp);
697
+ X509_email_free(*sk);
698
+ *sk = NULL;
699
+ return 0;
655
700
  }
656
701
 
657
702
  void X509_email_free(STACK_OF(OPENSSL_STRING) *sk)
@@ -1120,7 +1165,7 @@ int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags)
1120
1165
 
1121
1166
  /*
1122
1167
  * Convert IP addresses both IPv4 and IPv6 into an OCTET STRING compatible
1123
- * with RFC3280.
1168
+ * with RFC 3280.
1124
1169
  */
1125
1170
 
1126
1171
  ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc)