@fails-components/webtransport 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/readme.md +1 -3
- package/src/http3eventloop.cc +83 -9
- package/src/http3eventloop.h +13 -3
- package/src/http3server.cc +22 -22
- package/src/http3server.h +7 -20
- package/src/http3wtstreamvisitor.cc +31 -10
- package/src/http3wtstreamvisitor.h +38 -11
- package/src/webtransport.js +91 -23
- package/test/echoserver.js +29 -5
- package/test/testsuite.js +242 -220
- package/third_party/boringssl/src/CMakeLists.txt +2 -0
- package/third_party/boringssl/src/crypto/CMakeLists.txt +1 -0
- package/third_party/boringssl/src/crypto/asn1/a_bitstr.c +174 -177
- package/third_party/boringssl/src/crypto/asn1/a_bool.c +46 -48
- package/third_party/boringssl/src/crypto/asn1/a_d2i_fp.c +21 -23
- package/third_party/boringssl/src/crypto/asn1/a_dup.c +21 -23
- package/third_party/boringssl/src/crypto/asn1/a_gentm.c +84 -187
- package/third_party/boringssl/src/crypto/asn1/a_i2d_fp.c +19 -21
- package/third_party/boringssl/src/crypto/asn1/a_int.c +305 -329
- package/third_party/boringssl/src/crypto/asn1/a_mbstr.c +190 -195
- package/third_party/boringssl/src/crypto/asn1/a_object.c +182 -189
- package/third_party/boringssl/src/crypto/asn1/a_octet.c +6 -9
- package/third_party/boringssl/src/crypto/asn1/a_print.c +15 -16
- package/third_party/boringssl/src/crypto/asn1/a_strex.c +386 -399
- package/third_party/boringssl/src/crypto/asn1/a_strnid.c +110 -131
- package/third_party/boringssl/src/crypto/asn1/a_time.c +118 -111
- package/third_party/boringssl/src/crypto/asn1/a_type.c +59 -60
- package/third_party/boringssl/src/crypto/asn1/a_utctm.c +114 -186
- package/third_party/boringssl/src/crypto/asn1/a_utf8.c +171 -159
- package/third_party/boringssl/src/crypto/asn1/asn1_lib.c +245 -260
- package/third_party/boringssl/src/crypto/asn1/asn1_par.c +41 -40
- package/third_party/boringssl/src/crypto/asn1/asn1_test.cc +31 -0
- package/third_party/boringssl/src/crypto/asn1/asn_pack.c +31 -33
- package/third_party/boringssl/src/crypto/asn1/f_int.c +36 -33
- package/third_party/boringssl/src/crypto/asn1/f_string.c +29 -26
- package/third_party/boringssl/src/crypto/asn1/internal.h +62 -61
- package/third_party/boringssl/src/crypto/asn1/tasn_dec.c +706 -702
- package/third_party/boringssl/src/crypto/asn1/tasn_enc.c +507 -524
- package/third_party/boringssl/src/crypto/asn1/tasn_fre.c +141 -133
- package/third_party/boringssl/src/crypto/asn1/tasn_new.c +207 -199
- package/third_party/boringssl/src/crypto/asn1/tasn_typ.c +19 -22
- package/third_party/boringssl/src/crypto/asn1/tasn_utl.c +24 -24
- package/third_party/boringssl/src/crypto/asn1/time_support.c +13 -13
- package/third_party/boringssl/src/crypto/bio/connect.c +9 -3
- package/third_party/boringssl/src/crypto/bytestring/bytestring_test.cc +125 -1
- package/third_party/boringssl/src/crypto/bytestring/cbb.c +4 -7
- package/third_party/boringssl/src/crypto/bytestring/cbs.c +167 -9
- package/third_party/boringssl/src/crypto/cipher_extra/e_aesctrhmac.c +0 -2
- package/third_party/boringssl/src/crypto/cipher_extra/e_aesgcmsiv.c +23 -54
- package/third_party/boringssl/src/crypto/cipher_extra/e_chacha20poly1305.c +0 -2
- package/third_party/boringssl/src/crypto/cipher_extra/e_tls.c +0 -2
- package/third_party/boringssl/src/crypto/curve25519/curve25519.c +6 -8
- package/third_party/boringssl/src/crypto/evp/evp_ctx.c +25 -22
- package/third_party/boringssl/src/crypto/evp/internal.h +15 -9
- package/third_party/boringssl/src/crypto/evp/p_dsa_asn1.c +2 -0
- package/third_party/boringssl/src/crypto/evp/p_ec_asn1.c +2 -0
- package/third_party/boringssl/src/crypto/evp/p_ed25519.c +3 -3
- package/third_party/boringssl/src/crypto/evp/p_ed25519_asn1.c +10 -7
- package/third_party/boringssl/src/crypto/evp/p_hkdf.c +241 -0
- package/third_party/boringssl/src/crypto/evp/p_rsa_asn1.c +2 -0
- package/third_party/boringssl/src/crypto/evp/p_x25519_asn1.c +1 -0
- package/third_party/boringssl/src/crypto/fipsmodule/aes/aes_nohw.c +9 -10
- package/third_party/boringssl/src/crypto/fipsmodule/aes/key_wrap.c +2 -6
- package/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.c +5 -11
- package/third_party/boringssl/src/crypto/fipsmodule/bn/internal.h +1 -1
- package/third_party/boringssl/src/crypto/fipsmodule/bn/prime.c +2 -0
- package/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.c +10 -26
- package/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aesccm.c +2 -3
- package/third_party/boringssl/src/crypto/fipsmodule/digestsign/digestsign.c +1 -0
- package/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.c +44 -43
- package/third_party/boringssl/src/crypto/fipsmodule/modes/cbc.c +5 -9
- package/third_party/boringssl/src/crypto/fipsmodule/modes/gcm.c +14 -21
- package/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg.c +8 -8
- package/third_party/boringssl/src/crypto/fipsmodule/rand/internal.h +1 -4
- package/third_party/boringssl/src/crypto/hkdf/hkdf_test.cc +104 -0
- package/third_party/boringssl/src/crypto/internal.h +18 -4
- package/third_party/boringssl/src/crypto/lhash/internal.h +13 -1
- package/third_party/boringssl/src/crypto/obj/obj_dat.h +4 -1
- package/third_party/boringssl/src/crypto/obj/obj_mac.num +1 -0
- package/third_party/boringssl/src/crypto/obj/objects.txt +2 -0
- package/third_party/boringssl/src/crypto/pem/pem_all.c +77 -86
- package/third_party/boringssl/src/crypto/pem/pem_info.c +221 -233
- package/third_party/boringssl/src/crypto/pem/pem_lib.c +639 -608
- package/third_party/boringssl/src/crypto/pem/pem_oth.c +17 -16
- package/third_party/boringssl/src/crypto/pem/pem_pk8.c +133 -142
- package/third_party/boringssl/src/crypto/pem/pem_pkey.c +96 -92
- package/third_party/boringssl/src/crypto/poly1305/poly1305_vec.c +12 -28
- package/third_party/boringssl/src/crypto/siphash/siphash.c +8 -11
- package/third_party/boringssl/src/crypto/siphash/siphash_test.cc +5 -7
- package/third_party/boringssl/src/crypto/stack/stack.c +33 -16
- package/third_party/boringssl/src/crypto/thread_pthread.c +0 -2
- package/third_party/boringssl/src/crypto/thread_win.c +0 -2
- package/third_party/boringssl/src/crypto/trust_token/internal.h +14 -0
- package/third_party/boringssl/src/crypto/trust_token/pmbtoken.c +127 -30
- package/third_party/boringssl/src/crypto/trust_token/trust_token.c +40 -0
- package/third_party/boringssl/src/crypto/trust_token/trust_token_test.cc +165 -0
- package/third_party/boringssl/src/crypto/trust_token/voprf.c +55 -6
- package/third_party/boringssl/src/crypto/x509/a_digest.c +23 -24
- package/third_party/boringssl/src/crypto/x509/a_sign.c +52 -55
- package/third_party/boringssl/src/crypto/x509/a_verify.c +33 -34
- package/third_party/boringssl/src/crypto/x509/algorithm.c +17 -18
- package/third_party/boringssl/src/crypto/x509/asn1_gen.c +618 -612
- package/third_party/boringssl/src/crypto/x509/by_dir.c +320 -337
- package/third_party/boringssl/src/crypto/x509/by_file.c +186 -186
- package/third_party/boringssl/src/crypto/x509/i2d_pr.c +11 -14
- package/third_party/boringssl/src/crypto/x509/internal.h +22 -22
- package/third_party/boringssl/src/crypto/x509/name_print.c +155 -150
- package/third_party/boringssl/src/crypto/x509/rsa_pss.c +27 -29
- package/third_party/boringssl/src/crypto/x509/t_crl.c +67 -70
- package/third_party/boringssl/src/crypto/x509/t_req.c +3 -5
- package/third_party/boringssl/src/crypto/x509/t_x509.c +280 -251
- package/third_party/boringssl/src/crypto/x509/t_x509a.c +52 -47
- package/third_party/boringssl/src/crypto/x509/x509.c +3 -4
- package/third_party/boringssl/src/crypto/x509/x509_att.c +234 -223
- package/third_party/boringssl/src/crypto/x509/x509_cmp.c +286 -296
- package/third_party/boringssl/src/crypto/x509/x509_d2.c +37 -32
- package/third_party/boringssl/src/crypto/x509/x509_def.c +14 -30
- package/third_party/boringssl/src/crypto/x509/x509_ext.c +55 -84
- package/third_party/boringssl/src/crypto/x509/x509_lu.c +545 -581
- package/third_party/boringssl/src/crypto/x509/x509_obj.c +131 -121
- package/third_party/boringssl/src/crypto/x509/x509_req.c +120 -139
- package/third_party/boringssl/src/crypto/x509/x509_set.c +128 -142
- package/third_party/boringssl/src/crypto/x509/x509_trs.c +185 -193
- package/third_party/boringssl/src/crypto/x509/x509_txt.c +70 -72
- package/third_party/boringssl/src/crypto/x509/x509_v3.c +172 -161
- package/third_party/boringssl/src/crypto/x509/x509_vfy.c +2041 -2053
- package/third_party/boringssl/src/crypto/x509/x509_vpm.c +441 -461
- package/third_party/boringssl/src/crypto/x509/x509cset.c +152 -170
- package/third_party/boringssl/src/crypto/x509/x509name.c +274 -260
- package/third_party/boringssl/src/crypto/x509/x509rset.c +43 -20
- package/third_party/boringssl/src/crypto/x509/x509spki.c +62 -63
- package/third_party/boringssl/src/crypto/x509/x_algor.c +64 -62
- package/third_party/boringssl/src/crypto/x509/x_all.c +103 -133
- package/third_party/boringssl/src/crypto/x509/x_attrib.c +23 -24
- package/third_party/boringssl/src/crypto/x509/x_crl.c +310 -321
- package/third_party/boringssl/src/crypto/x509/x_exten.c +6 -5
- package/third_party/boringssl/src/crypto/x509/x_info.c +31 -28
- package/third_party/boringssl/src/crypto/x509/x_name.c +361 -365
- package/third_party/boringssl/src/crypto/x509/x_pkey.c +38 -32
- package/third_party/boringssl/src/crypto/x509/x_pubkey.c +114 -117
- package/third_party/boringssl/src/crypto/x509/x_req.c +27 -29
- package/third_party/boringssl/src/crypto/x509/x_sig.c +2 -2
- package/third_party/boringssl/src/crypto/x509/x_spki.c +8 -10
- package/third_party/boringssl/src/crypto/x509/x_val.c +2 -2
- package/third_party/boringssl/src/crypto/x509/x_x509.c +212 -226
- package/third_party/boringssl/src/crypto/x509/x_x509a.c +112 -109
- package/third_party/boringssl/src/crypto/x509v3/ext_dat.h +10 -13
- package/third_party/boringssl/src/crypto/x509v3/internal.h +72 -87
- package/third_party/boringssl/src/crypto/x509v3/pcy_cache.c +184 -176
- package/third_party/boringssl/src/crypto/x509v3/pcy_data.c +58 -56
- package/third_party/boringssl/src/crypto/x509v3/pcy_lib.c +71 -70
- package/third_party/boringssl/src/crypto/x509v3/pcy_map.c +56 -58
- package/third_party/boringssl/src/crypto/x509v3/pcy_node.c +89 -91
- package/third_party/boringssl/src/crypto/x509v3/pcy_tree.c +585 -590
- package/third_party/boringssl/src/crypto/x509v3/v3_akey.c +118 -112
- package/third_party/boringssl/src/crypto/x509v3/v3_akeya.c +3 -3
- package/third_party/boringssl/src/crypto/x509v3/v3_alt.c +447 -451
- package/third_party/boringssl/src/crypto/x509v3/v3_bcons.c +44 -38
- package/third_party/boringssl/src/crypto/x509v3/v3_bitst.c +39 -43
- package/third_party/boringssl/src/crypto/x509v3/v3_conf.c +321 -320
- package/third_party/boringssl/src/crypto/x509v3/v3_cpols.c +352 -327
- package/third_party/boringssl/src/crypto/x509v3/v3_crld.c +437 -383
- package/third_party/boringssl/src/crypto/x509v3/v3_enum.c +23 -16
- package/third_party/boringssl/src/crypto/x509v3/v3_extku.c +62 -53
- package/third_party/boringssl/src/crypto/x509v3/v3_genn.c +118 -115
- package/third_party/boringssl/src/crypto/x509v3/v3_ia5.c +30 -31
- package/third_party/boringssl/src/crypto/x509v3/v3_info.c +112 -98
- package/third_party/boringssl/src/crypto/x509v3/v3_int.c +40 -15
- package/third_party/boringssl/src/crypto/x509v3/v3_lib.c +248 -252
- package/third_party/boringssl/src/crypto/x509v3/v3_ncons.c +390 -386
- package/third_party/boringssl/src/crypto/x509v3/v3_ocsp.c +45 -32
- package/third_party/boringssl/src/crypto/x509v3/v3_pci.c +206 -209
- package/third_party/boringssl/src/crypto/x509v3/v3_pcia.c +6 -8
- package/third_party/boringssl/src/crypto/x509v3/v3_pcons.c +54 -50
- package/third_party/boringssl/src/crypto/x509v3/v3_pmaps.c +66 -65
- package/third_party/boringssl/src/crypto/x509v3/v3_prn.c +144 -133
- package/third_party/boringssl/src/crypto/x509v3/v3_purp.c +695 -709
- package/third_party/boringssl/src/crypto/x509v3/v3_skey.c +75 -69
- package/third_party/boringssl/src/crypto/x509v3/v3_utl.c +1102 -1082
- package/third_party/boringssl/src/include/openssl/base.h +3 -1
- package/third_party/boringssl/src/include/openssl/bn.h +3 -0
- package/third_party/boringssl/src/include/openssl/bytestring.h +20 -0
- package/third_party/boringssl/src/include/openssl/evp.h +6 -5
- package/third_party/boringssl/src/include/openssl/kdf.h +91 -0
- package/third_party/boringssl/src/include/openssl/nid.h +4 -0
- package/third_party/boringssl/src/include/openssl/ssl.h +6 -1
- package/third_party/boringssl/src/include/openssl/stack.h +47 -32
- package/third_party/boringssl/src/include/openssl/trust_token.h +18 -3
- package/third_party/boringssl/src/include/openssl/x509.h +18 -0
- package/third_party/boringssl/src/ssl/ssl_file.cc +61 -99
- package/third_party/boringssl/src/ssl/ssl_test.cc +101 -0
- package/third_party/boringssl/src/util/doc.config +2 -1
- package/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go +8 -0
- package/third_party/googleurl/AUTHORS +16 -2
- package/third_party/googleurl/base/BUILD +1 -0
- package/third_party/googleurl/base/compiler_specific.h +16 -17
- package/third_party/googleurl/base/containers/contiguous_iterator.h +13 -9
- package/third_party/googleurl/base/containers/span.h +23 -8
- package/third_party/googleurl/base/memory/raw_ptr.h +17 -25
- package/third_party/googleurl/base/memory/raw_ptr_exclusion.h +21 -0
- package/third_party/googleurl/base/strings/escape.cc +14 -2
- package/third_party/googleurl/base/strings/safe_sprintf.h +1 -1
- package/third_party/googleurl/base/strings/string_number_conversions.cc +5 -3
- package/third_party/googleurl/base/strings/string_number_conversions_internal.h +5 -5
- package/third_party/googleurl/base/strings/string_piece.h +3 -3
- package/third_party/googleurl/base/strings/string_util.cc +4 -27
- package/third_party/googleurl/base/strings/string_util.h +43 -8
- package/third_party/googleurl/base/strings/string_util_internal.h +11 -12
- package/third_party/googleurl/base/strings/string_util_unittest.cc +33 -0
- package/third_party/googleurl/base/strings/string_util_win.cc +0 -5
- package/third_party/googleurl/base/strings/string_util_win.h +9 -1
- package/third_party/googleurl/base/strings/utf_offset_string_conversions.cc +1 -1
- package/third_party/googleurl/base/strings/utf_string_conversion_utils.cc +5 -8
- package/third_party/googleurl/base/strings/utf_string_conversion_utils.h +13 -10
- package/third_party/googleurl/base/strings/utf_string_conversions.cc +32 -25
- package/third_party/googleurl/base/template_util.h +23 -35
- package/third_party/googleurl/build/build_config.h +14 -3
- package/third_party/googleurl/copy.bara.sky +1 -1
- package/third_party/googleurl/url/gurl.cc +8 -4
- package/third_party/googleurl/url/gurl.h +1 -0
- package/third_party/googleurl/url/gurl_unittest.cc +1 -0
- package/third_party/googleurl/url/origin.h +36 -26
- package/third_party/googleurl/url/scheme_host_port.h +4 -1
- package/third_party/googleurl/url/url_canon.h +2 -1
- package/third_party/googleurl/url/url_canon_internal.cc +9 -7
- package/third_party/googleurl/url/url_canon_internal.h +16 -16
- package/third_party/googleurl/url/url_canon_stdstring.h +2 -1
- package/third_party/googleurl/url/url_util.cc +9 -8
- package/third_party/quiche/build/source_list.bzl +7 -0
- package/third_party/quiche/build/source_list.gni +7 -0
- package/third_party/quiche/build/source_list.json +7 -0
- package/third_party/quiche/quiche/common/platform/api/quiche_mem_slice.h +7 -3
- package/third_party/quiche/quiche/http2/adapter/nghttp2_adapter_test.cc +86 -2
- package/third_party/quiche/quiche/http2/adapter/oghttp2_adapter_test.cc +104 -2
- package/third_party/quiche/quiche/http2/adapter/oghttp2_session.cc +23 -0
- package/third_party/quiche/quiche/http2/adapter/oghttp2_session.h +6 -1
- package/third_party/quiche/quiche/quic/core/congestion_control/send_algorithm_test.cc +0 -16
- package/third_party/quiche/quiche/quic/core/crypto/crypto_protocol.h +1 -1
- package/third_party/quiche/quiche/quic/core/http/end_to_end_test.cc +56 -2
- package/third_party/quiche/quiche/quic/core/http/http_constants.cc +1 -0
- package/third_party/quiche/quiche/quic/core/http/http_constants.h +1 -0
- package/third_party/quiche/quiche/quic/core/http/http_encoder.cc +28 -17
- package/third_party/quiche/quiche/quic/core/http/http_encoder.h +5 -0
- package/third_party/quiche/quiche/quic/core/http/http_encoder_test.cc +26 -30
- package/third_party/quiche/quiche/quic/core/http/http_frames.h +1 -0
- package/third_party/quiche/quiche/quic/core/http/quic_server_session_base.cc +4 -4
- package/third_party/quiche/quiche/quic/core/http/quic_server_session_base_test.cc +1 -1
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_client_session.cc +5 -1
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream.cc +6 -33
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream.h +0 -17
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream_test.cc +5 -20
- package/third_party/quiche/quiche/quic/core/io/quic_event_loop.h +81 -0
- package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop.cc +265 -0
- package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop.h +152 -0
- package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop_test.cc +341 -0
- package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store.cc +3 -1
- package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store.h +7 -7
- package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store_test.cc +4 -3
- package/third_party/quiche/quiche/quic/core/quic_connection.cc +69 -19
- package/third_party/quiche/quiche/quic/core/quic_connection.h +9 -3
- package/third_party/quiche/quiche/quic/core/quic_connection_id_manager.cc +29 -10
- package/third_party/quiche/quiche/quic/core/quic_connection_id_manager.h +5 -3
- package/third_party/quiche/quiche/quic/core/quic_connection_id_manager_test.cc +85 -22
- package/third_party/quiche/quiche/quic/core/quic_connection_test.cc +186 -30
- package/third_party/quiche/quiche/quic/core/quic_crypto_stream.cc +2 -1
- package/third_party/quiche/quiche/quic/core/quic_default_clock.cc +31 -0
- package/third_party/quiche/quiche/quic/core/quic_default_clock.h +34 -0
- package/third_party/quiche/quiche/quic/core/quic_default_connection_helper.h +49 -0
- package/third_party/quiche/quiche/quic/core/quic_dispatcher.cc +53 -37
- package/third_party/quiche/quiche/quic/core/quic_dispatcher.h +19 -11
- package/third_party/quiche/quiche/quic/core/quic_dispatcher_test.cc +15 -2
- package/third_party/quiche/quiche/quic/core/quic_flags_list.h +10 -4
- package/third_party/quiche/quiche/quic/core/quic_idle_network_detector.cc +2 -2
- package/third_party/quiche/quiche/quic/core/quic_idle_network_detector_test.cc +4 -4
- package/third_party/quiche/quiche/quic/core/quic_packet_creator.cc +14 -3
- package/third_party/quiche/quiche/quic/core/quic_packet_creator_test.cc +145 -2
- package/third_party/quiche/quiche/quic/core/quic_packets.cc +3 -1
- package/third_party/quiche/quiche/quic/core/quic_packets.h +4 -0
- package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager.cc +13 -11
- package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager.h +9 -0
- package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager_test.cc +6 -0
- package/third_party/quiche/quiche/quic/core/quic_session.cc +3 -2
- package/third_party/quiche/quiche/quic/core/quic_session.h +8 -3
- package/third_party/quiche/quiche/quic/core/quic_types.cc +18 -0
- package/third_party/quiche/quiche/quic/core/quic_types.h +3 -0
- package/third_party/quiche/quiche/quic/core/tls_chlo_extractor.cc +3 -0
- package/third_party/quiche/quiche/quic/core/tls_chlo_extractor.h +10 -0
- package/third_party/quiche/quiche/quic/test_tools/mock_quic_session_visitor.h +1 -1
- package/third_party/quiche/quiche/quic/test_tools/quic_test_utils.h +1 -1
- package/third_party/quiche/quiche/quic/test_tools/server_thread.cc +3 -2
- package/third_party/quiche/quiche/quic/test_tools/simple_session_notifier.cc +7 -1
- package/third_party/quiche/quiche/quic/test_tools/simple_session_notifier.h +3 -0
- package/third_party/quiche/quiche/quic/test_tools/simulator/quic_endpoint.h +4 -2
- package/certs/ca.cnf +0 -69
- package/certs/generate_certs.sh +0 -53
- package/certs/generate_certs_leaf.sh +0 -53
- package/certs/leaf.cnf +0 -24
- package/certs/readme.txt +0 -2
- package/third_party/quiche/build/BUILD.bazel +0 -7
|
@@ -70,8 +70,7 @@
|
|
|
70
70
|
|
|
71
71
|
|
|
72
72
|
static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method,
|
|
73
|
-
X509V3_CTX *ctx,
|
|
74
|
-
STACK_OF(CONF_VALUE) *nval);
|
|
73
|
+
X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
|
|
75
74
|
static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a,
|
|
76
75
|
BIO *bp, int ind);
|
|
77
76
|
static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method,
|
|
@@ -87,26 +86,33 @@ static int nc_email(ASN1_IA5STRING *sub, ASN1_IA5STRING *eml);
|
|
|
87
86
|
static int nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base);
|
|
88
87
|
|
|
89
88
|
const X509V3_EXT_METHOD v3_name_constraints = {
|
|
90
|
-
NID_name_constraints,
|
|
89
|
+
NID_name_constraints,
|
|
90
|
+
0,
|
|
91
91
|
ASN1_ITEM_ref(NAME_CONSTRAINTS),
|
|
92
|
-
0,
|
|
93
|
-
0,
|
|
94
|
-
0,
|
|
95
|
-
|
|
92
|
+
0,
|
|
93
|
+
0,
|
|
94
|
+
0,
|
|
95
|
+
0,
|
|
96
|
+
0,
|
|
97
|
+
0,
|
|
98
|
+
0,
|
|
99
|
+
v2i_NAME_CONSTRAINTS,
|
|
100
|
+
i2r_NAME_CONSTRAINTS,
|
|
101
|
+
0,
|
|
96
102
|
NULL,
|
|
97
103
|
};
|
|
98
104
|
|
|
99
105
|
ASN1_SEQUENCE(GENERAL_SUBTREE) = {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
106
|
+
ASN1_SIMPLE(GENERAL_SUBTREE, base, GENERAL_NAME),
|
|
107
|
+
ASN1_IMP_OPT(GENERAL_SUBTREE, minimum, ASN1_INTEGER, 0),
|
|
108
|
+
ASN1_IMP_OPT(GENERAL_SUBTREE, maximum, ASN1_INTEGER, 1),
|
|
103
109
|
} ASN1_SEQUENCE_END(GENERAL_SUBTREE)
|
|
104
110
|
|
|
105
111
|
ASN1_SEQUENCE(NAME_CONSTRAINTS) = {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
112
|
+
ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, permittedSubtrees,
|
|
113
|
+
GENERAL_SUBTREE, 0),
|
|
114
|
+
ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, excludedSubtrees,
|
|
115
|
+
GENERAL_SUBTREE, 1),
|
|
110
116
|
} ASN1_SEQUENCE_END(NAME_CONSTRAINTS)
|
|
111
117
|
|
|
112
118
|
|
|
@@ -114,446 +120,444 @@ IMPLEMENT_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE)
|
|
|
114
120
|
IMPLEMENT_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS)
|
|
115
121
|
|
|
116
122
|
static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method,
|
|
117
|
-
X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
tval.value = val->value;
|
|
140
|
-
sub = GENERAL_SUBTREE_new();
|
|
141
|
-
if (!v2i_GENERAL_NAME_ex(sub->base, method, ctx, &tval, 1))
|
|
142
|
-
goto err;
|
|
143
|
-
if (!*ptree)
|
|
144
|
-
*ptree = sk_GENERAL_SUBTREE_new_null();
|
|
145
|
-
if (!*ptree || !sk_GENERAL_SUBTREE_push(*ptree, sub))
|
|
146
|
-
goto memerr;
|
|
147
|
-
sub = NULL;
|
|
123
|
+
X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) {
|
|
124
|
+
size_t i;
|
|
125
|
+
CONF_VALUE tval, *val;
|
|
126
|
+
STACK_OF(GENERAL_SUBTREE) **ptree = NULL;
|
|
127
|
+
NAME_CONSTRAINTS *ncons = NULL;
|
|
128
|
+
GENERAL_SUBTREE *sub = NULL;
|
|
129
|
+
ncons = NAME_CONSTRAINTS_new();
|
|
130
|
+
if (!ncons) {
|
|
131
|
+
goto memerr;
|
|
132
|
+
}
|
|
133
|
+
for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
|
|
134
|
+
val = sk_CONF_VALUE_value(nval, i);
|
|
135
|
+
if (!strncmp(val->name, "permitted", 9) && val->name[9]) {
|
|
136
|
+
ptree = &ncons->permittedSubtrees;
|
|
137
|
+
tval.name = val->name + 10;
|
|
138
|
+
} else if (!strncmp(val->name, "excluded", 8) && val->name[8]) {
|
|
139
|
+
ptree = &ncons->excludedSubtrees;
|
|
140
|
+
tval.name = val->name + 9;
|
|
141
|
+
} else {
|
|
142
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SYNTAX);
|
|
143
|
+
goto err;
|
|
148
144
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
if (sub)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
145
|
+
tval.value = val->value;
|
|
146
|
+
sub = GENERAL_SUBTREE_new();
|
|
147
|
+
if (!v2i_GENERAL_NAME_ex(sub->base, method, ctx, &tval, 1)) {
|
|
148
|
+
goto err;
|
|
149
|
+
}
|
|
150
|
+
if (!*ptree) {
|
|
151
|
+
*ptree = sk_GENERAL_SUBTREE_new_null();
|
|
152
|
+
}
|
|
153
|
+
if (!*ptree || !sk_GENERAL_SUBTREE_push(*ptree, sub)) {
|
|
154
|
+
goto memerr;
|
|
155
|
+
}
|
|
156
|
+
sub = NULL;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return ncons;
|
|
160
|
+
|
|
161
|
+
memerr:
|
|
162
|
+
OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
|
|
163
|
+
err:
|
|
164
|
+
if (ncons) {
|
|
165
|
+
NAME_CONSTRAINTS_free(ncons);
|
|
166
|
+
}
|
|
167
|
+
if (sub) {
|
|
168
|
+
GENERAL_SUBTREE_free(sub);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return NULL;
|
|
161
172
|
}
|
|
162
173
|
|
|
163
174
|
static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a,
|
|
164
|
-
BIO *bp, int ind)
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
bp, ind, "Excluded");
|
|
171
|
-
return 1;
|
|
175
|
+
BIO *bp, int ind) {
|
|
176
|
+
NAME_CONSTRAINTS *ncons = a;
|
|
177
|
+
do_i2r_name_constraints(method, ncons->permittedSubtrees, bp, ind,
|
|
178
|
+
"Permitted");
|
|
179
|
+
do_i2r_name_constraints(method, ncons->excludedSubtrees, bp, ind, "Excluded");
|
|
180
|
+
return 1;
|
|
172
181
|
}
|
|
173
182
|
|
|
174
183
|
static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method,
|
|
175
|
-
STACK_OF(GENERAL_SUBTREE) *trees,
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
BIO_puts(bp, "\n");
|
|
184
|
+
STACK_OF(GENERAL_SUBTREE) *trees, BIO *bp,
|
|
185
|
+
int ind, const char *name) {
|
|
186
|
+
GENERAL_SUBTREE *tree;
|
|
187
|
+
size_t i;
|
|
188
|
+
if (sk_GENERAL_SUBTREE_num(trees) > 0) {
|
|
189
|
+
BIO_printf(bp, "%*s%s:\n", ind, "", name);
|
|
190
|
+
}
|
|
191
|
+
for (i = 0; i < sk_GENERAL_SUBTREE_num(trees); i++) {
|
|
192
|
+
tree = sk_GENERAL_SUBTREE_value(trees, i);
|
|
193
|
+
BIO_printf(bp, "%*s", ind + 2, "");
|
|
194
|
+
if (tree->base->type == GEN_IPADD) {
|
|
195
|
+
print_nc_ipadd(bp, tree->base->d.ip);
|
|
196
|
+
} else {
|
|
197
|
+
GENERAL_NAME_print(bp, tree->base);
|
|
190
198
|
}
|
|
191
|
-
|
|
199
|
+
BIO_puts(bp, "\n");
|
|
200
|
+
}
|
|
201
|
+
return 1;
|
|
192
202
|
}
|
|
193
203
|
|
|
194
|
-
static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip)
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
204
|
+
static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip) {
|
|
205
|
+
int i, len;
|
|
206
|
+
unsigned char *p;
|
|
207
|
+
p = ip->data;
|
|
208
|
+
len = ip->length;
|
|
209
|
+
BIO_puts(bp, "IP:");
|
|
210
|
+
if (len == 8) {
|
|
211
|
+
BIO_printf(bp, "%d.%d.%d.%d/%d.%d.%d.%d", p[0], p[1], p[2], p[3], p[4],
|
|
212
|
+
p[5], p[6], p[7]);
|
|
213
|
+
} else if (len == 32) {
|
|
214
|
+
for (i = 0; i < 16; i++) {
|
|
215
|
+
uint16_t v = ((uint16_t)p[0] << 8) | p[1];
|
|
216
|
+
BIO_printf(bp, "%X", v);
|
|
217
|
+
p += 2;
|
|
218
|
+
if (i == 7) {
|
|
219
|
+
BIO_puts(bp, "/");
|
|
220
|
+
} else if (i != 15) {
|
|
221
|
+
BIO_puts(bp, ":");
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
} else {
|
|
225
|
+
BIO_printf(bp, "IP Address:<invalid>");
|
|
226
|
+
}
|
|
227
|
+
return 1;
|
|
217
228
|
}
|
|
218
229
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
int
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
230
|
+
//-
|
|
231
|
+
// Check a certificate conforms to a specified set of constraints.
|
|
232
|
+
// Return values:
|
|
233
|
+
// X509_V_OK: All constraints obeyed.
|
|
234
|
+
// X509_V_ERR_PERMITTED_VIOLATION: Permitted subtree violation.
|
|
235
|
+
// X509_V_ERR_EXCLUDED_VIOLATION: Excluded subtree violation.
|
|
236
|
+
// X509_V_ERR_SUBTREE_MINMAX: Min or max values present and matching type.
|
|
237
|
+
// X509_V_ERR_UNSPECIFIED: Unspecified error.
|
|
238
|
+
// X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE: Unsupported constraint type.
|
|
239
|
+
// X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX: Bad or unsupported constraint
|
|
240
|
+
// syntax.
|
|
241
|
+
// X509_V_ERR_UNSUPPORTED_NAME_SYNTAX: Bad or unsupported syntax of name.
|
|
242
|
+
|
|
243
|
+
int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) {
|
|
244
|
+
int r, i;
|
|
245
|
+
size_t j;
|
|
246
|
+
X509_NAME *nm;
|
|
247
|
+
|
|
248
|
+
nm = X509_get_subject_name(x);
|
|
249
|
+
|
|
250
|
+
// Guard against certificates with an excessive number of names or
|
|
251
|
+
// constraints causing a computationally expensive name constraints
|
|
252
|
+
// check.
|
|
253
|
+
size_t name_count =
|
|
254
|
+
X509_NAME_entry_count(nm) + sk_GENERAL_NAME_num(x->altname);
|
|
255
|
+
size_t constraint_count = sk_GENERAL_SUBTREE_num(nc->permittedSubtrees) +
|
|
256
|
+
sk_GENERAL_SUBTREE_num(nc->excludedSubtrees);
|
|
257
|
+
size_t check_count = constraint_count * name_count;
|
|
258
|
+
if (name_count < (size_t)X509_NAME_entry_count(nm) ||
|
|
259
|
+
constraint_count < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees) ||
|
|
260
|
+
(constraint_count && check_count / constraint_count != name_count) ||
|
|
261
|
+
check_count > 1 << 20) {
|
|
262
|
+
return X509_V_ERR_UNSPECIFIED;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (X509_NAME_entry_count(nm) > 0) {
|
|
266
|
+
GENERAL_NAME gntmp;
|
|
267
|
+
gntmp.type = GEN_DIRNAME;
|
|
268
|
+
gntmp.d.directoryName = nm;
|
|
269
|
+
|
|
270
|
+
r = nc_match(&gntmp, nc);
|
|
271
|
+
|
|
272
|
+
if (r != X509_V_OK) {
|
|
273
|
+
return r;
|
|
254
274
|
}
|
|
255
275
|
|
|
256
|
-
|
|
257
|
-
GENERAL_NAME gntmp;
|
|
258
|
-
gntmp.type = GEN_DIRNAME;
|
|
259
|
-
gntmp.d.directoryName = nm;
|
|
260
|
-
|
|
261
|
-
r = nc_match(&gntmp, nc);
|
|
262
|
-
|
|
263
|
-
if (r != X509_V_OK)
|
|
264
|
-
return r;
|
|
265
|
-
|
|
266
|
-
gntmp.type = GEN_EMAIL;
|
|
276
|
+
gntmp.type = GEN_EMAIL;
|
|
267
277
|
|
|
268
|
-
|
|
278
|
+
// Process any email address attributes in subject name
|
|
269
279
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
280
|
+
for (i = -1;;) {
|
|
281
|
+
X509_NAME_ENTRY *ne;
|
|
282
|
+
i = X509_NAME_get_index_by_NID(nm, NID_pkcs9_emailAddress, i);
|
|
283
|
+
if (i == -1) {
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
ne = X509_NAME_get_entry(nm, i);
|
|
287
|
+
gntmp.d.rfc822Name = X509_NAME_ENTRY_get_data(ne);
|
|
288
|
+
if (gntmp.d.rfc822Name->type != V_ASN1_IA5STRING) {
|
|
289
|
+
return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
|
|
290
|
+
}
|
|
281
291
|
|
|
282
|
-
|
|
283
|
-
return r;
|
|
284
|
-
}
|
|
292
|
+
r = nc_match(&gntmp, nc);
|
|
285
293
|
|
|
294
|
+
if (r != X509_V_OK) {
|
|
295
|
+
return r;
|
|
296
|
+
}
|
|
286
297
|
}
|
|
298
|
+
}
|
|
287
299
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
300
|
+
for (j = 0; j < sk_GENERAL_NAME_num(x->altname); j++) {
|
|
301
|
+
GENERAL_NAME *gen = sk_GENERAL_NAME_value(x->altname, j);
|
|
302
|
+
r = nc_match(gen, nc);
|
|
303
|
+
if (r != X509_V_OK) {
|
|
304
|
+
return r;
|
|
293
305
|
}
|
|
306
|
+
}
|
|
294
307
|
|
|
295
|
-
|
|
296
|
-
|
|
308
|
+
return X509_V_OK;
|
|
297
309
|
}
|
|
298
310
|
|
|
299
|
-
static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc)
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
size_t i;
|
|
304
|
-
|
|
305
|
-
/*
|
|
306
|
-
* Permitted subtrees: if any subtrees exist of matching the type at
|
|
307
|
-
* least one subtree must match.
|
|
308
|
-
*/
|
|
309
|
-
|
|
310
|
-
for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees); i++) {
|
|
311
|
-
sub = sk_GENERAL_SUBTREE_value(nc->permittedSubtrees, i);
|
|
312
|
-
if (gen->type != sub->base->type)
|
|
313
|
-
continue;
|
|
314
|
-
if (sub->minimum || sub->maximum)
|
|
315
|
-
return X509_V_ERR_SUBTREE_MINMAX;
|
|
316
|
-
/* If we already have a match don't bother trying any more */
|
|
317
|
-
if (match == 2)
|
|
318
|
-
continue;
|
|
319
|
-
if (match == 0)
|
|
320
|
-
match = 1;
|
|
321
|
-
r = nc_match_single(gen, sub->base);
|
|
322
|
-
if (r == X509_V_OK)
|
|
323
|
-
match = 2;
|
|
324
|
-
else if (r != X509_V_ERR_PERMITTED_VIOLATION)
|
|
325
|
-
return r;
|
|
326
|
-
}
|
|
311
|
+
static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) {
|
|
312
|
+
GENERAL_SUBTREE *sub;
|
|
313
|
+
int r, match = 0;
|
|
314
|
+
size_t i;
|
|
327
315
|
|
|
328
|
-
|
|
329
|
-
|
|
316
|
+
// Permitted subtrees: if any subtrees exist of matching the type at
|
|
317
|
+
// least one subtree must match.
|
|
330
318
|
|
|
331
|
-
|
|
319
|
+
for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees); i++) {
|
|
320
|
+
sub = sk_GENERAL_SUBTREE_value(nc->permittedSubtrees, i);
|
|
321
|
+
if (gen->type != sub->base->type) {
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
if (sub->minimum || sub->maximum) {
|
|
325
|
+
return X509_V_ERR_SUBTREE_MINMAX;
|
|
326
|
+
}
|
|
327
|
+
// If we already have a match don't bother trying any more
|
|
328
|
+
if (match == 2) {
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
if (match == 0) {
|
|
332
|
+
match = 1;
|
|
333
|
+
}
|
|
334
|
+
r = nc_match_single(gen, sub->base);
|
|
335
|
+
if (r == X509_V_OK) {
|
|
336
|
+
match = 2;
|
|
337
|
+
} else if (r != X509_V_ERR_PERMITTED_VIOLATION) {
|
|
338
|
+
return r;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
332
341
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
continue;
|
|
337
|
-
if (sub->minimum || sub->maximum)
|
|
338
|
-
return X509_V_ERR_SUBTREE_MINMAX;
|
|
342
|
+
if (match == 1) {
|
|
343
|
+
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
344
|
+
}
|
|
339
345
|
|
|
340
|
-
|
|
341
|
-
if (r == X509_V_OK)
|
|
342
|
-
return X509_V_ERR_EXCLUDED_VIOLATION;
|
|
343
|
-
else if (r != X509_V_ERR_PERMITTED_VIOLATION)
|
|
344
|
-
return r;
|
|
346
|
+
// Excluded subtrees: must not match any of these
|
|
345
347
|
|
|
348
|
+
for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->excludedSubtrees); i++) {
|
|
349
|
+
sub = sk_GENERAL_SUBTREE_value(nc->excludedSubtrees, i);
|
|
350
|
+
if (gen->type != sub->base->type) {
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
if (sub->minimum || sub->maximum) {
|
|
354
|
+
return X509_V_ERR_SUBTREE_MINMAX;
|
|
346
355
|
}
|
|
347
356
|
|
|
348
|
-
|
|
357
|
+
r = nc_match_single(gen, sub->base);
|
|
358
|
+
if (r == X509_V_OK) {
|
|
359
|
+
return X509_V_ERR_EXCLUDED_VIOLATION;
|
|
360
|
+
} else if (r != X509_V_ERR_PERMITTED_VIOLATION) {
|
|
361
|
+
return r;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
349
364
|
|
|
365
|
+
return X509_V_OK;
|
|
350
366
|
}
|
|
351
367
|
|
|
352
|
-
static int nc_match_single(GENERAL_NAME *gen, GENERAL_NAME *base)
|
|
353
|
-
{
|
|
354
|
-
switch (base->type) {
|
|
368
|
+
static int nc_match_single(GENERAL_NAME *gen, GENERAL_NAME *base) {
|
|
369
|
+
switch (base->type) {
|
|
355
370
|
case GEN_DIRNAME:
|
|
356
|
-
|
|
371
|
+
return nc_dn(gen->d.directoryName, base->d.directoryName);
|
|
357
372
|
|
|
358
373
|
case GEN_DNS:
|
|
359
|
-
|
|
374
|
+
return nc_dns(gen->d.dNSName, base->d.dNSName);
|
|
360
375
|
|
|
361
376
|
case GEN_EMAIL:
|
|
362
|
-
|
|
377
|
+
return nc_email(gen->d.rfc822Name, base->d.rfc822Name);
|
|
363
378
|
|
|
364
379
|
case GEN_URI:
|
|
365
|
-
|
|
366
|
-
|
|
380
|
+
return nc_uri(gen->d.uniformResourceIdentifier,
|
|
381
|
+
base->d.uniformResourceIdentifier);
|
|
367
382
|
|
|
368
383
|
default:
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
384
|
+
return X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE;
|
|
385
|
+
}
|
|
372
386
|
}
|
|
373
387
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
388
|
+
// directoryName name constraint matching. The canonical encoding of
|
|
389
|
+
// X509_NAME makes this comparison easy. It is matched if the subtree is a
|
|
390
|
+
// subset of the name.
|
|
391
|
+
|
|
392
|
+
static int nc_dn(X509_NAME *nm, X509_NAME *base) {
|
|
393
|
+
// Ensure canonical encodings are up to date.
|
|
394
|
+
if (nm->modified && i2d_X509_NAME(nm, NULL) < 0) {
|
|
395
|
+
return X509_V_ERR_OUT_OF_MEM;
|
|
396
|
+
}
|
|
397
|
+
if (base->modified && i2d_X509_NAME(base, NULL) < 0) {
|
|
398
|
+
return X509_V_ERR_OUT_OF_MEM;
|
|
399
|
+
}
|
|
400
|
+
if (base->canon_enclen > nm->canon_enclen) {
|
|
401
|
+
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
402
|
+
}
|
|
403
|
+
if (OPENSSL_memcmp(base->canon_enc, nm->canon_enc, base->canon_enclen)) {
|
|
404
|
+
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
405
|
+
}
|
|
406
|
+
return X509_V_OK;
|
|
392
407
|
}
|
|
393
408
|
|
|
394
|
-
static int starts_with(const CBS *cbs, uint8_t c)
|
|
395
|
-
|
|
396
|
-
return CBS_len(cbs) > 0 && CBS_data(cbs)[0] == c;
|
|
409
|
+
static int starts_with(const CBS *cbs, uint8_t c) {
|
|
410
|
+
return CBS_len(cbs) > 0 && CBS_data(cbs)[0] == c;
|
|
397
411
|
}
|
|
398
412
|
|
|
399
|
-
static int equal_case(const CBS *a, const CBS *b)
|
|
400
|
-
{
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
return 0;
|
|
410
|
-
}
|
|
413
|
+
static int equal_case(const CBS *a, const CBS *b) {
|
|
414
|
+
if (CBS_len(a) != CBS_len(b)) {
|
|
415
|
+
return 0;
|
|
416
|
+
}
|
|
417
|
+
// Note we cannot use |OPENSSL_strncasecmp| because that would stop
|
|
418
|
+
// iterating at NUL.
|
|
419
|
+
const uint8_t *a_data = CBS_data(a), *b_data = CBS_data(b);
|
|
420
|
+
for (size_t i = 0; i < CBS_len(a); i++) {
|
|
421
|
+
if (OPENSSL_tolower(a_data[i]) != OPENSSL_tolower(b_data[i])) {
|
|
422
|
+
return 0;
|
|
411
423
|
}
|
|
412
|
-
|
|
424
|
+
}
|
|
425
|
+
return 1;
|
|
413
426
|
}
|
|
414
427
|
|
|
415
|
-
static int has_suffix_case(const CBS *a, const CBS *b)
|
|
416
|
-
{
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
return equal_case(©, b);
|
|
428
|
+
static int has_suffix_case(const CBS *a, const CBS *b) {
|
|
429
|
+
if (CBS_len(a) < CBS_len(b)) {
|
|
430
|
+
return 0;
|
|
431
|
+
}
|
|
432
|
+
CBS copy = *a;
|
|
433
|
+
CBS_skip(©, CBS_len(a) - CBS_len(b));
|
|
434
|
+
return equal_case(©, b);
|
|
423
435
|
}
|
|
424
436
|
|
|
425
|
-
static int nc_dns(ASN1_IA5STRING *dns, ASN1_IA5STRING *base)
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
CBS_init(&base_cbs, base->data, base->length);
|
|
430
|
-
|
|
431
|
-
/* Empty matches everything */
|
|
432
|
-
if (CBS_len(&base_cbs) == 0) {
|
|
433
|
-
return X509_V_OK;
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
/* If |base_cbs| begins with a '.', do a simple suffix comparison. This is
|
|
437
|
-
* not part of RFC5280, but is part of OpenSSL's original behavior. */
|
|
438
|
-
if (starts_with(&base_cbs, '.')) {
|
|
439
|
-
if (has_suffix_case(&dns_cbs, &base_cbs)) {
|
|
440
|
-
return X509_V_OK;
|
|
441
|
-
}
|
|
442
|
-
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
/*
|
|
446
|
-
* Otherwise can add zero or more components on the left so compare RHS
|
|
447
|
-
* and if dns is longer and expect '.' as preceding character.
|
|
448
|
-
*/
|
|
449
|
-
if (CBS_len(&dns_cbs) > CBS_len(&base_cbs)) {
|
|
450
|
-
uint8_t dot;
|
|
451
|
-
if (!CBS_skip(&dns_cbs, CBS_len(&dns_cbs) - CBS_len(&base_cbs) - 1) ||
|
|
452
|
-
!CBS_get_u8(&dns_cbs, &dot) ||
|
|
453
|
-
dot != '.') {
|
|
454
|
-
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
if (!equal_case(&dns_cbs, &base_cbs)) {
|
|
459
|
-
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
460
|
-
}
|
|
437
|
+
static int nc_dns(ASN1_IA5STRING *dns, ASN1_IA5STRING *base) {
|
|
438
|
+
CBS dns_cbs, base_cbs;
|
|
439
|
+
CBS_init(&dns_cbs, dns->data, dns->length);
|
|
440
|
+
CBS_init(&base_cbs, base->data, base->length);
|
|
461
441
|
|
|
442
|
+
// Empty matches everything
|
|
443
|
+
if (CBS_len(&base_cbs) == 0) {
|
|
462
444
|
return X509_V_OK;
|
|
445
|
+
}
|
|
463
446
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
{
|
|
468
|
-
|
|
469
|
-
CBS_init(&eml_cbs, eml->data, eml->length);
|
|
470
|
-
CBS_init(&base_cbs, base->data, base->length);
|
|
471
|
-
|
|
472
|
-
/* TODO(davidben): In OpenSSL 1.1.1, this switched from the first '@' to the
|
|
473
|
-
* last one. Match them here, or perhaps do an actual parse. Looks like
|
|
474
|
-
* multiple '@'s may be allowed in quoted strings. */
|
|
475
|
-
CBS eml_local, base_local;
|
|
476
|
-
if (!CBS_get_until_first(&eml_cbs, &eml_local, '@')) {
|
|
477
|
-
return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
|
|
447
|
+
// If |base_cbs| begins with a '.', do a simple suffix comparison. This is
|
|
448
|
+
// not part of RFC5280, but is part of OpenSSL's original behavior.
|
|
449
|
+
if (starts_with(&base_cbs, '.')) {
|
|
450
|
+
if (has_suffix_case(&dns_cbs, &base_cbs)) {
|
|
451
|
+
return X509_V_OK;
|
|
478
452
|
}
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
/* If we have anything before '@' match local part */
|
|
490
|
-
if (base_has_at) {
|
|
491
|
-
/* TODO(davidben): This interprets a constraint of "@example.com" as
|
|
492
|
-
* "example.com", which is not part of RFC5280. */
|
|
493
|
-
if (CBS_len(&base_local) > 0) {
|
|
494
|
-
/* Case sensitive match of local part */
|
|
495
|
-
if (!CBS_mem_equal(&base_local, CBS_data(&eml_local),
|
|
496
|
-
CBS_len(&eml_local))) {
|
|
497
|
-
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
/* Position base after '@' */
|
|
501
|
-
assert(starts_with(&base_cbs, '@'));
|
|
502
|
-
CBS_skip(&base_cbs, 1);
|
|
453
|
+
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// Otherwise can add zero or more components on the left so compare RHS
|
|
457
|
+
// and if dns is longer and expect '.' as preceding character.
|
|
458
|
+
if (CBS_len(&dns_cbs) > CBS_len(&base_cbs)) {
|
|
459
|
+
uint8_t dot;
|
|
460
|
+
if (!CBS_skip(&dns_cbs, CBS_len(&dns_cbs) - CBS_len(&base_cbs) - 1) ||
|
|
461
|
+
!CBS_get_u8(&dns_cbs, &dot) || dot != '.') {
|
|
462
|
+
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
503
463
|
}
|
|
464
|
+
}
|
|
504
465
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
if (!equal_case(&base_cbs, &eml_cbs)) {
|
|
509
|
-
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
510
|
-
}
|
|
466
|
+
if (!equal_case(&dns_cbs, &base_cbs)) {
|
|
467
|
+
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
468
|
+
}
|
|
511
469
|
|
|
512
|
-
|
|
470
|
+
return X509_V_OK;
|
|
513
471
|
}
|
|
514
472
|
|
|
515
|
-
static int
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
* TODO(davidben): This is not a correct URI parser and mishandles IPv6
|
|
534
|
-
* literals. */
|
|
535
|
-
CBS host;
|
|
536
|
-
if (!CBS_get_until_first(&uri_cbs, &host, ':') &&
|
|
537
|
-
!CBS_get_until_first(&uri_cbs, &host, '/')) {
|
|
538
|
-
host = uri_cbs;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
if (CBS_len(&host) == 0) {
|
|
542
|
-
return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
|
|
473
|
+
static int nc_email(ASN1_IA5STRING *eml, ASN1_IA5STRING *base) {
|
|
474
|
+
CBS eml_cbs, base_cbs;
|
|
475
|
+
CBS_init(&eml_cbs, eml->data, eml->length);
|
|
476
|
+
CBS_init(&base_cbs, base->data, base->length);
|
|
477
|
+
|
|
478
|
+
// TODO(davidben): In OpenSSL 1.1.1, this switched from the first '@' to the
|
|
479
|
+
// last one. Match them here, or perhaps do an actual parse. Looks like
|
|
480
|
+
// multiple '@'s may be allowed in quoted strings.
|
|
481
|
+
CBS eml_local, base_local;
|
|
482
|
+
if (!CBS_get_until_first(&eml_cbs, &eml_local, '@')) {
|
|
483
|
+
return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
|
|
484
|
+
}
|
|
485
|
+
int base_has_at = CBS_get_until_first(&base_cbs, &base_local, '@');
|
|
486
|
+
|
|
487
|
+
// Special case: inital '.' is RHS match
|
|
488
|
+
if (!base_has_at && starts_with(&base_cbs, '.')) {
|
|
489
|
+
if (has_suffix_case(&eml_cbs, &base_cbs)) {
|
|
490
|
+
return X509_V_OK;
|
|
543
491
|
}
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
492
|
+
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// If we have anything before '@' match local part
|
|
496
|
+
if (base_has_at) {
|
|
497
|
+
// TODO(davidben): This interprets a constraint of "@example.com" as
|
|
498
|
+
// "example.com", which is not part of RFC5280.
|
|
499
|
+
if (CBS_len(&base_local) > 0) {
|
|
500
|
+
// Case sensitive match of local part
|
|
501
|
+
if (!CBS_mem_equal(&base_local, CBS_data(&eml_local),
|
|
502
|
+
CBS_len(&eml_local))) {
|
|
550
503
|
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
504
|
+
}
|
|
551
505
|
}
|
|
506
|
+
// Position base after '@'
|
|
507
|
+
assert(starts_with(&base_cbs, '@'));
|
|
508
|
+
CBS_skip(&base_cbs, 1);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// Just have hostname left to match: case insensitive
|
|
512
|
+
assert(starts_with(&eml_cbs, '@'));
|
|
513
|
+
CBS_skip(&eml_cbs, 1);
|
|
514
|
+
if (!equal_case(&base_cbs, &eml_cbs)) {
|
|
515
|
+
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
return X509_V_OK;
|
|
519
|
+
}
|
|
552
520
|
|
|
553
|
-
|
|
554
|
-
|
|
521
|
+
static int nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base) {
|
|
522
|
+
CBS uri_cbs, base_cbs;
|
|
523
|
+
CBS_init(&uri_cbs, uri->data, uri->length);
|
|
524
|
+
CBS_init(&base_cbs, base->data, base->length);
|
|
525
|
+
|
|
526
|
+
// Check for foo:// and skip past it
|
|
527
|
+
CBS scheme;
|
|
528
|
+
uint8_t byte;
|
|
529
|
+
if (!CBS_get_until_first(&uri_cbs, &scheme, ':') ||
|
|
530
|
+
!CBS_skip(&uri_cbs, 1) || // Skip the colon
|
|
531
|
+
!CBS_get_u8(&uri_cbs, &byte) || byte != '/' ||
|
|
532
|
+
!CBS_get_u8(&uri_cbs, &byte) || byte != '/') {
|
|
533
|
+
return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
// Look for a port indicator as end of hostname first. Otherwise look for
|
|
537
|
+
// trailing slash, or the end of the string.
|
|
538
|
+
// TODO(davidben): This is not a correct URI parser and mishandles IPv6
|
|
539
|
+
// literals.
|
|
540
|
+
CBS host;
|
|
541
|
+
if (!CBS_get_until_first(&uri_cbs, &host, ':') &&
|
|
542
|
+
!CBS_get_until_first(&uri_cbs, &host, '/')) {
|
|
543
|
+
host = uri_cbs;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
if (CBS_len(&host) == 0) {
|
|
547
|
+
return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Special case: inital '.' is RHS match
|
|
551
|
+
if (starts_with(&base_cbs, '.')) {
|
|
552
|
+
if (has_suffix_case(&host, &base_cbs)) {
|
|
553
|
+
return X509_V_OK;
|
|
555
554
|
}
|
|
555
|
+
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
556
|
+
}
|
|
556
557
|
|
|
557
|
-
|
|
558
|
+
if (!equal_case(&base_cbs, &host)) {
|
|
559
|
+
return X509_V_ERR_PERMITTED_VIOLATION;
|
|
560
|
+
}
|
|
558
561
|
|
|
562
|
+
return X509_V_OK;
|
|
559
563
|
}
|