build(deps): bump golang.org/x/net from 0.44.0 to 0.46.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.44.0 to 0.46.0. - [Commits](https://github.com/golang/net/compare/v0.44.0...v0.46.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-version: 0.46.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
This commit is contained in:
committed by
Ralf Haferkamp
parent
6e4e533e2c
commit
c362d84f11
@@ -102,14 +102,14 @@ require (
|
|||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0
|
||||||
go.opentelemetry.io/otel/sdk v1.38.0
|
go.opentelemetry.io/otel/sdk v1.38.0
|
||||||
go.opentelemetry.io/otel/trace v1.38.0
|
go.opentelemetry.io/otel/trace v1.38.0
|
||||||
golang.org/x/crypto v0.42.0
|
golang.org/x/crypto v0.43.0
|
||||||
golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac
|
golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac
|
||||||
golang.org/x/image v0.31.0
|
golang.org/x/image v0.31.0
|
||||||
golang.org/x/net v0.44.0
|
golang.org/x/net v0.46.0
|
||||||
golang.org/x/oauth2 v0.31.0
|
golang.org/x/oauth2 v0.31.0
|
||||||
golang.org/x/sync v0.17.0
|
golang.org/x/sync v0.17.0
|
||||||
golang.org/x/term v0.35.0
|
golang.org/x/term v0.36.0
|
||||||
golang.org/x/text v0.29.0
|
golang.org/x/text v0.30.0
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20250929231259-57b25ae835d4
|
google.golang.org/genproto/googleapis/api v0.0.0-20250929231259-57b25ae835d4
|
||||||
google.golang.org/grpc v1.76.0
|
google.golang.org/grpc v1.76.0
|
||||||
google.golang.org/protobuf v1.36.10
|
google.golang.org/protobuf v1.36.10
|
||||||
@@ -374,10 +374,11 @@ require (
|
|||||||
go.uber.org/zap v1.27.0 // indirect
|
go.uber.org/zap v1.27.0 // indirect
|
||||||
go.yaml.in/yaml/v2 v2.4.2 // indirect
|
go.yaml.in/yaml/v2 v2.4.2 // indirect
|
||||||
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
||||||
golang.org/x/mod v0.27.0 // indirect
|
golang.org/x/mod v0.28.0 // indirect
|
||||||
golang.org/x/sys v0.36.0 // indirect
|
golang.org/x/sys v0.37.0 // indirect
|
||||||
golang.org/x/time v0.13.0 // indirect
|
golang.org/x/time v0.13.0 // indirect
|
||||||
golang.org/x/tools v0.36.0 // indirect
|
golang.org/x/tools v0.37.0 // indirect
|
||||||
|
golang.org/x/tools/godoc v0.1.0-deprecated // indirect
|
||||||
google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect
|
google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250929231259-57b25ae835d4 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250929231259-57b25ae835d4 // indirect
|
||||||
gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect
|
gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect
|
||||||
|
|||||||
@@ -1343,8 +1343,8 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf
|
|||||||
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
||||||
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
|
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
|
||||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||||
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
|
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
|
||||||
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
|
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
@@ -1386,8 +1386,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
|||||||
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||||
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||||
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
|
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
|
||||||
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
|
golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@@ -1441,8 +1441,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
|||||||
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
||||||
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
||||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||||
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
|
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
|
||||||
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
|
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@@ -1554,8 +1554,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
|||||||
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
|
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
|
||||||
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||||
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
|
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
@@ -1567,8 +1567,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
|
|||||||
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
||||||
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
|
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
|
||||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||||
golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ=
|
golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q=
|
||||||
golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
|
golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -1583,8 +1583,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
|||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
||||||
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
|
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
|
||||||
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
|
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
@@ -1647,8 +1647,10 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
|
|||||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||||
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
|
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
|
||||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
|
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
|
||||||
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
|
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
|
||||||
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
|
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
|
||||||
|
golang.org/x/tools/godoc v0.1.0-deprecated h1:o+aZ1BOj6Hsx/GBdJO/s815sqftjSnrZZwyYTHODvtk=
|
||||||
|
golang.org/x/tools/godoc v0.1.0-deprecated/go.mod h1:qM63CriJ961IHWmnWa9CjZnBndniPt4a3CK0PVB9bIg=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|||||||
+7
-4
@@ -3,11 +3,14 @@
|
|||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package curve25519 provides an implementation of the X25519 function, which
|
// Package curve25519 provides an implementation of the X25519 function, which
|
||||||
// performs scalar multiplication on the elliptic curve known as Curve25519.
|
// performs scalar multiplication on the elliptic curve known as Curve25519
|
||||||
// See RFC 7748.
|
// according to [RFC 7748].
|
||||||
//
|
//
|
||||||
// This package is a wrapper for the X25519 implementation
|
// The curve25519 package is a wrapper for the X25519 implementation in the
|
||||||
// in the crypto/ecdh package.
|
// crypto/ecdh package. It is [frozen] and is not accepting new features.
|
||||||
|
//
|
||||||
|
// [RFC 7748]: https://datatracker.ietf.org/doc/html/rfc7748
|
||||||
|
// [frozen]: https://go.dev/wiki/Frozen
|
||||||
package curve25519
|
package curve25519
|
||||||
|
|
||||||
import "crypto/ecdh"
|
import "crypto/ecdh"
|
||||||
|
|||||||
+7
-4
@@ -2,16 +2,19 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package ed25519 implements the Ed25519 signature algorithm. See
|
// Package ed25519 implements the Ed25519 signature algorithm.
|
||||||
// https://ed25519.cr.yp.to/.
|
|
||||||
//
|
//
|
||||||
// These functions are also compatible with the “Ed25519” function defined in
|
// These functions are also compatible with the “Ed25519” function defined in
|
||||||
// RFC 8032. However, unlike RFC 8032's formulation, this package's private key
|
// [RFC 8032]. However, unlike RFC 8032's formulation, this package's private key
|
||||||
// representation includes a public key suffix to make multiple signing
|
// representation includes a public key suffix to make multiple signing
|
||||||
// operations with the same key more efficient. This package refers to the RFC
|
// operations with the same key more efficient. This package refers to the RFC
|
||||||
// 8032 private key as the “seed”.
|
// 8032 private key as the “seed”.
|
||||||
//
|
//
|
||||||
// This package is a wrapper around the standard library crypto/ed25519 package.
|
// The ed25519 package is a wrapper for the Ed25519 implementation in the
|
||||||
|
// crypto/ed25519 package. It is [frozen] and is not accepting new features.
|
||||||
|
//
|
||||||
|
// [RFC 8032]: https://datatracker.ietf.org/doc/html/rfc8032
|
||||||
|
// [frozen]: https://go.dev/wiki/Frozen
|
||||||
package ed25519
|
package ed25519
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
+4
@@ -3,6 +3,10 @@
|
|||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package salsa provides low-level access to functions in the Salsa family.
|
// Package salsa provides low-level access to functions in the Salsa family.
|
||||||
|
//
|
||||||
|
// Deprecated: this package exposes unsafe low-level operations. New applications
|
||||||
|
// should consider using the AEAD construction in golang.org/x/crypto/chacha20poly1305
|
||||||
|
// instead. Existing users should migrate to golang.org/x/crypto/salsa20.
|
||||||
package salsa
|
package salsa
|
||||||
|
|
||||||
import "math/bits"
|
import "math/bits"
|
||||||
|
|||||||
+4
-2
@@ -430,8 +430,9 @@ func (c *client) List() ([]*Key, error) {
|
|||||||
return keys, nil
|
return keys, nil
|
||||||
case *failureAgentMsg:
|
case *failureAgentMsg:
|
||||||
return nil, errors.New("agent: failed to list keys")
|
return nil, errors.New("agent: failed to list keys")
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("agent: failed to list keys, unexpected message type %T", msg)
|
||||||
}
|
}
|
||||||
panic("unreachable")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sign has the agent sign the data using a protocol 2 key as defined
|
// Sign has the agent sign the data using a protocol 2 key as defined
|
||||||
@@ -462,8 +463,9 @@ func (c *client) SignWithFlags(key ssh.PublicKey, data []byte, flags SignatureFl
|
|||||||
return &sig, nil
|
return &sig, nil
|
||||||
case *failureAgentMsg:
|
case *failureAgentMsg:
|
||||||
return nil, errors.New("agent: failed to sign challenge")
|
return nil, errors.New("agent: failed to sign challenge")
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("agent: failed to sign challenge, unexpected message type %T", msg)
|
||||||
}
|
}
|
||||||
panic("unreachable")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// unmarshal parses an agent message in packet, returning the parsed
|
// unmarshal parses an agent message in packet, returning the parsed
|
||||||
|
|||||||
+29
-27
@@ -8,6 +8,7 @@ import (
|
|||||||
"crypto/aes"
|
"crypto/aes"
|
||||||
"crypto/cipher"
|
"crypto/cipher"
|
||||||
"crypto/des"
|
"crypto/des"
|
||||||
|
"crypto/fips140"
|
||||||
"crypto/rc4"
|
"crypto/rc4"
|
||||||
"crypto/subtle"
|
"crypto/subtle"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
@@ -15,6 +16,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"hash"
|
"hash"
|
||||||
"io"
|
"io"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"golang.org/x/crypto/chacha20"
|
"golang.org/x/crypto/chacha20"
|
||||||
"golang.org/x/crypto/internal/poly1305"
|
"golang.org/x/crypto/internal/poly1305"
|
||||||
@@ -93,41 +95,41 @@ func streamCipherMode(skip int, createFunc func(key, iv []byte) (cipher.Stream,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// cipherModes documents properties of supported ciphers. Ciphers not included
|
// cipherModes documents properties of supported ciphers. Ciphers not included
|
||||||
// are not supported and will not be negotiated, even if explicitly requested in
|
// are not supported and will not be negotiated, even if explicitly configured.
|
||||||
// ClientConfig.Crypto.Ciphers.
|
// When FIPS mode is enabled, only FIPS-approved algorithms are included.
|
||||||
var cipherModes = map[string]*cipherMode{
|
var cipherModes = map[string]*cipherMode{}
|
||||||
// Ciphers from RFC 4344, which introduced many CTR-based ciphers. Algorithms
|
|
||||||
// are defined in the order specified in the RFC.
|
|
||||||
CipherAES128CTR: {16, aes.BlockSize, streamCipherMode(0, newAESCTR)},
|
|
||||||
CipherAES192CTR: {24, aes.BlockSize, streamCipherMode(0, newAESCTR)},
|
|
||||||
CipherAES256CTR: {32, aes.BlockSize, streamCipherMode(0, newAESCTR)},
|
|
||||||
|
|
||||||
// Ciphers from RFC 4345, which introduces security-improved arcfour ciphers.
|
func init() {
|
||||||
// They are defined in the order specified in the RFC.
|
cipherModes[CipherAES128CTR] = &cipherMode{16, aes.BlockSize, streamCipherMode(0, newAESCTR)}
|
||||||
InsecureCipherRC4128: {16, 0, streamCipherMode(1536, newRC4)},
|
cipherModes[CipherAES192CTR] = &cipherMode{24, aes.BlockSize, streamCipherMode(0, newAESCTR)}
|
||||||
InsecureCipherRC4256: {32, 0, streamCipherMode(1536, newRC4)},
|
cipherModes[CipherAES256CTR] = &cipherMode{32, aes.BlockSize, streamCipherMode(0, newAESCTR)}
|
||||||
|
// Use of GCM with arbitrary IVs is not allowed in FIPS 140-only mode,
|
||||||
|
// we'll wire it up to NewGCMForSSH in Go 1.26.
|
||||||
|
//
|
||||||
|
// For now it means we'll work with fips140=on but not fips140=only.
|
||||||
|
cipherModes[CipherAES128GCM] = &cipherMode{16, 12, newGCMCipher}
|
||||||
|
cipherModes[CipherAES256GCM] = &cipherMode{32, 12, newGCMCipher}
|
||||||
|
|
||||||
// Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol.
|
if fips140.Enabled() {
|
||||||
// Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and
|
defaultCiphers = slices.DeleteFunc(defaultCiphers, func(algo string) bool {
|
||||||
// RC4) has problems with weak keys, and should be used with caution."
|
_, ok := cipherModes[algo]
|
||||||
// RFC 4345 introduces improved versions of Arcfour.
|
return !ok
|
||||||
InsecureCipherRC4: {16, 0, streamCipherMode(0, newRC4)},
|
})
|
||||||
|
return
|
||||||
// AEAD ciphers
|
}
|
||||||
CipherAES128GCM: {16, 12, newGCMCipher},
|
|
||||||
CipherAES256GCM: {32, 12, newGCMCipher},
|
|
||||||
CipherChaCha20Poly1305: {64, 0, newChaCha20Cipher},
|
|
||||||
|
|
||||||
|
cipherModes[CipherChaCha20Poly1305] = &cipherMode{64, 0, newChaCha20Cipher}
|
||||||
|
// Insecure ciphers not included in the default configuration.
|
||||||
|
cipherModes[InsecureCipherRC4128] = &cipherMode{16, 0, streamCipherMode(1536, newRC4)}
|
||||||
|
cipherModes[InsecureCipherRC4256] = &cipherMode{32, 0, streamCipherMode(1536, newRC4)}
|
||||||
|
cipherModes[InsecureCipherRC4] = &cipherMode{16, 0, streamCipherMode(0, newRC4)}
|
||||||
// CBC mode is insecure and so is not included in the default config.
|
// CBC mode is insecure and so is not included in the default config.
|
||||||
// (See https://www.ieee-security.org/TC/SP2013/papers/4977a526.pdf). If absolutely
|
// (See https://www.ieee-security.org/TC/SP2013/papers/4977a526.pdf). If absolutely
|
||||||
// needed, it's possible to specify a custom Config to enable it.
|
// needed, it's possible to specify a custom Config to enable it.
|
||||||
// You should expect that an active attacker can recover plaintext if
|
// You should expect that an active attacker can recover plaintext if
|
||||||
// you do.
|
// you do.
|
||||||
InsecureCipherAES128CBC: {16, aes.BlockSize, newAESCBCCipher},
|
cipherModes[InsecureCipherAES128CBC] = &cipherMode{16, aes.BlockSize, newAESCBCCipher}
|
||||||
|
cipherModes[InsecureCipherTripleDESCBC] = &cipherMode{24, des.BlockSize, newTripleDESCBCCipher}
|
||||||
// 3des-cbc is insecure and is not included in the default
|
|
||||||
// config.
|
|
||||||
InsecureCipherTripleDESCBC: {24, des.BlockSize, newTripleDESCBCCipher},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// prefixLen is the length of the packet prefix that contains the packet length
|
// prefixLen is the length of the packet prefix that contains the packet length
|
||||||
|
|||||||
+8
-16
@@ -9,6 +9,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -83,7 +84,7 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error {
|
|||||||
// success
|
// success
|
||||||
return nil
|
return nil
|
||||||
} else if ok == authFailure {
|
} else if ok == authFailure {
|
||||||
if m := auth.method(); !contains(tried, m) {
|
if m := auth.method(); !slices.Contains(tried, m) {
|
||||||
tried = append(tried, m)
|
tried = append(tried, m)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,7 +98,7 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error {
|
|||||||
findNext:
|
findNext:
|
||||||
for _, a := range config.Auth {
|
for _, a := range config.Auth {
|
||||||
candidateMethod := a.method()
|
candidateMethod := a.method()
|
||||||
if contains(tried, candidateMethod) {
|
if slices.Contains(tried, candidateMethod) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for _, meth := range methods {
|
for _, meth := range methods {
|
||||||
@@ -117,15 +118,6 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error {
|
|||||||
return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", tried)
|
return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", tried)
|
||||||
}
|
}
|
||||||
|
|
||||||
func contains(list []string, e string) bool {
|
|
||||||
for _, s := range list {
|
|
||||||
if s == e {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// An AuthMethod represents an instance of an RFC 4252 authentication method.
|
// An AuthMethod represents an instance of an RFC 4252 authentication method.
|
||||||
type AuthMethod interface {
|
type AuthMethod interface {
|
||||||
// auth authenticates user over transport t.
|
// auth authenticates user over transport t.
|
||||||
@@ -255,7 +247,7 @@ func pickSignatureAlgorithm(signer Signer, extensions map[string][]byte) (MultiA
|
|||||||
// Fallback to use if there is no "server-sig-algs" extension or a
|
// Fallback to use if there is no "server-sig-algs" extension or a
|
||||||
// common algorithm cannot be found. We use the public key format if the
|
// common algorithm cannot be found. We use the public key format if the
|
||||||
// MultiAlgorithmSigner supports it, otherwise we return an error.
|
// MultiAlgorithmSigner supports it, otherwise we return an error.
|
||||||
if !contains(as.Algorithms(), underlyingAlgo(keyFormat)) {
|
if !slices.Contains(as.Algorithms(), underlyingAlgo(keyFormat)) {
|
||||||
return "", fmt.Errorf("ssh: no common public key signature algorithm, server only supports %q for key type %q, signer only supports %v",
|
return "", fmt.Errorf("ssh: no common public key signature algorithm, server only supports %q for key type %q, signer only supports %v",
|
||||||
underlyingAlgo(keyFormat), keyFormat, as.Algorithms())
|
underlyingAlgo(keyFormat), keyFormat, as.Algorithms())
|
||||||
}
|
}
|
||||||
@@ -284,7 +276,7 @@ func pickSignatureAlgorithm(signer Signer, extensions map[string][]byte) (MultiA
|
|||||||
// Filter algorithms based on those supported by MultiAlgorithmSigner.
|
// Filter algorithms based on those supported by MultiAlgorithmSigner.
|
||||||
var keyAlgos []string
|
var keyAlgos []string
|
||||||
for _, algo := range algorithmsForKeyFormat(keyFormat) {
|
for _, algo := range algorithmsForKeyFormat(keyFormat) {
|
||||||
if contains(as.Algorithms(), underlyingAlgo(algo)) {
|
if slices.Contains(as.Algorithms(), underlyingAlgo(algo)) {
|
||||||
keyAlgos = append(keyAlgos, algo)
|
keyAlgos = append(keyAlgos, algo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -334,7 +326,7 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand
|
|||||||
// the key try to use the obtained algorithm as if "server-sig-algs" had
|
// the key try to use the obtained algorithm as if "server-sig-algs" had
|
||||||
// not been implemented if supported from the algorithm signer.
|
// not been implemented if supported from the algorithm signer.
|
||||||
if !ok && idx < origSignersLen && isRSACert(algo) && algo != CertAlgoRSAv01 {
|
if !ok && idx < origSignersLen && isRSACert(algo) && algo != CertAlgoRSAv01 {
|
||||||
if contains(as.Algorithms(), KeyAlgoRSA) {
|
if slices.Contains(as.Algorithms(), KeyAlgoRSA) {
|
||||||
// We retry using the compat algorithm after all signers have
|
// We retry using the compat algorithm after all signers have
|
||||||
// been tried normally.
|
// been tried normally.
|
||||||
signers = append(signers, &multiAlgorithmSigner{
|
signers = append(signers, &multiAlgorithmSigner{
|
||||||
@@ -385,7 +377,7 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand
|
|||||||
// contain the "publickey" method, do not attempt to authenticate with any
|
// contain the "publickey" method, do not attempt to authenticate with any
|
||||||
// other keys. According to RFC 4252 Section 7, the latter can occur when
|
// other keys. According to RFC 4252 Section 7, the latter can occur when
|
||||||
// additional authentication methods are required.
|
// additional authentication methods are required.
|
||||||
if success == authSuccess || !contains(methods, cb.method()) {
|
if success == authSuccess || !slices.Contains(methods, cb.method()) {
|
||||||
return success, methods, err
|
return success, methods, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -434,7 +426,7 @@ func confirmKeyAck(key PublicKey, c packetConn) (bool, error) {
|
|||||||
// servers send the key type instead. OpenSSH allows any algorithm
|
// servers send the key type instead. OpenSSH allows any algorithm
|
||||||
// that matches the public key, so we do the same.
|
// that matches the public key, so we do the same.
|
||||||
// https://github.com/openssh/openssh-portable/blob/86bdd385/sshconnect2.c#L709
|
// https://github.com/openssh/openssh-portable/blob/86bdd385/sshconnect2.c#L709
|
||||||
if !contains(algorithmsForKeyFormat(key.Type()), msg.Algo) {
|
if !slices.Contains(algorithmsForKeyFormat(key.Type()), msg.Algo) {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
if !bytes.Equal(msg.PubKey, pubKey) {
|
if !bytes.Equal(msg.PubKey, pubKey) {
|
||||||
|
|||||||
+66
-17
@@ -6,6 +6,7 @@ package ssh
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto"
|
"crypto"
|
||||||
|
"crypto/fips140"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -256,6 +257,40 @@ type Algorithms struct {
|
|||||||
PublicKeyAuths []string
|
PublicKeyAuths []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
if fips140.Enabled() {
|
||||||
|
defaultHostKeyAlgos = slices.DeleteFunc(defaultHostKeyAlgos, func(algo string) bool {
|
||||||
|
_, err := hashFunc(underlyingAlgo(algo))
|
||||||
|
return err != nil
|
||||||
|
})
|
||||||
|
defaultPubKeyAuthAlgos = slices.DeleteFunc(defaultPubKeyAuthAlgos, func(algo string) bool {
|
||||||
|
_, err := hashFunc(underlyingAlgo(algo))
|
||||||
|
return err != nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func hashFunc(format string) (crypto.Hash, error) {
|
||||||
|
switch format {
|
||||||
|
case KeyAlgoRSASHA256, KeyAlgoECDSA256, KeyAlgoSKED25519, KeyAlgoSKECDSA256:
|
||||||
|
return crypto.SHA256, nil
|
||||||
|
case KeyAlgoECDSA384:
|
||||||
|
return crypto.SHA384, nil
|
||||||
|
case KeyAlgoRSASHA512, KeyAlgoECDSA521:
|
||||||
|
return crypto.SHA512, nil
|
||||||
|
case KeyAlgoED25519:
|
||||||
|
// KeyAlgoED25519 doesn't pre-hash.
|
||||||
|
return 0, nil
|
||||||
|
case KeyAlgoRSA, InsecureKeyAlgoDSA:
|
||||||
|
if fips140.Enabled() {
|
||||||
|
return 0, fmt.Errorf("ssh: hash algorithm for format %q not allowed in FIPS 140 mode", format)
|
||||||
|
}
|
||||||
|
return crypto.SHA1, nil
|
||||||
|
default:
|
||||||
|
return 0, fmt.Errorf("ssh: hash algorithm for format %q not mapped", format)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SupportedAlgorithms returns algorithms currently implemented by this package,
|
// SupportedAlgorithms returns algorithms currently implemented by this package,
|
||||||
// excluding those with security issues, which are returned by
|
// excluding those with security issues, which are returned by
|
||||||
// InsecureAlgorithms. The algorithms listed here are in preference order.
|
// InsecureAlgorithms. The algorithms listed here are in preference order.
|
||||||
@@ -283,21 +318,6 @@ func InsecureAlgorithms() Algorithms {
|
|||||||
|
|
||||||
var supportedCompressions = []string{compressionNone}
|
var supportedCompressions = []string{compressionNone}
|
||||||
|
|
||||||
// hashFuncs keeps the mapping of supported signature algorithms to their
|
|
||||||
// respective hashes needed for signing and verification.
|
|
||||||
var hashFuncs = map[string]crypto.Hash{
|
|
||||||
KeyAlgoRSA: crypto.SHA1,
|
|
||||||
KeyAlgoRSASHA256: crypto.SHA256,
|
|
||||||
KeyAlgoRSASHA512: crypto.SHA512,
|
|
||||||
InsecureKeyAlgoDSA: crypto.SHA1,
|
|
||||||
KeyAlgoECDSA256: crypto.SHA256,
|
|
||||||
KeyAlgoECDSA384: crypto.SHA384,
|
|
||||||
KeyAlgoECDSA521: crypto.SHA512,
|
|
||||||
// KeyAlgoED25519 doesn't pre-hash.
|
|
||||||
KeyAlgoSKECDSA256: crypto.SHA256,
|
|
||||||
KeyAlgoSKED25519: crypto.SHA256,
|
|
||||||
}
|
|
||||||
|
|
||||||
// algorithmsForKeyFormat returns the supported signature algorithms for a given
|
// algorithmsForKeyFormat returns the supported signature algorithms for a given
|
||||||
// public key format (PublicKey.Type), in order of preference. See RFC 8332,
|
// public key format (PublicKey.Type), in order of preference. See RFC 8332,
|
||||||
// Section 2. See also the note in sendKexInit on backwards compatibility.
|
// Section 2. See also the note in sendKexInit on backwards compatibility.
|
||||||
@@ -312,11 +332,40 @@ func algorithmsForKeyFormat(keyFormat string) []string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// keyFormatForAlgorithm returns the key format corresponding to the given
|
||||||
|
// signature algorithm. It returns an empty string if the signature algorithm is
|
||||||
|
// invalid or unsupported.
|
||||||
|
func keyFormatForAlgorithm(sigAlgo string) string {
|
||||||
|
switch sigAlgo {
|
||||||
|
case KeyAlgoRSA, KeyAlgoRSASHA256, KeyAlgoRSASHA512:
|
||||||
|
return KeyAlgoRSA
|
||||||
|
case CertAlgoRSAv01, CertAlgoRSASHA256v01, CertAlgoRSASHA512v01:
|
||||||
|
return CertAlgoRSAv01
|
||||||
|
case KeyAlgoED25519,
|
||||||
|
KeyAlgoSKED25519,
|
||||||
|
KeyAlgoSKECDSA256,
|
||||||
|
KeyAlgoECDSA256,
|
||||||
|
KeyAlgoECDSA384,
|
||||||
|
KeyAlgoECDSA521,
|
||||||
|
InsecureKeyAlgoDSA,
|
||||||
|
InsecureCertAlgoDSAv01,
|
||||||
|
CertAlgoECDSA256v01,
|
||||||
|
CertAlgoECDSA384v01,
|
||||||
|
CertAlgoECDSA521v01,
|
||||||
|
CertAlgoSKECDSA256v01,
|
||||||
|
CertAlgoED25519v01,
|
||||||
|
CertAlgoSKED25519v01:
|
||||||
|
return sigAlgo
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// isRSA returns whether algo is a supported RSA algorithm, including certificate
|
// isRSA returns whether algo is a supported RSA algorithm, including certificate
|
||||||
// algorithms.
|
// algorithms.
|
||||||
func isRSA(algo string) bool {
|
func isRSA(algo string) bool {
|
||||||
algos := algorithmsForKeyFormat(KeyAlgoRSA)
|
algos := algorithmsForKeyFormat(KeyAlgoRSA)
|
||||||
return contains(algos, underlyingAlgo(algo))
|
return slices.Contains(algos, underlyingAlgo(algo))
|
||||||
}
|
}
|
||||||
|
|
||||||
func isRSACert(algo string) bool {
|
func isRSACert(algo string) bool {
|
||||||
@@ -515,7 +564,7 @@ func (c *Config) SetDefaults() {
|
|||||||
if kexAlgoMap[k] != nil {
|
if kexAlgoMap[k] != nil {
|
||||||
// Ignore the KEX if we have no kexAlgoMap definition.
|
// Ignore the KEX if we have no kexAlgoMap definition.
|
||||||
kexs = append(kexs, k)
|
kexs = append(kexs, k)
|
||||||
if k == KeyExchangeCurve25519 && !contains(c.KeyExchanges, keyExchangeCurve25519LibSSH) {
|
if k == KeyExchangeCurve25519 && !slices.Contains(c.KeyExchanges, keyExchangeCurve25519LibSSH) {
|
||||||
kexs = append(kexs, keyExchangeCurve25519LibSSH)
|
kexs = append(kexs, keyExchangeCurve25519LibSSH)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
@@ -17,8 +17,18 @@ References:
|
|||||||
[PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD
|
[PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD
|
||||||
[SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1
|
[SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1
|
||||||
[SSH-CERTS]: https://datatracker.ietf.org/doc/html/draft-miller-ssh-cert-01
|
[SSH-CERTS]: https://datatracker.ietf.org/doc/html/draft-miller-ssh-cert-01
|
||||||
|
[FIPS 140-3 mode]: https://go.dev/doc/security/fips140
|
||||||
|
|
||||||
This package does not fall under the stability promise of the Go language itself,
|
This package does not fall under the stability promise of the Go language itself,
|
||||||
so its API may be changed when pressing needs arise.
|
so its API may be changed when pressing needs arise.
|
||||||
|
|
||||||
|
# FIPS 140-3 mode
|
||||||
|
|
||||||
|
When the program is in [FIPS 140-3 mode], this package behaves as if only SP
|
||||||
|
800-140C and SP 800-140D approved cipher suites, signature algorithms,
|
||||||
|
certificate public key types and sizes, and key exchange and derivation
|
||||||
|
algorithms were implemented. Others are silently ignored and not negotiated, or
|
||||||
|
rejected. This set may depend on the algorithms supported by the FIPS 140-3 Go
|
||||||
|
Cryptographic Module selected with GOFIPS140, and may change across Go versions.
|
||||||
*/
|
*/
|
||||||
package ssh
|
package ssh
|
||||||
|
|||||||
+5
-4
@@ -10,6 +10,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
@@ -527,7 +528,7 @@ func (t *handshakeTransport) sendKexInit() error {
|
|||||||
switch s := k.(type) {
|
switch s := k.(type) {
|
||||||
case MultiAlgorithmSigner:
|
case MultiAlgorithmSigner:
|
||||||
for _, algo := range algorithmsForKeyFormat(keyFormat) {
|
for _, algo := range algorithmsForKeyFormat(keyFormat) {
|
||||||
if contains(s.Algorithms(), underlyingAlgo(algo)) {
|
if slices.Contains(s.Algorithms(), underlyingAlgo(algo)) {
|
||||||
msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, algo)
|
msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, algo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -679,7 +680,7 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if t.sessionID == nil && ((isClient && contains(serverInit.KexAlgos, kexStrictServer)) || (!isClient && contains(clientInit.KexAlgos, kexStrictClient))) {
|
if t.sessionID == nil && ((isClient && slices.Contains(serverInit.KexAlgos, kexStrictServer)) || (!isClient && slices.Contains(clientInit.KexAlgos, kexStrictClient))) {
|
||||||
t.strictMode = true
|
t.strictMode = true
|
||||||
if err := t.conn.setStrictMode(); err != nil {
|
if err := t.conn.setStrictMode(); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -736,7 +737,7 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {
|
|||||||
// On the server side, after the first SSH_MSG_NEWKEYS, send a SSH_MSG_EXT_INFO
|
// On the server side, after the first SSH_MSG_NEWKEYS, send a SSH_MSG_EXT_INFO
|
||||||
// message with the server-sig-algs extension if the client supports it. See
|
// message with the server-sig-algs extension if the client supports it. See
|
||||||
// RFC 8308, Sections 2.4 and 3.1, and [PROTOCOL], Section 1.9.
|
// RFC 8308, Sections 2.4 and 3.1, and [PROTOCOL], Section 1.9.
|
||||||
if !isClient && firstKeyExchange && contains(clientInit.KexAlgos, "ext-info-c") {
|
if !isClient && firstKeyExchange && slices.Contains(clientInit.KexAlgos, "ext-info-c") {
|
||||||
supportedPubKeyAuthAlgosList := strings.Join(t.publicKeyAuthAlgorithms, ",")
|
supportedPubKeyAuthAlgosList := strings.Join(t.publicKeyAuthAlgorithms, ",")
|
||||||
extInfo := &extInfoMsg{
|
extInfo := &extInfoMsg{
|
||||||
NumExtensions: 2,
|
NumExtensions: 2,
|
||||||
@@ -790,7 +791,7 @@ func (a algorithmSignerWrapper) SignWithAlgorithm(rand io.Reader, data []byte, a
|
|||||||
func pickHostKey(hostKeys []Signer, algo string) AlgorithmSigner {
|
func pickHostKey(hostKeys []Signer, algo string) AlgorithmSigner {
|
||||||
for _, k := range hostKeys {
|
for _, k := range hostKeys {
|
||||||
if s, ok := k.(MultiAlgorithmSigner); ok {
|
if s, ok := k.(MultiAlgorithmSigner); ok {
|
||||||
if !contains(s.Algorithms(), underlyingAlgo(algo)) {
|
if !slices.Contains(s.Algorithms(), underlyingAlgo(algo)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-4
@@ -8,12 +8,14 @@ import (
|
|||||||
"crypto"
|
"crypto"
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"crypto/elliptic"
|
"crypto/elliptic"
|
||||||
|
"crypto/fips140"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"golang.org/x/crypto/curve25519"
|
"golang.org/x/crypto/curve25519"
|
||||||
)
|
)
|
||||||
@@ -395,9 +397,27 @@ func ecHash(curve elliptic.Curve) crypto.Hash {
|
|||||||
return crypto.SHA512
|
return crypto.SHA512
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// kexAlgoMap defines the supported KEXs. KEXs not included are not supported
|
||||||
|
// and will not be negotiated, even if explicitly configured. When FIPS mode is
|
||||||
|
// enabled, only FIPS-approved algorithms are included.
|
||||||
var kexAlgoMap = map[string]kexAlgorithm{}
|
var kexAlgoMap = map[string]kexAlgorithm{}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
// mlkem768x25519-sha256 we'll work with fips140=on but not fips140=only
|
||||||
|
// until Go 1.26.
|
||||||
|
kexAlgoMap[KeyExchangeMLKEM768X25519] = &mlkem768WithCurve25519sha256{}
|
||||||
|
kexAlgoMap[KeyExchangeECDHP521] = &ecdh{elliptic.P521()}
|
||||||
|
kexAlgoMap[KeyExchangeECDHP384] = &ecdh{elliptic.P384()}
|
||||||
|
kexAlgoMap[KeyExchangeECDHP256] = &ecdh{elliptic.P256()}
|
||||||
|
|
||||||
|
if fips140.Enabled() {
|
||||||
|
defaultKexAlgos = slices.DeleteFunc(defaultKexAlgos, func(algo string) bool {
|
||||||
|
_, ok := kexAlgoMap[algo]
|
||||||
|
return !ok
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
p, _ := new(big.Int).SetString(oakleyGroup2, 16)
|
p, _ := new(big.Int).SetString(oakleyGroup2, 16)
|
||||||
kexAlgoMap[InsecureKeyExchangeDH1SHA1] = &dhGroup{
|
kexAlgoMap[InsecureKeyExchangeDH1SHA1] = &dhGroup{
|
||||||
g: new(big.Int).SetInt64(2),
|
g: new(big.Int).SetInt64(2),
|
||||||
@@ -431,14 +451,10 @@ func init() {
|
|||||||
hashFunc: crypto.SHA512,
|
hashFunc: crypto.SHA512,
|
||||||
}
|
}
|
||||||
|
|
||||||
kexAlgoMap[KeyExchangeECDHP521] = &ecdh{elliptic.P521()}
|
|
||||||
kexAlgoMap[KeyExchangeECDHP384] = &ecdh{elliptic.P384()}
|
|
||||||
kexAlgoMap[KeyExchangeECDHP256] = &ecdh{elliptic.P256()}
|
|
||||||
kexAlgoMap[KeyExchangeCurve25519] = &curve25519sha256{}
|
kexAlgoMap[KeyExchangeCurve25519] = &curve25519sha256{}
|
||||||
kexAlgoMap[keyExchangeCurve25519LibSSH] = &curve25519sha256{}
|
kexAlgoMap[keyExchangeCurve25519LibSSH] = &curve25519sha256{}
|
||||||
kexAlgoMap[InsecureKeyExchangeDHGEXSHA1] = &dhGEXSHA{hashFunc: crypto.SHA1}
|
kexAlgoMap[InsecureKeyExchangeDHGEXSHA1] = &dhGEXSHA{hashFunc: crypto.SHA1}
|
||||||
kexAlgoMap[KeyExchangeDHGEXSHA256] = &dhGEXSHA{hashFunc: crypto.SHA256}
|
kexAlgoMap[KeyExchangeDHGEXSHA256] = &dhGEXSHA{hashFunc: crypto.SHA256}
|
||||||
kexAlgoMap[KeyExchangeMLKEM768X25519] = &mlkem768WithCurve25519sha256{}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// curve25519sha256 implements the curve25519-sha256 (formerly known as
|
// curve25519sha256 implements the curve25519-sha256 (formerly known as
|
||||||
|
|||||||
+54
-15
@@ -27,6 +27,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/crypto/ssh/internal/bcrypt_pbkdf"
|
"golang.org/x/crypto/ssh/internal/bcrypt_pbkdf"
|
||||||
@@ -89,6 +90,11 @@ func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err err
|
|||||||
}
|
}
|
||||||
return cert, nil, nil
|
return cert, nil, nil
|
||||||
}
|
}
|
||||||
|
if keyFormat := keyFormatForAlgorithm(algo); keyFormat != "" {
|
||||||
|
return nil, nil, fmt.Errorf("ssh: signature algorithm %q isn't a key format; key is malformed and should be re-encoded with type %q",
|
||||||
|
algo, keyFormat)
|
||||||
|
}
|
||||||
|
|
||||||
return nil, nil, fmt.Errorf("ssh: unknown key algorithm: %v", algo)
|
return nil, nil, fmt.Errorf("ssh: unknown key algorithm: %v", algo)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,9 +197,10 @@ func ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey
|
|||||||
return "", nil, nil, "", nil, io.EOF
|
return "", nil, nil, "", nil, io.EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParseAuthorizedKey parses a public key from an authorized_keys
|
// ParseAuthorizedKey parses a public key from an authorized_keys file used in
|
||||||
// file used in OpenSSH according to the sshd(8) manual page.
|
// OpenSSH according to the sshd(8) manual page. Invalid lines are ignored.
|
||||||
func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) {
|
func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) {
|
||||||
|
var lastErr error
|
||||||
for len(in) > 0 {
|
for len(in) > 0 {
|
||||||
end := bytes.IndexByte(in, '\n')
|
end := bytes.IndexByte(in, '\n')
|
||||||
if end != -1 {
|
if end != -1 {
|
||||||
@@ -222,6 +229,8 @@ func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []str
|
|||||||
|
|
||||||
if out, comment, err = parseAuthorizedKey(in[i:]); err == nil {
|
if out, comment, err = parseAuthorizedKey(in[i:]); err == nil {
|
||||||
return out, comment, options, rest, nil
|
return out, comment, options, rest, nil
|
||||||
|
} else {
|
||||||
|
lastErr = err
|
||||||
}
|
}
|
||||||
|
|
||||||
// No key type recognised. Maybe there's an options field at
|
// No key type recognised. Maybe there's an options field at
|
||||||
@@ -264,12 +273,18 @@ func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []str
|
|||||||
if out, comment, err = parseAuthorizedKey(in[i:]); err == nil {
|
if out, comment, err = parseAuthorizedKey(in[i:]); err == nil {
|
||||||
options = candidateOptions
|
options = candidateOptions
|
||||||
return out, comment, options, rest, nil
|
return out, comment, options, rest, nil
|
||||||
|
} else {
|
||||||
|
lastErr = err
|
||||||
}
|
}
|
||||||
|
|
||||||
in = rest
|
in = rest
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if lastErr != nil {
|
||||||
|
return nil, "", nil, nil, fmt.Errorf("ssh: no key found; last parsing error for ignored line: %w", lastErr)
|
||||||
|
}
|
||||||
|
|
||||||
return nil, "", nil, nil, errors.New("ssh: no key found")
|
return nil, "", nil, nil, errors.New("ssh: no key found")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,11 +410,11 @@ func NewSignerWithAlgorithms(signer AlgorithmSigner, algorithms []string) (Multi
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, algo := range algorithms {
|
for _, algo := range algorithms {
|
||||||
if !contains(supportedAlgos, algo) {
|
if !slices.Contains(supportedAlgos, algo) {
|
||||||
return nil, fmt.Errorf("ssh: algorithm %q is not supported for key type %q",
|
return nil, fmt.Errorf("ssh: algorithm %q is not supported for key type %q",
|
||||||
algo, signer.PublicKey().Type())
|
algo, signer.PublicKey().Type())
|
||||||
}
|
}
|
||||||
if !contains(signerAlgos, algo) {
|
if !slices.Contains(signerAlgos, algo) {
|
||||||
return nil, fmt.Errorf("ssh: algorithm %q is restricted for the provided signer", algo)
|
return nil, fmt.Errorf("ssh: algorithm %q is restricted for the provided signer", algo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -486,10 +501,13 @@ func (r *rsaPublicKey) Marshal() []byte {
|
|||||||
|
|
||||||
func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error {
|
func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error {
|
||||||
supportedAlgos := algorithmsForKeyFormat(r.Type())
|
supportedAlgos := algorithmsForKeyFormat(r.Type())
|
||||||
if !contains(supportedAlgos, sig.Format) {
|
if !slices.Contains(supportedAlgos, sig.Format) {
|
||||||
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type())
|
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type())
|
||||||
}
|
}
|
||||||
hash := hashFuncs[sig.Format]
|
hash, err := hashFunc(sig.Format)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
h := hash.New()
|
h := hash.New()
|
||||||
h.Write(data)
|
h.Write(data)
|
||||||
digest := h.Sum(nil)
|
digest := h.Sum(nil)
|
||||||
@@ -606,7 +624,11 @@ func (k *dsaPublicKey) Verify(data []byte, sig *Signature) error {
|
|||||||
if sig.Format != k.Type() {
|
if sig.Format != k.Type() {
|
||||||
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
||||||
}
|
}
|
||||||
h := hashFuncs[sig.Format].New()
|
hash, err := hashFunc(sig.Format)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
h := hash.New()
|
||||||
h.Write(data)
|
h.Write(data)
|
||||||
digest := h.Sum(nil)
|
digest := h.Sum(nil)
|
||||||
|
|
||||||
@@ -651,7 +673,11 @@ func (k *dsaPrivateKey) SignWithAlgorithm(rand io.Reader, data []byte, algorithm
|
|||||||
return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm)
|
return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm)
|
||||||
}
|
}
|
||||||
|
|
||||||
h := hashFuncs[k.PublicKey().Type()].New()
|
hash, err := hashFunc(k.PublicKey().Type())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
h := hash.New()
|
||||||
h.Write(data)
|
h.Write(data)
|
||||||
digest := h.Sum(nil)
|
digest := h.Sum(nil)
|
||||||
r, s, err := dsa.Sign(rand, k.PrivateKey, digest)
|
r, s, err := dsa.Sign(rand, k.PrivateKey, digest)
|
||||||
@@ -801,8 +827,11 @@ func (k *ecdsaPublicKey) Verify(data []byte, sig *Signature) error {
|
|||||||
if sig.Format != k.Type() {
|
if sig.Format != k.Type() {
|
||||||
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
||||||
}
|
}
|
||||||
|
hash, err := hashFunc(sig.Format)
|
||||||
h := hashFuncs[sig.Format].New()
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
h := hash.New()
|
||||||
h.Write(data)
|
h.Write(data)
|
||||||
digest := h.Sum(nil)
|
digest := h.Sum(nil)
|
||||||
|
|
||||||
@@ -905,8 +934,11 @@ func (k *skECDSAPublicKey) Verify(data []byte, sig *Signature) error {
|
|||||||
if sig.Format != k.Type() {
|
if sig.Format != k.Type() {
|
||||||
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
||||||
}
|
}
|
||||||
|
hash, err := hashFunc(sig.Format)
|
||||||
h := hashFuncs[sig.Format].New()
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
h := hash.New()
|
||||||
h.Write([]byte(k.application))
|
h.Write([]byte(k.application))
|
||||||
appDigest := h.Sum(nil)
|
appDigest := h.Sum(nil)
|
||||||
|
|
||||||
@@ -1009,7 +1041,11 @@ func (k *skEd25519PublicKey) Verify(data []byte, sig *Signature) error {
|
|||||||
return fmt.Errorf("invalid size %d for Ed25519 public key", l)
|
return fmt.Errorf("invalid size %d for Ed25519 public key", l)
|
||||||
}
|
}
|
||||||
|
|
||||||
h := hashFuncs[sig.Format].New()
|
hash, err := hashFunc(sig.Format)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
h := hash.New()
|
||||||
h.Write([]byte(k.application))
|
h.Write([]byte(k.application))
|
||||||
appDigest := h.Sum(nil)
|
appDigest := h.Sum(nil)
|
||||||
|
|
||||||
@@ -1112,11 +1148,14 @@ func (s *wrappedSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm
|
|||||||
algorithm = s.pubKey.Type()
|
algorithm = s.pubKey.Type()
|
||||||
}
|
}
|
||||||
|
|
||||||
if !contains(s.Algorithms(), algorithm) {
|
if !slices.Contains(s.Algorithms(), algorithm) {
|
||||||
return nil, fmt.Errorf("ssh: unsupported signature algorithm %q for key format %q", algorithm, s.pubKey.Type())
|
return nil, fmt.Errorf("ssh: unsupported signature algorithm %q for key format %q", algorithm, s.pubKey.Type())
|
||||||
}
|
}
|
||||||
|
|
||||||
hashFunc := hashFuncs[algorithm]
|
hashFunc, err := hashFunc(algorithm)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
var digest []byte
|
var digest []byte
|
||||||
if hashFunc != 0 {
|
if hashFunc != 0 {
|
||||||
h := hashFunc.New()
|
h := hashFunc.New()
|
||||||
|
|||||||
+29
-13
@@ -7,11 +7,13 @@ package ssh
|
|||||||
// Message authentication support
|
// Message authentication support
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/fips140"
|
||||||
"crypto/hmac"
|
"crypto/hmac"
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"crypto/sha512"
|
"crypto/sha512"
|
||||||
"hash"
|
"hash"
|
||||||
|
"slices"
|
||||||
)
|
)
|
||||||
|
|
||||||
type macMode struct {
|
type macMode struct {
|
||||||
@@ -46,23 +48,37 @@ func (t truncatingMAC) Size() int {
|
|||||||
|
|
||||||
func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() }
|
func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() }
|
||||||
|
|
||||||
var macModes = map[string]*macMode{
|
// macModes defines the supported MACs. MACs not included are not supported
|
||||||
HMACSHA512ETM: {64, true, func(key []byte) hash.Hash {
|
// and will not be negotiated, even if explicitly configured. When FIPS mode is
|
||||||
|
// enabled, only FIPS-approved algorithms are included.
|
||||||
|
var macModes = map[string]*macMode{}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
macModes[HMACSHA512ETM] = &macMode{64, true, func(key []byte) hash.Hash {
|
||||||
return hmac.New(sha512.New, key)
|
return hmac.New(sha512.New, key)
|
||||||
}},
|
}}
|
||||||
HMACSHA256ETM: {32, true, func(key []byte) hash.Hash {
|
macModes[HMACSHA256ETM] = &macMode{32, true, func(key []byte) hash.Hash {
|
||||||
return hmac.New(sha256.New, key)
|
return hmac.New(sha256.New, key)
|
||||||
}},
|
}}
|
||||||
HMACSHA512: {64, false, func(key []byte) hash.Hash {
|
macModes[HMACSHA512] = &macMode{64, false, func(key []byte) hash.Hash {
|
||||||
return hmac.New(sha512.New, key)
|
return hmac.New(sha512.New, key)
|
||||||
}},
|
}}
|
||||||
HMACSHA256: {32, false, func(key []byte) hash.Hash {
|
macModes[HMACSHA256] = &macMode{32, false, func(key []byte) hash.Hash {
|
||||||
return hmac.New(sha256.New, key)
|
return hmac.New(sha256.New, key)
|
||||||
}},
|
}}
|
||||||
HMACSHA1: {20, false, func(key []byte) hash.Hash {
|
|
||||||
|
if fips140.Enabled() {
|
||||||
|
defaultMACs = slices.DeleteFunc(defaultMACs, func(algo string) bool {
|
||||||
|
_, ok := macModes[algo]
|
||||||
|
return !ok
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
macModes[HMACSHA1] = &macMode{20, false, func(key []byte) hash.Hash {
|
||||||
return hmac.New(sha1.New, key)
|
return hmac.New(sha1.New, key)
|
||||||
}},
|
}}
|
||||||
InsecureHMACSHA196: {20, false, func(key []byte) hash.Hash {
|
macModes[InsecureHMACSHA196] = &macMode{20, false, func(key []byte) hash.Hash {
|
||||||
return truncatingMAC{12, hmac.New(sha1.New, key)}
|
return truncatingMAC{12, hmac.New(sha1.New, key)}
|
||||||
}},
|
}}
|
||||||
}
|
}
|
||||||
|
|||||||
+32
-4
@@ -10,6 +10,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -43,6 +44,9 @@ type Permissions struct {
|
|||||||
// pass data from the authentication callbacks to the server
|
// pass data from the authentication callbacks to the server
|
||||||
// application layer.
|
// application layer.
|
||||||
Extensions map[string]string
|
Extensions map[string]string
|
||||||
|
|
||||||
|
// ExtraData allows to store user defined data.
|
||||||
|
ExtraData map[any]any
|
||||||
}
|
}
|
||||||
|
|
||||||
type GSSAPIWithMICConfig struct {
|
type GSSAPIWithMICConfig struct {
|
||||||
@@ -126,6 +130,21 @@ type ServerConfig struct {
|
|||||||
// Permissions.Extensions entry.
|
// Permissions.Extensions entry.
|
||||||
PublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error)
|
PublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error)
|
||||||
|
|
||||||
|
// VerifiedPublicKeyCallback, if non-nil, is called after a client
|
||||||
|
// successfully confirms having control over a key that was previously
|
||||||
|
// approved by PublicKeyCallback. The permissions object passed to the
|
||||||
|
// callback is the one returned by PublicKeyCallback for the given public
|
||||||
|
// key and its ownership is transferred to the callback. The returned
|
||||||
|
// Permissions object can be the same object, optionally modified, or a
|
||||||
|
// completely new object. If VerifiedPublicKeyCallback is non-nil,
|
||||||
|
// PublicKeyCallback is not allowed to return a PartialSuccessError, which
|
||||||
|
// can instead be returned by VerifiedPublicKeyCallback.
|
||||||
|
//
|
||||||
|
// VerifiedPublicKeyCallback does not affect which authentication methods
|
||||||
|
// are included in the list of methods that can be attempted by the client.
|
||||||
|
VerifiedPublicKeyCallback func(conn ConnMetadata, key PublicKey, permissions *Permissions,
|
||||||
|
signatureAlgorithm string) (*Permissions, error)
|
||||||
|
|
||||||
// KeyboardInteractiveCallback, if non-nil, is called when
|
// KeyboardInteractiveCallback, if non-nil, is called when
|
||||||
// keyboard-interactive authentication is selected (RFC
|
// keyboard-interactive authentication is selected (RFC
|
||||||
// 4256). The client object's Challenge function should be
|
// 4256). The client object's Challenge function should be
|
||||||
@@ -246,7 +265,7 @@ func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewCha
|
|||||||
fullConf.PublicKeyAuthAlgorithms = defaultPubKeyAuthAlgos
|
fullConf.PublicKeyAuthAlgorithms = defaultPubKeyAuthAlgos
|
||||||
} else {
|
} else {
|
||||||
for _, algo := range fullConf.PublicKeyAuthAlgorithms {
|
for _, algo := range fullConf.PublicKeyAuthAlgorithms {
|
||||||
if !contains(SupportedAlgorithms().PublicKeyAuths, algo) && !contains(InsecureAlgorithms().PublicKeyAuths, algo) {
|
if !slices.Contains(SupportedAlgorithms().PublicKeyAuths, algo) && !slices.Contains(InsecureAlgorithms().PublicKeyAuths, algo) {
|
||||||
c.Close()
|
c.Close()
|
||||||
return nil, nil, nil, fmt.Errorf("ssh: unsupported public key authentication algorithm %s", algo)
|
return nil, nil, nil, fmt.Errorf("ssh: unsupported public key authentication algorithm %s", algo)
|
||||||
}
|
}
|
||||||
@@ -631,7 +650,7 @@ userAuthLoop:
|
|||||||
return nil, parseError(msgUserAuthRequest)
|
return nil, parseError(msgUserAuthRequest)
|
||||||
}
|
}
|
||||||
algo := string(algoBytes)
|
algo := string(algoBytes)
|
||||||
if !contains(config.PublicKeyAuthAlgorithms, underlyingAlgo(algo)) {
|
if !slices.Contains(config.PublicKeyAuthAlgorithms, underlyingAlgo(algo)) {
|
||||||
authErr = fmt.Errorf("ssh: algorithm %q not accepted", algo)
|
authErr = fmt.Errorf("ssh: algorithm %q not accepted", algo)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -652,6 +671,9 @@ userAuthLoop:
|
|||||||
candidate.pubKeyData = pubKeyData
|
candidate.pubKeyData = pubKeyData
|
||||||
candidate.perms, candidate.result = authConfig.PublicKeyCallback(s, pubKey)
|
candidate.perms, candidate.result = authConfig.PublicKeyCallback(s, pubKey)
|
||||||
_, isPartialSuccessError := candidate.result.(*PartialSuccessError)
|
_, isPartialSuccessError := candidate.result.(*PartialSuccessError)
|
||||||
|
if isPartialSuccessError && config.VerifiedPublicKeyCallback != nil {
|
||||||
|
return nil, errors.New("ssh: invalid library usage: PublicKeyCallback must not return partial success when VerifiedPublicKeyCallback is defined")
|
||||||
|
}
|
||||||
|
|
||||||
if (candidate.result == nil || isPartialSuccessError) &&
|
if (candidate.result == nil || isPartialSuccessError) &&
|
||||||
candidate.perms != nil &&
|
candidate.perms != nil &&
|
||||||
@@ -695,7 +717,7 @@ userAuthLoop:
|
|||||||
// ssh-rsa-cert-v01@openssh.com algorithm with ssh-rsa public
|
// ssh-rsa-cert-v01@openssh.com algorithm with ssh-rsa public
|
||||||
// key type. The algorithm and public key type must be
|
// key type. The algorithm and public key type must be
|
||||||
// consistent: both must be certificate algorithms, or neither.
|
// consistent: both must be certificate algorithms, or neither.
|
||||||
if !contains(algorithmsForKeyFormat(pubKey.Type()), algo) {
|
if !slices.Contains(algorithmsForKeyFormat(pubKey.Type()), algo) {
|
||||||
authErr = fmt.Errorf("ssh: public key type %q not compatible with selected algorithm %q",
|
authErr = fmt.Errorf("ssh: public key type %q not compatible with selected algorithm %q",
|
||||||
pubKey.Type(), algo)
|
pubKey.Type(), algo)
|
||||||
break
|
break
|
||||||
@@ -705,7 +727,7 @@ userAuthLoop:
|
|||||||
// algorithm name that corresponds to algo with
|
// algorithm name that corresponds to algo with
|
||||||
// sig.Format. This is usually the same, but
|
// sig.Format. This is usually the same, but
|
||||||
// for certs, the names differ.
|
// for certs, the names differ.
|
||||||
if !contains(config.PublicKeyAuthAlgorithms, sig.Format) {
|
if !slices.Contains(config.PublicKeyAuthAlgorithms, sig.Format) {
|
||||||
authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format)
|
authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -722,6 +744,12 @@ userAuthLoop:
|
|||||||
|
|
||||||
authErr = candidate.result
|
authErr = candidate.result
|
||||||
perms = candidate.perms
|
perms = candidate.perms
|
||||||
|
if authErr == nil && config.VerifiedPublicKeyCallback != nil {
|
||||||
|
// Only call VerifiedPublicKeyCallback after the key has been accepted
|
||||||
|
// and successfully verified. If authErr is non-nil, the key is not
|
||||||
|
// considered verified and the callback must not run.
|
||||||
|
perms, authErr = config.VerifiedPublicKeyCallback(s, pubKey, perms, algo)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case "gssapi-with-mic":
|
case "gssapi-with-mic":
|
||||||
if authConfig.GSSAPIWithMICConfig == nil {
|
if authConfig.GSSAPIWithMICConfig == nil {
|
||||||
|
|||||||
+4
@@ -8,6 +8,7 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
)
|
)
|
||||||
@@ -254,6 +255,9 @@ var (
|
|||||||
// (to setup server->client keys) or clientKeys (for client->server keys).
|
// (to setup server->client keys) or clientKeys (for client->server keys).
|
||||||
func newPacketCipher(d direction, algs DirectionAlgorithms, kex *kexResult) (packetCipher, error) {
|
func newPacketCipher(d direction, algs DirectionAlgorithms, kex *kexResult) (packetCipher, error) {
|
||||||
cipherMode := cipherModes[algs.Cipher]
|
cipherMode := cipherModes[algs.Cipher]
|
||||||
|
if cipherMode == nil {
|
||||||
|
return nil, fmt.Errorf("ssh: unsupported cipher %v", algs.Cipher)
|
||||||
|
}
|
||||||
|
|
||||||
iv := make([]byte, cipherMode.ivSize)
|
iv := make([]byte, cipherMode.ivSize)
|
||||||
key := make([]byte, cipherMode.keySize)
|
key := make([]byte, cipherMode.keySize)
|
||||||
|
|||||||
+1
-1
@@ -299,7 +299,7 @@ func escape(w writer, s string) error {
|
|||||||
case '\r':
|
case '\r':
|
||||||
esc = " "
|
esc = " "
|
||||||
default:
|
default:
|
||||||
panic("unrecognized escape character")
|
panic("html: unrecognized escape character")
|
||||||
}
|
}
|
||||||
s = s[i+1:]
|
s = s[i+1:]
|
||||||
if _, err := w.WriteString(esc); err != nil {
|
if _, err := w.WriteString(esc); err != nil {
|
||||||
|
|||||||
+41
-16
@@ -136,7 +136,7 @@ func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int {
|
|||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
panic("unreachable")
|
panic(fmt.Sprintf("html: internal error: indexOfElementInScope unknown scope: %d", s))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch s {
|
switch s {
|
||||||
@@ -179,7 +179,7 @@ func (p *parser) clearStackToContext(s scope) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
panic("unreachable")
|
panic(fmt.Sprintf("html: internal error: clearStackToContext unknown scope: %d", s))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -231,7 +231,14 @@ func (p *parser) addChild(n *Node) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if n.Type == ElementNode {
|
if n.Type == ElementNode {
|
||||||
p.oe = append(p.oe, n)
|
p.insertOpenElement(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *parser) insertOpenElement(n *Node) {
|
||||||
|
p.oe = append(p.oe, n)
|
||||||
|
if len(p.oe) > 512 {
|
||||||
|
panic("html: open stack of elements exceeds 512 nodes")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -810,7 +817,7 @@ func afterHeadIM(p *parser) bool {
|
|||||||
p.im = inFramesetIM
|
p.im = inFramesetIM
|
||||||
return true
|
return true
|
||||||
case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title:
|
case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title:
|
||||||
p.oe = append(p.oe, p.head)
|
p.insertOpenElement(p.head)
|
||||||
defer p.oe.remove(p.head)
|
defer p.oe.remove(p.head)
|
||||||
return inHeadIM(p)
|
return inHeadIM(p)
|
||||||
case a.Head:
|
case a.Head:
|
||||||
@@ -1678,7 +1685,7 @@ func inTableBodyIM(p *parser) bool {
|
|||||||
return inTableIM(p)
|
return inTableIM(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Section 12.2.6.4.14.
|
// Section 13.2.6.4.14.
|
||||||
func inRowIM(p *parser) bool {
|
func inRowIM(p *parser) bool {
|
||||||
switch p.tok.Type {
|
switch p.tok.Type {
|
||||||
case StartTagToken:
|
case StartTagToken:
|
||||||
@@ -1690,7 +1697,9 @@ func inRowIM(p *parser) bool {
|
|||||||
p.im = inCellIM
|
p.im = inCellIM
|
||||||
return true
|
return true
|
||||||
case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead, a.Tr:
|
case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead, a.Tr:
|
||||||
if p.popUntil(tableScope, a.Tr) {
|
if p.elementInScope(tableScope, a.Tr) {
|
||||||
|
p.clearStackToContext(tableRowScope)
|
||||||
|
p.oe.pop()
|
||||||
p.im = inTableBodyIM
|
p.im = inTableBodyIM
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -1700,22 +1709,28 @@ func inRowIM(p *parser) bool {
|
|||||||
case EndTagToken:
|
case EndTagToken:
|
||||||
switch p.tok.DataAtom {
|
switch p.tok.DataAtom {
|
||||||
case a.Tr:
|
case a.Tr:
|
||||||
if p.popUntil(tableScope, a.Tr) {
|
if p.elementInScope(tableScope, a.Tr) {
|
||||||
|
p.clearStackToContext(tableRowScope)
|
||||||
|
p.oe.pop()
|
||||||
p.im = inTableBodyIM
|
p.im = inTableBodyIM
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// Ignore the token.
|
// Ignore the token.
|
||||||
return true
|
return true
|
||||||
case a.Table:
|
case a.Table:
|
||||||
if p.popUntil(tableScope, a.Tr) {
|
if p.elementInScope(tableScope, a.Tr) {
|
||||||
|
p.clearStackToContext(tableRowScope)
|
||||||
|
p.oe.pop()
|
||||||
p.im = inTableBodyIM
|
p.im = inTableBodyIM
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
// Ignore the token.
|
// Ignore the token.
|
||||||
return true
|
return true
|
||||||
case a.Tbody, a.Tfoot, a.Thead:
|
case a.Tbody, a.Tfoot, a.Thead:
|
||||||
if p.elementInScope(tableScope, p.tok.DataAtom) {
|
if p.elementInScope(tableScope, p.tok.DataAtom) && p.elementInScope(tableScope, a.Tr) {
|
||||||
p.parseImpliedToken(EndTagToken, a.Tr, a.Tr.String())
|
p.clearStackToContext(tableRowScope)
|
||||||
|
p.oe.pop()
|
||||||
|
p.im = inTableBodyIM
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
// Ignore the token.
|
// Ignore the token.
|
||||||
@@ -2222,16 +2237,20 @@ func parseForeignContent(p *parser) bool {
|
|||||||
p.acknowledgeSelfClosingTag()
|
p.acknowledgeSelfClosingTag()
|
||||||
}
|
}
|
||||||
case EndTagToken:
|
case EndTagToken:
|
||||||
|
if strings.EqualFold(p.oe[len(p.oe)-1].Data, p.tok.Data) {
|
||||||
|
p.oe = p.oe[:len(p.oe)-1]
|
||||||
|
return true
|
||||||
|
}
|
||||||
for i := len(p.oe) - 1; i >= 0; i-- {
|
for i := len(p.oe) - 1; i >= 0; i-- {
|
||||||
if p.oe[i].Namespace == "" {
|
|
||||||
return p.im(p)
|
|
||||||
}
|
|
||||||
if strings.EqualFold(p.oe[i].Data, p.tok.Data) {
|
if strings.EqualFold(p.oe[i].Data, p.tok.Data) {
|
||||||
p.oe = p.oe[:i]
|
p.oe = p.oe[:i]
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if i > 0 && p.oe[i-1].Namespace == "" {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return p.im(p)
|
||||||
default:
|
default:
|
||||||
// Ignore the token.
|
// Ignore the token.
|
||||||
}
|
}
|
||||||
@@ -2312,9 +2331,13 @@ func (p *parser) parseCurrentToken() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *parser) parse() error {
|
func (p *parser) parse() (err error) {
|
||||||
|
defer func() {
|
||||||
|
if panicErr := recover(); panicErr != nil {
|
||||||
|
err = fmt.Errorf("%s", panicErr)
|
||||||
|
}
|
||||||
|
}()
|
||||||
// Iterate until EOF. Any other error will cause an early return.
|
// Iterate until EOF. Any other error will cause an early return.
|
||||||
var err error
|
|
||||||
for err != io.EOF {
|
for err != io.EOF {
|
||||||
// CDATA sections are allowed only in foreign content.
|
// CDATA sections are allowed only in foreign content.
|
||||||
n := p.oe.top()
|
n := p.oe.top()
|
||||||
@@ -2343,6 +2366,8 @@ func (p *parser) parse() error {
|
|||||||
// <tag>s. Conversely, explicit <tag>s in r's data can be silently dropped,
|
// <tag>s. Conversely, explicit <tag>s in r's data can be silently dropped,
|
||||||
// with no corresponding node in the resulting tree.
|
// with no corresponding node in the resulting tree.
|
||||||
//
|
//
|
||||||
|
// Parse will reject HTML that is nested deeper than 512 elements.
|
||||||
|
//
|
||||||
// The input is assumed to be UTF-8 encoded.
|
// The input is assumed to be UTF-8 encoded.
|
||||||
func Parse(r io.Reader) (*Node, error) {
|
func Parse(r io.Reader) (*Node, error) {
|
||||||
return ParseWithOptions(r)
|
return ParseWithOptions(r)
|
||||||
|
|||||||
+1
-1
@@ -184,7 +184,7 @@ func render1(w writer, n *Node) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add initial newline where there is danger of a newline beging ignored.
|
// Add initial newline where there is danger of a newline being ignored.
|
||||||
if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") {
|
if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") {
|
||||||
switch n.Data {
|
switch n.Data {
|
||||||
case "pre", "listing", "textarea":
|
case "pre", "listing", "textarea":
|
||||||
|
|||||||
+11
-6
@@ -27,6 +27,7 @@ import (
|
|||||||
// - If the resulting value is zero or out of range, use a default.
|
// - If the resulting value is zero or out of range, use a default.
|
||||||
type http2Config struct {
|
type http2Config struct {
|
||||||
MaxConcurrentStreams uint32
|
MaxConcurrentStreams uint32
|
||||||
|
StrictMaxConcurrentRequests bool
|
||||||
MaxDecoderHeaderTableSize uint32
|
MaxDecoderHeaderTableSize uint32
|
||||||
MaxEncoderHeaderTableSize uint32
|
MaxEncoderHeaderTableSize uint32
|
||||||
MaxReadFrameSize uint32
|
MaxReadFrameSize uint32
|
||||||
@@ -64,12 +65,13 @@ func configFromServer(h1 *http.Server, h2 *Server) http2Config {
|
|||||||
// (the net/http Transport).
|
// (the net/http Transport).
|
||||||
func configFromTransport(h2 *Transport) http2Config {
|
func configFromTransport(h2 *Transport) http2Config {
|
||||||
conf := http2Config{
|
conf := http2Config{
|
||||||
MaxEncoderHeaderTableSize: h2.MaxEncoderHeaderTableSize,
|
StrictMaxConcurrentRequests: h2.StrictMaxConcurrentStreams,
|
||||||
MaxDecoderHeaderTableSize: h2.MaxDecoderHeaderTableSize,
|
MaxEncoderHeaderTableSize: h2.MaxEncoderHeaderTableSize,
|
||||||
MaxReadFrameSize: h2.MaxReadFrameSize,
|
MaxDecoderHeaderTableSize: h2.MaxDecoderHeaderTableSize,
|
||||||
SendPingTimeout: h2.ReadIdleTimeout,
|
MaxReadFrameSize: h2.MaxReadFrameSize,
|
||||||
PingTimeout: h2.PingTimeout,
|
SendPingTimeout: h2.ReadIdleTimeout,
|
||||||
WriteByteTimeout: h2.WriteByteTimeout,
|
PingTimeout: h2.PingTimeout,
|
||||||
|
WriteByteTimeout: h2.WriteByteTimeout,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlike most config fields, where out-of-range values revert to the default,
|
// Unlike most config fields, where out-of-range values revert to the default,
|
||||||
@@ -128,6 +130,9 @@ func fillNetHTTPConfig(conf *http2Config, h2 *http.HTTP2Config) {
|
|||||||
if h2.MaxConcurrentStreams != 0 {
|
if h2.MaxConcurrentStreams != 0 {
|
||||||
conf.MaxConcurrentStreams = uint32(h2.MaxConcurrentStreams)
|
conf.MaxConcurrentStreams = uint32(h2.MaxConcurrentStreams)
|
||||||
}
|
}
|
||||||
|
if http2ConfigStrictMaxConcurrentRequests(h2) {
|
||||||
|
conf.StrictMaxConcurrentRequests = true
|
||||||
|
}
|
||||||
if h2.MaxEncoderHeaderTableSize != 0 {
|
if h2.MaxEncoderHeaderTableSize != 0 {
|
||||||
conf.MaxEncoderHeaderTableSize = uint32(h2.MaxEncoderHeaderTableSize)
|
conf.MaxEncoderHeaderTableSize = uint32(h2.MaxEncoderHeaderTableSize)
|
||||||
}
|
}
|
||||||
|
|||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2025 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build !go1.26
|
||||||
|
|
||||||
|
package http2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func http2ConfigStrictMaxConcurrentRequests(h2 *http.HTTP2Config) bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2025 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build go1.26
|
||||||
|
|
||||||
|
package http2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func http2ConfigStrictMaxConcurrentRequests(h2 *http.HTTP2Config) bool {
|
||||||
|
return h2.StrictMaxConcurrentRequests
|
||||||
|
}
|
||||||
+24
-1
@@ -347,7 +347,7 @@ func (fr *Framer) maxHeaderListSize() uint32 {
|
|||||||
func (f *Framer) startWrite(ftype FrameType, flags Flags, streamID uint32) {
|
func (f *Framer) startWrite(ftype FrameType, flags Flags, streamID uint32) {
|
||||||
// Write the FrameHeader.
|
// Write the FrameHeader.
|
||||||
f.wbuf = append(f.wbuf[:0],
|
f.wbuf = append(f.wbuf[:0],
|
||||||
0, // 3 bytes of length, filled in in endWrite
|
0, // 3 bytes of length, filled in endWrite
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
byte(ftype),
|
byte(ftype),
|
||||||
@@ -1152,6 +1152,15 @@ type PriorityFrame struct {
|
|||||||
PriorityParam
|
PriorityParam
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var defaultRFC9218Priority = PriorityParam{
|
||||||
|
incremental: 0,
|
||||||
|
urgency: 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note that HTTP/2 has had two different prioritization schemes, and
|
||||||
|
// PriorityParam struct below is a superset of both schemes. The exported
|
||||||
|
// symbols are from RFC 7540 and the non-exported ones are from RFC 9218.
|
||||||
|
|
||||||
// PriorityParam are the stream prioritzation parameters.
|
// PriorityParam are the stream prioritzation parameters.
|
||||||
type PriorityParam struct {
|
type PriorityParam struct {
|
||||||
// StreamDep is a 31-bit stream identifier for the
|
// StreamDep is a 31-bit stream identifier for the
|
||||||
@@ -1167,6 +1176,20 @@ type PriorityParam struct {
|
|||||||
// the spec, "Add one to the value to obtain a weight between
|
// the spec, "Add one to the value to obtain a weight between
|
||||||
// 1 and 256."
|
// 1 and 256."
|
||||||
Weight uint8
|
Weight uint8
|
||||||
|
|
||||||
|
// "The urgency (u) parameter value is Integer (see Section 3.3.1 of
|
||||||
|
// [STRUCTURED-FIELDS]), between 0 and 7 inclusive, in descending order of
|
||||||
|
// priority. The default is 3."
|
||||||
|
urgency uint8
|
||||||
|
|
||||||
|
// "The incremental (i) parameter value is Boolean (see Section 3.3.6 of
|
||||||
|
// [STRUCTURED-FIELDS]). It indicates if an HTTP response can be processed
|
||||||
|
// incrementally, i.e., provide some meaningful output as chunks of the
|
||||||
|
// response arrive."
|
||||||
|
//
|
||||||
|
// We use uint8 (i.e. 0 is false, 1 is true) instead of bool so we can
|
||||||
|
// avoid unnecessary type conversions and because either type takes 1 byte.
|
||||||
|
incremental uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p PriorityParam) IsZero() bool {
|
func (p PriorityParam) IsZero() bool {
|
||||||
|
|||||||
-1
@@ -34,7 +34,6 @@ var (
|
|||||||
VerboseLogs bool
|
VerboseLogs bool
|
||||||
logFrameWrites bool
|
logFrameWrites bool
|
||||||
logFrameReads bool
|
logFrameReads bool
|
||||||
inTests bool
|
|
||||||
|
|
||||||
// Enabling extended CONNECT by causes browsers to attempt to use
|
// Enabling extended CONNECT by causes browsers to attempt to use
|
||||||
// WebSockets-over-HTTP/2. This results in problems when the server's websocket
|
// WebSockets-over-HTTP/2. This results in problems when the server's websocket
|
||||||
|
|||||||
+35
-26
@@ -181,6 +181,10 @@ type Server struct {
|
|||||||
type serverInternalState struct {
|
type serverInternalState struct {
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
activeConns map[*serverConn]struct{}
|
activeConns map[*serverConn]struct{}
|
||||||
|
|
||||||
|
// Pool of error channels. This is per-Server rather than global
|
||||||
|
// because channels can't be reused across synctest bubbles.
|
||||||
|
errChanPool sync.Pool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serverInternalState) registerConn(sc *serverConn) {
|
func (s *serverInternalState) registerConn(sc *serverConn) {
|
||||||
@@ -212,6 +216,27 @@ func (s *serverInternalState) startGracefulShutdown() {
|
|||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Global error channel pool used for uninitialized Servers.
|
||||||
|
// We use a per-Server pool when possible to avoid using channels across synctest bubbles.
|
||||||
|
var errChanPool = sync.Pool{
|
||||||
|
New: func() any { return make(chan error, 1) },
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *serverInternalState) getErrChan() chan error {
|
||||||
|
if s == nil {
|
||||||
|
return errChanPool.Get().(chan error) // Server used without calling ConfigureServer
|
||||||
|
}
|
||||||
|
return s.errChanPool.Get().(chan error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *serverInternalState) putErrChan(ch chan error) {
|
||||||
|
if s == nil {
|
||||||
|
errChanPool.Put(ch) // Server used without calling ConfigureServer
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.errChanPool.Put(ch)
|
||||||
|
}
|
||||||
|
|
||||||
// ConfigureServer adds HTTP/2 support to a net/http Server.
|
// ConfigureServer adds HTTP/2 support to a net/http Server.
|
||||||
//
|
//
|
||||||
// The configuration conf may be nil.
|
// The configuration conf may be nil.
|
||||||
@@ -224,7 +249,10 @@ func ConfigureServer(s *http.Server, conf *Server) error {
|
|||||||
if conf == nil {
|
if conf == nil {
|
||||||
conf = new(Server)
|
conf = new(Server)
|
||||||
}
|
}
|
||||||
conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})}
|
conf.state = &serverInternalState{
|
||||||
|
activeConns: make(map[*serverConn]struct{}),
|
||||||
|
errChanPool: sync.Pool{New: func() any { return make(chan error, 1) }},
|
||||||
|
}
|
||||||
if h1, h2 := s, conf; h2.IdleTimeout == 0 {
|
if h1, h2 := s, conf; h2.IdleTimeout == 0 {
|
||||||
if h1.IdleTimeout != 0 {
|
if h1.IdleTimeout != 0 {
|
||||||
h2.IdleTimeout = h1.IdleTimeout
|
h2.IdleTimeout = h1.IdleTimeout
|
||||||
@@ -1124,25 +1152,6 @@ func (sc *serverConn) readPreface() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var errChanPool = sync.Pool{
|
|
||||||
New: func() interface{} { return make(chan error, 1) },
|
|
||||||
}
|
|
||||||
|
|
||||||
func getErrChan() chan error {
|
|
||||||
if inTests {
|
|
||||||
// Channels cannot be reused across synctest tests.
|
|
||||||
return make(chan error, 1)
|
|
||||||
} else {
|
|
||||||
return errChanPool.Get().(chan error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func putErrChan(ch chan error) {
|
|
||||||
if !inTests {
|
|
||||||
errChanPool.Put(ch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var writeDataPool = sync.Pool{
|
var writeDataPool = sync.Pool{
|
||||||
New: func() interface{} { return new(writeData) },
|
New: func() interface{} { return new(writeData) },
|
||||||
}
|
}
|
||||||
@@ -1150,7 +1159,7 @@ var writeDataPool = sync.Pool{
|
|||||||
// writeDataFromHandler writes DATA response frames from a handler on
|
// writeDataFromHandler writes DATA response frames from a handler on
|
||||||
// the given stream.
|
// the given stream.
|
||||||
func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error {
|
func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error {
|
||||||
ch := getErrChan()
|
ch := sc.srv.state.getErrChan()
|
||||||
writeArg := writeDataPool.Get().(*writeData)
|
writeArg := writeDataPool.Get().(*writeData)
|
||||||
*writeArg = writeData{stream.id, data, endStream}
|
*writeArg = writeData{stream.id, data, endStream}
|
||||||
err := sc.writeFrameFromHandler(FrameWriteRequest{
|
err := sc.writeFrameFromHandler(FrameWriteRequest{
|
||||||
@@ -1182,7 +1191,7 @@ func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStrea
|
|||||||
return errStreamClosed
|
return errStreamClosed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
putErrChan(ch)
|
sc.srv.state.putErrChan(ch)
|
||||||
if frameWriteDone {
|
if frameWriteDone {
|
||||||
writeDataPool.Put(writeArg)
|
writeDataPool.Put(writeArg)
|
||||||
}
|
}
|
||||||
@@ -2436,7 +2445,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro
|
|||||||
// waiting for this frame to be written, so an http.Flush mid-handler
|
// waiting for this frame to be written, so an http.Flush mid-handler
|
||||||
// writes out the correct value of keys, before a handler later potentially
|
// writes out the correct value of keys, before a handler later potentially
|
||||||
// mutates it.
|
// mutates it.
|
||||||
errc = getErrChan()
|
errc = sc.srv.state.getErrChan()
|
||||||
}
|
}
|
||||||
if err := sc.writeFrameFromHandler(FrameWriteRequest{
|
if err := sc.writeFrameFromHandler(FrameWriteRequest{
|
||||||
write: headerData,
|
write: headerData,
|
||||||
@@ -2448,7 +2457,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro
|
|||||||
if errc != nil {
|
if errc != nil {
|
||||||
select {
|
select {
|
||||||
case err := <-errc:
|
case err := <-errc:
|
||||||
putErrChan(errc)
|
sc.srv.state.putErrChan(errc)
|
||||||
return err
|
return err
|
||||||
case <-sc.doneServing:
|
case <-sc.doneServing:
|
||||||
return errClientDisconnected
|
return errClientDisconnected
|
||||||
@@ -3129,7 +3138,7 @@ func (w *responseWriter) Push(target string, opts *http.PushOptions) error {
|
|||||||
method: opts.Method,
|
method: opts.Method,
|
||||||
url: u,
|
url: u,
|
||||||
header: cloneHeader(opts.Header),
|
header: cloneHeader(opts.Header),
|
||||||
done: getErrChan(),
|
done: sc.srv.state.getErrChan(),
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
@@ -3146,7 +3155,7 @@ func (w *responseWriter) Push(target string, opts *http.PushOptions) error {
|
|||||||
case <-st.cw:
|
case <-st.cw:
|
||||||
return errStreamClosed
|
return errStreamClosed
|
||||||
case err := <-msg.done:
|
case err := <-msg.done:
|
||||||
putErrChan(msg.done)
|
sc.srv.state.putErrChan(msg.done)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -355,6 +355,7 @@ type ClientConn struct {
|
|||||||
readIdleTimeout time.Duration
|
readIdleTimeout time.Duration
|
||||||
pingTimeout time.Duration
|
pingTimeout time.Duration
|
||||||
extendedConnectAllowed bool
|
extendedConnectAllowed bool
|
||||||
|
strictMaxConcurrentStreams bool
|
||||||
|
|
||||||
// rstStreamPingsBlocked works around an unfortunate gRPC behavior.
|
// rstStreamPingsBlocked works around an unfortunate gRPC behavior.
|
||||||
// gRPC strictly limits the number of PING frames that it will receive.
|
// gRPC strictly limits the number of PING frames that it will receive.
|
||||||
@@ -784,7 +785,8 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro
|
|||||||
initialWindowSize: 65535, // spec default
|
initialWindowSize: 65535, // spec default
|
||||||
initialStreamRecvWindowSize: conf.MaxUploadBufferPerStream,
|
initialStreamRecvWindowSize: conf.MaxUploadBufferPerStream,
|
||||||
maxConcurrentStreams: initialMaxConcurrentStreams, // "infinite", per spec. Use a smaller value until we have received server settings.
|
maxConcurrentStreams: initialMaxConcurrentStreams, // "infinite", per spec. Use a smaller value until we have received server settings.
|
||||||
peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead.
|
strictMaxConcurrentStreams: conf.StrictMaxConcurrentRequests,
|
||||||
|
peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead.
|
||||||
streams: make(map[uint32]*clientStream),
|
streams: make(map[uint32]*clientStream),
|
||||||
singleUse: singleUse,
|
singleUse: singleUse,
|
||||||
seenSettingsChan: make(chan struct{}),
|
seenSettingsChan: make(chan struct{}),
|
||||||
@@ -1018,7 +1020,7 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
var maxConcurrentOkay bool
|
var maxConcurrentOkay bool
|
||||||
if cc.t.StrictMaxConcurrentStreams {
|
if cc.strictMaxConcurrentStreams {
|
||||||
// We'll tell the caller we can take a new request to
|
// We'll tell the caller we can take a new request to
|
||||||
// prevent the caller from dialing a new TCP
|
// prevent the caller from dialing a new TCP
|
||||||
// connection, but then we'll block later before
|
// connection, but then we'll block later before
|
||||||
|
|||||||
+2
@@ -42,6 +42,8 @@ type OpenStreamOptions struct {
|
|||||||
// PusherID is zero if the stream was initiated by the client. Otherwise,
|
// PusherID is zero if the stream was initiated by the client. Otherwise,
|
||||||
// PusherID names the stream that pushed the newly opened stream.
|
// PusherID names the stream that pushed the newly opened stream.
|
||||||
PusherID uint32
|
PusherID uint32
|
||||||
|
// priority is used to set the priority of the newly opened stream.
|
||||||
|
priority PriorityParam
|
||||||
}
|
}
|
||||||
|
|
||||||
// FrameWriteRequest is a request to write a frame.
|
// FrameWriteRequest is a request to write a frame.
|
||||||
|
|||||||
Generated
Vendored
+52
-52
@@ -11,7 +11,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// RFC 7540, Section 5.3.5: the default weight is 16.
|
// RFC 7540, Section 5.3.5: the default weight is 16.
|
||||||
const priorityDefaultWeight = 15 // 16 = 15 + 1
|
const priorityDefaultWeightRFC7540 = 15 // 16 = 15 + 1
|
||||||
|
|
||||||
// PriorityWriteSchedulerConfig configures a priorityWriteScheduler.
|
// PriorityWriteSchedulerConfig configures a priorityWriteScheduler.
|
||||||
type PriorityWriteSchedulerConfig struct {
|
type PriorityWriteSchedulerConfig struct {
|
||||||
@@ -66,8 +66,8 @@ func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ws := &priorityWriteScheduler{
|
ws := &priorityWriteSchedulerRFC7540{
|
||||||
nodes: make(map[uint32]*priorityNode),
|
nodes: make(map[uint32]*priorityNodeRFC7540),
|
||||||
maxClosedNodesInTree: cfg.MaxClosedNodesInTree,
|
maxClosedNodesInTree: cfg.MaxClosedNodesInTree,
|
||||||
maxIdleNodesInTree: cfg.MaxIdleNodesInTree,
|
maxIdleNodesInTree: cfg.MaxIdleNodesInTree,
|
||||||
enableWriteThrottle: cfg.ThrottleOutOfOrderWrites,
|
enableWriteThrottle: cfg.ThrottleOutOfOrderWrites,
|
||||||
@@ -81,32 +81,32 @@ func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler
|
|||||||
return ws
|
return ws
|
||||||
}
|
}
|
||||||
|
|
||||||
type priorityNodeState int
|
type priorityNodeStateRFC7540 int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
priorityNodeOpen priorityNodeState = iota
|
priorityNodeOpenRFC7540 priorityNodeStateRFC7540 = iota
|
||||||
priorityNodeClosed
|
priorityNodeClosedRFC7540
|
||||||
priorityNodeIdle
|
priorityNodeIdleRFC7540
|
||||||
)
|
)
|
||||||
|
|
||||||
// priorityNode is a node in an HTTP/2 priority tree.
|
// priorityNodeRFC7540 is a node in an HTTP/2 priority tree.
|
||||||
// Each node is associated with a single stream ID.
|
// Each node is associated with a single stream ID.
|
||||||
// See RFC 7540, Section 5.3.
|
// See RFC 7540, Section 5.3.
|
||||||
type priorityNode struct {
|
type priorityNodeRFC7540 struct {
|
||||||
q writeQueue // queue of pending frames to write
|
q writeQueue // queue of pending frames to write
|
||||||
id uint32 // id of the stream, or 0 for the root of the tree
|
id uint32 // id of the stream, or 0 for the root of the tree
|
||||||
weight uint8 // the actual weight is weight+1, so the value is in [1,256]
|
weight uint8 // the actual weight is weight+1, so the value is in [1,256]
|
||||||
state priorityNodeState // open | closed | idle
|
state priorityNodeStateRFC7540 // open | closed | idle
|
||||||
bytes int64 // number of bytes written by this node, or 0 if closed
|
bytes int64 // number of bytes written by this node, or 0 if closed
|
||||||
subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree
|
subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree
|
||||||
|
|
||||||
// These links form the priority tree.
|
// These links form the priority tree.
|
||||||
parent *priorityNode
|
parent *priorityNodeRFC7540
|
||||||
kids *priorityNode // start of the kids list
|
kids *priorityNodeRFC7540 // start of the kids list
|
||||||
prev, next *priorityNode // doubly-linked list of siblings
|
prev, next *priorityNodeRFC7540 // doubly-linked list of siblings
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *priorityNode) setParent(parent *priorityNode) {
|
func (n *priorityNodeRFC7540) setParent(parent *priorityNodeRFC7540) {
|
||||||
if n == parent {
|
if n == parent {
|
||||||
panic("setParent to self")
|
panic("setParent to self")
|
||||||
}
|
}
|
||||||
@@ -141,7 +141,7 @@ func (n *priorityNode) setParent(parent *priorityNode) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *priorityNode) addBytes(b int64) {
|
func (n *priorityNodeRFC7540) addBytes(b int64) {
|
||||||
n.bytes += b
|
n.bytes += b
|
||||||
for ; n != nil; n = n.parent {
|
for ; n != nil; n = n.parent {
|
||||||
n.subtreeBytes += b
|
n.subtreeBytes += b
|
||||||
@@ -154,7 +154,7 @@ func (n *priorityNode) addBytes(b int64) {
|
|||||||
//
|
//
|
||||||
// f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true
|
// f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true
|
||||||
// if any ancestor p of n is still open (ignoring the root node).
|
// if any ancestor p of n is still open (ignoring the root node).
|
||||||
func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f func(*priorityNode, bool) bool) bool {
|
func (n *priorityNodeRFC7540) walkReadyInOrder(openParent bool, tmp *[]*priorityNodeRFC7540, f func(*priorityNodeRFC7540, bool) bool) bool {
|
||||||
if !n.q.empty() && f(n, openParent) {
|
if !n.q.empty() && f(n, openParent) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -165,7 +165,7 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f
|
|||||||
// Don't consider the root "open" when updating openParent since
|
// Don't consider the root "open" when updating openParent since
|
||||||
// we can't send data frames on the root stream (only control frames).
|
// we can't send data frames on the root stream (only control frames).
|
||||||
if n.id != 0 {
|
if n.id != 0 {
|
||||||
openParent = openParent || (n.state == priorityNodeOpen)
|
openParent = openParent || (n.state == priorityNodeOpenRFC7540)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Common case: only one kid or all kids have the same weight.
|
// Common case: only one kid or all kids have the same weight.
|
||||||
@@ -195,7 +195,7 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f
|
|||||||
*tmp = append(*tmp, n.kids)
|
*tmp = append(*tmp, n.kids)
|
||||||
n.kids.setParent(nil)
|
n.kids.setParent(nil)
|
||||||
}
|
}
|
||||||
sort.Sort(sortPriorityNodeSiblings(*tmp))
|
sort.Sort(sortPriorityNodeSiblingsRFC7540(*tmp))
|
||||||
for i := len(*tmp) - 1; i >= 0; i-- {
|
for i := len(*tmp) - 1; i >= 0; i-- {
|
||||||
(*tmp)[i].setParent(n) // setParent inserts at the head of n.kids
|
(*tmp)[i].setParent(n) // setParent inserts at the head of n.kids
|
||||||
}
|
}
|
||||||
@@ -207,11 +207,11 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
type sortPriorityNodeSiblings []*priorityNode
|
type sortPriorityNodeSiblingsRFC7540 []*priorityNodeRFC7540
|
||||||
|
|
||||||
func (z sortPriorityNodeSiblings) Len() int { return len(z) }
|
func (z sortPriorityNodeSiblingsRFC7540) Len() int { return len(z) }
|
||||||
func (z sortPriorityNodeSiblings) Swap(i, k int) { z[i], z[k] = z[k], z[i] }
|
func (z sortPriorityNodeSiblingsRFC7540) Swap(i, k int) { z[i], z[k] = z[k], z[i] }
|
||||||
func (z sortPriorityNodeSiblings) Less(i, k int) bool {
|
func (z sortPriorityNodeSiblingsRFC7540) Less(i, k int) bool {
|
||||||
// Prefer the subtree that has sent fewer bytes relative to its weight.
|
// Prefer the subtree that has sent fewer bytes relative to its weight.
|
||||||
// See sections 5.3.2 and 5.3.4.
|
// See sections 5.3.2 and 5.3.4.
|
||||||
wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes)
|
wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes)
|
||||||
@@ -225,13 +225,13 @@ func (z sortPriorityNodeSiblings) Less(i, k int) bool {
|
|||||||
return bi/bk <= wi/wk
|
return bi/bk <= wi/wk
|
||||||
}
|
}
|
||||||
|
|
||||||
type priorityWriteScheduler struct {
|
type priorityWriteSchedulerRFC7540 struct {
|
||||||
// root is the root of the priority tree, where root.id = 0.
|
// root is the root of the priority tree, where root.id = 0.
|
||||||
// The root queues control frames that are not associated with any stream.
|
// The root queues control frames that are not associated with any stream.
|
||||||
root priorityNode
|
root priorityNodeRFC7540
|
||||||
|
|
||||||
// nodes maps stream ids to priority tree nodes.
|
// nodes maps stream ids to priority tree nodes.
|
||||||
nodes map[uint32]*priorityNode
|
nodes map[uint32]*priorityNodeRFC7540
|
||||||
|
|
||||||
// maxID is the maximum stream id in nodes.
|
// maxID is the maximum stream id in nodes.
|
||||||
maxID uint32
|
maxID uint32
|
||||||
@@ -239,7 +239,7 @@ type priorityWriteScheduler struct {
|
|||||||
// lists of nodes that have been closed or are idle, but are kept in
|
// lists of nodes that have been closed or are idle, but are kept in
|
||||||
// the tree for improved prioritization. When the lengths exceed either
|
// the tree for improved prioritization. When the lengths exceed either
|
||||||
// maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded.
|
// maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded.
|
||||||
closedNodes, idleNodes []*priorityNode
|
closedNodes, idleNodes []*priorityNodeRFC7540
|
||||||
|
|
||||||
// From the config.
|
// From the config.
|
||||||
maxClosedNodesInTree int
|
maxClosedNodesInTree int
|
||||||
@@ -248,19 +248,19 @@ type priorityWriteScheduler struct {
|
|||||||
enableWriteThrottle bool
|
enableWriteThrottle bool
|
||||||
|
|
||||||
// tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations.
|
// tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations.
|
||||||
tmp []*priorityNode
|
tmp []*priorityNodeRFC7540
|
||||||
|
|
||||||
// pool of empty queues for reuse.
|
// pool of empty queues for reuse.
|
||||||
queuePool writeQueuePool
|
queuePool writeQueuePool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) {
|
func (ws *priorityWriteSchedulerRFC7540) OpenStream(streamID uint32, options OpenStreamOptions) {
|
||||||
// The stream may be currently idle but cannot be opened or closed.
|
// The stream may be currently idle but cannot be opened or closed.
|
||||||
if curr := ws.nodes[streamID]; curr != nil {
|
if curr := ws.nodes[streamID]; curr != nil {
|
||||||
if curr.state != priorityNodeIdle {
|
if curr.state != priorityNodeIdleRFC7540 {
|
||||||
panic(fmt.Sprintf("stream %d already opened", streamID))
|
panic(fmt.Sprintf("stream %d already opened", streamID))
|
||||||
}
|
}
|
||||||
curr.state = priorityNodeOpen
|
curr.state = priorityNodeOpenRFC7540
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,11 +272,11 @@ func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStream
|
|||||||
if parent == nil {
|
if parent == nil {
|
||||||
parent = &ws.root
|
parent = &ws.root
|
||||||
}
|
}
|
||||||
n := &priorityNode{
|
n := &priorityNodeRFC7540{
|
||||||
q: *ws.queuePool.get(),
|
q: *ws.queuePool.get(),
|
||||||
id: streamID,
|
id: streamID,
|
||||||
weight: priorityDefaultWeight,
|
weight: priorityDefaultWeightRFC7540,
|
||||||
state: priorityNodeOpen,
|
state: priorityNodeOpenRFC7540,
|
||||||
}
|
}
|
||||||
n.setParent(parent)
|
n.setParent(parent)
|
||||||
ws.nodes[streamID] = n
|
ws.nodes[streamID] = n
|
||||||
@@ -285,19 +285,19 @@ func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStream
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) CloseStream(streamID uint32) {
|
func (ws *priorityWriteSchedulerRFC7540) CloseStream(streamID uint32) {
|
||||||
if streamID == 0 {
|
if streamID == 0 {
|
||||||
panic("violation of WriteScheduler interface: cannot close stream 0")
|
panic("violation of WriteScheduler interface: cannot close stream 0")
|
||||||
}
|
}
|
||||||
if ws.nodes[streamID] == nil {
|
if ws.nodes[streamID] == nil {
|
||||||
panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID))
|
panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID))
|
||||||
}
|
}
|
||||||
if ws.nodes[streamID].state != priorityNodeOpen {
|
if ws.nodes[streamID].state != priorityNodeOpenRFC7540 {
|
||||||
panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID))
|
panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID))
|
||||||
}
|
}
|
||||||
|
|
||||||
n := ws.nodes[streamID]
|
n := ws.nodes[streamID]
|
||||||
n.state = priorityNodeClosed
|
n.state = priorityNodeClosedRFC7540
|
||||||
n.addBytes(-n.bytes)
|
n.addBytes(-n.bytes)
|
||||||
|
|
||||||
q := n.q
|
q := n.q
|
||||||
@@ -310,7 +310,7 @@ func (ws *priorityWriteScheduler) CloseStream(streamID uint32) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) {
|
func (ws *priorityWriteSchedulerRFC7540) AdjustStream(streamID uint32, priority PriorityParam) {
|
||||||
if streamID == 0 {
|
if streamID == 0 {
|
||||||
panic("adjustPriority on root")
|
panic("adjustPriority on root")
|
||||||
}
|
}
|
||||||
@@ -324,11 +324,11 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
ws.maxID = streamID
|
ws.maxID = streamID
|
||||||
n = &priorityNode{
|
n = &priorityNodeRFC7540{
|
||||||
q: *ws.queuePool.get(),
|
q: *ws.queuePool.get(),
|
||||||
id: streamID,
|
id: streamID,
|
||||||
weight: priorityDefaultWeight,
|
weight: priorityDefaultWeightRFC7540,
|
||||||
state: priorityNodeIdle,
|
state: priorityNodeIdleRFC7540,
|
||||||
}
|
}
|
||||||
n.setParent(&ws.root)
|
n.setParent(&ws.root)
|
||||||
ws.nodes[streamID] = n
|
ws.nodes[streamID] = n
|
||||||
@@ -340,7 +340,7 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit
|
|||||||
parent := ws.nodes[priority.StreamDep]
|
parent := ws.nodes[priority.StreamDep]
|
||||||
if parent == nil {
|
if parent == nil {
|
||||||
n.setParent(&ws.root)
|
n.setParent(&ws.root)
|
||||||
n.weight = priorityDefaultWeight
|
n.weight = priorityDefaultWeightRFC7540
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -381,8 +381,8 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit
|
|||||||
n.weight = priority.Weight
|
n.weight = priority.Weight
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) {
|
func (ws *priorityWriteSchedulerRFC7540) Push(wr FrameWriteRequest) {
|
||||||
var n *priorityNode
|
var n *priorityNodeRFC7540
|
||||||
if wr.isControl() {
|
if wr.isControl() {
|
||||||
n = &ws.root
|
n = &ws.root
|
||||||
} else {
|
} else {
|
||||||
@@ -401,8 +401,8 @@ func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) {
|
|||||||
n.q.push(wr)
|
n.q.push(wr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) {
|
func (ws *priorityWriteSchedulerRFC7540) Pop() (wr FrameWriteRequest, ok bool) {
|
||||||
ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNode, openParent bool) bool {
|
ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNodeRFC7540, openParent bool) bool {
|
||||||
limit := int32(math.MaxInt32)
|
limit := int32(math.MaxInt32)
|
||||||
if openParent {
|
if openParent {
|
||||||
limit = ws.writeThrottleLimit
|
limit = ws.writeThrottleLimit
|
||||||
@@ -428,7 +428,7 @@ func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) {
|
|||||||
return wr, ok
|
return wr, ok
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, maxSize int, n *priorityNode) {
|
func (ws *priorityWriteSchedulerRFC7540) addClosedOrIdleNode(list *[]*priorityNodeRFC7540, maxSize int, n *priorityNodeRFC7540) {
|
||||||
if maxSize == 0 {
|
if maxSize == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -442,7 +442,7 @@ func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, max
|
|||||||
*list = append(*list, n)
|
*list = append(*list, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) removeNode(n *priorityNode) {
|
func (ws *priorityWriteSchedulerRFC7540) removeNode(n *priorityNodeRFC7540) {
|
||||||
for n.kids != nil {
|
for n.kids != nil {
|
||||||
n.kids.setParent(n.parent)
|
n.kids.setParent(n.parent)
|
||||||
}
|
}
|
||||||
+209
@@ -0,0 +1,209 @@
|
|||||||
|
// Copyright 2025 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package http2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
type streamMetadata struct {
|
||||||
|
location *writeQueue
|
||||||
|
priority PriorityParam
|
||||||
|
}
|
||||||
|
|
||||||
|
type priorityWriteSchedulerRFC9218 struct {
|
||||||
|
// control contains control frames (SETTINGS, PING, etc.).
|
||||||
|
control writeQueue
|
||||||
|
|
||||||
|
// heads contain the head of a circular list of streams.
|
||||||
|
// We put these heads within a nested array that represents urgency and
|
||||||
|
// incremental, as defined in
|
||||||
|
// https://www.rfc-editor.org/rfc/rfc9218.html#name-priority-parameters.
|
||||||
|
// 8 represents u=0 up to u=7, and 2 represents i=false and i=true.
|
||||||
|
heads [8][2]*writeQueue
|
||||||
|
|
||||||
|
// streams contains a mapping between each stream ID and their metadata, so
|
||||||
|
// we can quickly locate them when needing to, for example, adjust their
|
||||||
|
// priority.
|
||||||
|
streams map[uint32]streamMetadata
|
||||||
|
|
||||||
|
// queuePool are empty queues for reuse.
|
||||||
|
queuePool writeQueuePool
|
||||||
|
|
||||||
|
// prioritizeIncremental is used to determine whether we should prioritize
|
||||||
|
// incremental streams or not, when urgency is the same in a given Pop()
|
||||||
|
// call.
|
||||||
|
prioritizeIncremental bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func newPriorityWriteSchedulerRFC9128() WriteScheduler {
|
||||||
|
ws := &priorityWriteSchedulerRFC9218{
|
||||||
|
streams: make(map[uint32]streamMetadata),
|
||||||
|
}
|
||||||
|
return ws
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *priorityWriteSchedulerRFC9218) OpenStream(streamID uint32, opt OpenStreamOptions) {
|
||||||
|
if ws.streams[streamID].location != nil {
|
||||||
|
panic(fmt.Errorf("stream %d already opened", streamID))
|
||||||
|
}
|
||||||
|
q := ws.queuePool.get()
|
||||||
|
ws.streams[streamID] = streamMetadata{
|
||||||
|
location: q,
|
||||||
|
priority: opt.priority,
|
||||||
|
}
|
||||||
|
|
||||||
|
u, i := opt.priority.urgency, opt.priority.incremental
|
||||||
|
if ws.heads[u][i] == nil {
|
||||||
|
ws.heads[u][i] = q
|
||||||
|
q.next = q
|
||||||
|
q.prev = q
|
||||||
|
} else {
|
||||||
|
// Queues are stored in a ring.
|
||||||
|
// Insert the new stream before ws.head, putting it at the end of the list.
|
||||||
|
q.prev = ws.heads[u][i].prev
|
||||||
|
q.next = ws.heads[u][i]
|
||||||
|
q.prev.next = q
|
||||||
|
q.next.prev = q
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *priorityWriteSchedulerRFC9218) CloseStream(streamID uint32) {
|
||||||
|
metadata := ws.streams[streamID]
|
||||||
|
q, u, i := metadata.location, metadata.priority.urgency, metadata.priority.incremental
|
||||||
|
if q == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if q.next == q {
|
||||||
|
// This was the only open stream.
|
||||||
|
ws.heads[u][i] = nil
|
||||||
|
} else {
|
||||||
|
q.prev.next = q.next
|
||||||
|
q.next.prev = q.prev
|
||||||
|
if ws.heads[u][i] == q {
|
||||||
|
ws.heads[u][i] = q.next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete(ws.streams, streamID)
|
||||||
|
ws.queuePool.put(q)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *priorityWriteSchedulerRFC9218) AdjustStream(streamID uint32, priority PriorityParam) {
|
||||||
|
metadata := ws.streams[streamID]
|
||||||
|
q, u, i := metadata.location, metadata.priority.urgency, metadata.priority.incremental
|
||||||
|
if q == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove stream from current location.
|
||||||
|
if q.next == q {
|
||||||
|
// This was the only open stream.
|
||||||
|
ws.heads[u][i] = nil
|
||||||
|
} else {
|
||||||
|
q.prev.next = q.next
|
||||||
|
q.next.prev = q.prev
|
||||||
|
if ws.heads[u][i] == q {
|
||||||
|
ws.heads[u][i] = q.next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert stream to the new queue.
|
||||||
|
u, i = priority.urgency, priority.incremental
|
||||||
|
if ws.heads[u][i] == nil {
|
||||||
|
ws.heads[u][i] = q
|
||||||
|
q.next = q
|
||||||
|
q.prev = q
|
||||||
|
} else {
|
||||||
|
// Queues are stored in a ring.
|
||||||
|
// Insert the new stream before ws.head, putting it at the end of the list.
|
||||||
|
q.prev = ws.heads[u][i].prev
|
||||||
|
q.next = ws.heads[u][i]
|
||||||
|
q.prev.next = q
|
||||||
|
q.next.prev = q
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the metadata.
|
||||||
|
ws.streams[streamID] = streamMetadata{
|
||||||
|
location: q,
|
||||||
|
priority: priority,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *priorityWriteSchedulerRFC9218) Push(wr FrameWriteRequest) {
|
||||||
|
if wr.isControl() {
|
||||||
|
ws.control.push(wr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
q := ws.streams[wr.StreamID()].location
|
||||||
|
if q == nil {
|
||||||
|
// This is a closed stream.
|
||||||
|
// wr should not be a HEADERS or DATA frame.
|
||||||
|
// We push the request onto the control queue.
|
||||||
|
if wr.DataSize() > 0 {
|
||||||
|
panic("add DATA on non-open stream")
|
||||||
|
}
|
||||||
|
ws.control.push(wr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
q.push(wr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *priorityWriteSchedulerRFC9218) Pop() (FrameWriteRequest, bool) {
|
||||||
|
// Control and RST_STREAM frames first.
|
||||||
|
if !ws.control.empty() {
|
||||||
|
return ws.control.shift(), true
|
||||||
|
}
|
||||||
|
|
||||||
|
// On the next Pop(), we want to prioritize incremental if we prioritized
|
||||||
|
// non-incremental request of the same urgency this time. Vice-versa.
|
||||||
|
// i.e. when there are incremental and non-incremental requests at the same
|
||||||
|
// priority, we give 50% of our bandwidth to the incremental ones in
|
||||||
|
// aggregate and 50% to the first non-incremental one (since
|
||||||
|
// non-incremental streams do not use round-robin writes).
|
||||||
|
ws.prioritizeIncremental = !ws.prioritizeIncremental
|
||||||
|
|
||||||
|
// Always prioritize lowest u (i.e. highest urgency level).
|
||||||
|
for u := range ws.heads {
|
||||||
|
for i := range ws.heads[u] {
|
||||||
|
// When we want to prioritize incremental, we try to pop i=true
|
||||||
|
// first before i=false when u is the same.
|
||||||
|
if ws.prioritizeIncremental {
|
||||||
|
i = (i + 1) % 2
|
||||||
|
}
|
||||||
|
q := ws.heads[u][i]
|
||||||
|
if q == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
if wr, ok := q.consume(math.MaxInt32); ok {
|
||||||
|
if i == 1 {
|
||||||
|
// For incremental streams, we update head to q.next so
|
||||||
|
// we can round-robin between multiple streams that can
|
||||||
|
// immediately benefit from partial writes.
|
||||||
|
ws.heads[u][i] = q.next
|
||||||
|
} else {
|
||||||
|
// For non-incremental streams, we try to finish one to
|
||||||
|
// completion rather than doing round-robin. However,
|
||||||
|
// we update head here so that if q.consume() is !ok
|
||||||
|
// (e.g. the stream has no more frame to consume), head
|
||||||
|
// is updated to the next q that has frames to consume
|
||||||
|
// on future iterations. This way, we do not prioritize
|
||||||
|
// writing to unavailable stream on next Pop() calls,
|
||||||
|
// preventing head-of-line blocking.
|
||||||
|
ws.heads[u][i] = q
|
||||||
|
}
|
||||||
|
return wr, true
|
||||||
|
}
|
||||||
|
q = q.next
|
||||||
|
if q == ws.heads[u][i] {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FrameWriteRequest{}, false
|
||||||
|
}
|
||||||
+1
-1
@@ -25,7 +25,7 @@ type roundRobinWriteScheduler struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// newRoundRobinWriteScheduler constructs a new write scheduler.
|
// newRoundRobinWriteScheduler constructs a new write scheduler.
|
||||||
// The round robin scheduler priorizes control frames
|
// The round robin scheduler prioritizes control frames
|
||||||
// like SETTINGS and PING over DATA frames.
|
// like SETTINGS and PING over DATA frames.
|
||||||
// When there are no control frames to send, it performs a round-robin
|
// When there are no control frames to send, it performs a round-robin
|
||||||
// selection from the ready streams.
|
// selection from the ready streams.
|
||||||
|
|||||||
+2
-2
@@ -51,7 +51,7 @@ type EncodeHeadersParam struct {
|
|||||||
DefaultUserAgent string
|
DefaultUserAgent string
|
||||||
}
|
}
|
||||||
|
|
||||||
// EncodeHeadersParam is the result of EncodeHeaders.
|
// EncodeHeadersResult is the result of EncodeHeaders.
|
||||||
type EncodeHeadersResult struct {
|
type EncodeHeadersResult struct {
|
||||||
HasBody bool
|
HasBody bool
|
||||||
HasTrailers bool
|
HasTrailers bool
|
||||||
@@ -399,7 +399,7 @@ type ServerRequestResult struct {
|
|||||||
|
|
||||||
// If the request should be rejected, this is a short string suitable for passing
|
// If the request should be rejected, this is a short string suitable for passing
|
||||||
// to the http2 package's CountError function.
|
// to the http2 package's CountError function.
|
||||||
// It might be a bit odd to return errors this way rather than returing an error,
|
// It might be a bit odd to return errors this way rather than returning an error,
|
||||||
// but this ensures we don't forget to include a CountError reason.
|
// but this ensures we don't forget to include a CountError reason.
|
||||||
InvalidReason string
|
InvalidReason string
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -297,7 +297,7 @@ func (up *UsernamePassword) Authenticate(ctx context.Context, rw io.ReadWriter,
|
|||||||
b = append(b, up.Username...)
|
b = append(b, up.Username...)
|
||||||
b = append(b, byte(len(up.Password)))
|
b = append(b, byte(len(up.Password)))
|
||||||
b = append(b, up.Password...)
|
b = append(b, up.Password...)
|
||||||
// TODO(mikio): handle IO deadlines and cancelation if
|
// TODO(mikio): handle IO deadlines and cancellation if
|
||||||
// necessary
|
// necessary
|
||||||
if _, err := rw.Write(b); err != nil {
|
if _, err := rw.Write(b); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
+9
@@ -41,6 +41,15 @@ func (s *CPUSet) Zero() {
|
|||||||
clear(s[:])
|
clear(s[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fill adds all possible CPU bits to the set s. On Linux, [SchedSetaffinity]
|
||||||
|
// will silently ignore any invalid CPU bits in [CPUSet] so this is an
|
||||||
|
// efficient way of resetting the CPU affinity of a process.
|
||||||
|
func (s *CPUSet) Fill() {
|
||||||
|
for i := range s {
|
||||||
|
s[i] = ^cpuMask(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func cpuBitsIndex(cpu int) int {
|
func cpuBitsIndex(cpu int) int {
|
||||||
return cpu / _NCPUBITS
|
return cpu / _NCPUBITS
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -23,7 +23,5 @@ func (fds *FdSet) IsSet(fd int) bool {
|
|||||||
|
|
||||||
// Zero clears the set fds.
|
// Zero clears the set fds.
|
||||||
func (fds *FdSet) Zero() {
|
func (fds *FdSet) Zero() {
|
||||||
for i := range fds.Bits {
|
clear(fds.Bits[:])
|
||||||
fds.Bits[i] = 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -111,9 +111,7 @@ func (ifr *Ifreq) SetUint32(v uint32) {
|
|||||||
// clear zeroes the ifreq's union field to prevent trailing garbage data from
|
// clear zeroes the ifreq's union field to prevent trailing garbage data from
|
||||||
// being sent to the kernel if an ifreq is reused.
|
// being sent to the kernel if an ifreq is reused.
|
||||||
func (ifr *Ifreq) clear() {
|
func (ifr *Ifreq) clear() {
|
||||||
for i := range ifr.raw.Ifru {
|
clear(ifr.raw.Ifru[:])
|
||||||
ifr.raw.Ifru[i] = 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(mdlayher): export as IfreqData? For now we can provide helpers such as
|
// TODO(mdlayher): export as IfreqData? For now we can provide helpers such as
|
||||||
|
|||||||
+1
@@ -49,6 +49,7 @@ esac
|
|||||||
if [[ "$GOOS" = "linux" ]]; then
|
if [[ "$GOOS" = "linux" ]]; then
|
||||||
# Use the Docker-based build system
|
# Use the Docker-based build system
|
||||||
# Files generated through docker (use $cmd so you can Ctl-C the build or run)
|
# Files generated through docker (use $cmd so you can Ctl-C the build or run)
|
||||||
|
set -e
|
||||||
$cmd docker build --tag generate:$GOOS $GOOS
|
$cmd docker build --tag generate:$GOOS $GOOS
|
||||||
$cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && pwd):/build generate:$GOOS
|
$cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && pwd):/build generate:$GOOS
|
||||||
exit
|
exit
|
||||||
|
|||||||
+1
-3
@@ -801,9 +801,7 @@ func (sa *SockaddrPPPoE) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
|||||||
// one. The kernel expects SID to be in network byte order.
|
// one. The kernel expects SID to be in network byte order.
|
||||||
binary.BigEndian.PutUint16(sa.raw[6:8], sa.SID)
|
binary.BigEndian.PutUint16(sa.raw[6:8], sa.SID)
|
||||||
copy(sa.raw[8:14], sa.Remote)
|
copy(sa.raw[8:14], sa.Remote)
|
||||||
for i := 14; i < 14+IFNAMSIZ; i++ {
|
clear(sa.raw[14 : 14+IFNAMSIZ])
|
||||||
sa.raw[i] = 0
|
|
||||||
}
|
|
||||||
copy(sa.raw[14:], sa.Dev)
|
copy(sa.raw[14:], sa.Dev)
|
||||||
return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil
|
return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil
|
||||||
}
|
}
|
||||||
|
|||||||
+17
@@ -248,6 +248,23 @@ func Statvfs(path string, buf *Statvfs_t) (err error) {
|
|||||||
return Statvfs1(path, buf, ST_WAIT)
|
return Statvfs1(path, buf, ST_WAIT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Getvfsstat(buf []Statvfs_t, flags int) (n int, err error) {
|
||||||
|
var (
|
||||||
|
_p0 unsafe.Pointer
|
||||||
|
bufsize uintptr
|
||||||
|
)
|
||||||
|
if len(buf) > 0 {
|
||||||
|
_p0 = unsafe.Pointer(&buf[0])
|
||||||
|
bufsize = unsafe.Sizeof(Statvfs_t{}) * uintptr(len(buf))
|
||||||
|
}
|
||||||
|
r0, _, e1 := Syscall(SYS_GETVFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
|
||||||
|
n = int(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = e1
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exposed directly
|
* Exposed directly
|
||||||
*/
|
*/
|
||||||
|
|||||||
+2
@@ -321,6 +321,8 @@ func NewCallbackCDecl(fn interface{}) uintptr {
|
|||||||
//sys SetConsoleOutputCP(cp uint32) (err error) = kernel32.SetConsoleOutputCP
|
//sys SetConsoleOutputCP(cp uint32) (err error) = kernel32.SetConsoleOutputCP
|
||||||
//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
|
//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
|
||||||
//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
|
//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
|
||||||
|
//sys GetNumberOfConsoleInputEvents(console Handle, numevents *uint32) (err error) = kernel32.GetNumberOfConsoleInputEvents
|
||||||
|
//sys FlushConsoleInputBuffer(console Handle) (err error) = kernel32.FlushConsoleInputBuffer
|
||||||
//sys resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole
|
//sys resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole
|
||||||
//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
|
//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
|
||||||
//sys Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW
|
//sys Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW
|
||||||
|
|||||||
+16
@@ -65,6 +65,22 @@ var signals = [...]string{
|
|||||||
15: "terminated",
|
15: "terminated",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// File flags for [os.OpenFile]. The O_ prefix is used to indicate
|
||||||
|
// that these flags are specific to the OpenFile function.
|
||||||
|
const (
|
||||||
|
O_FILE_FLAG_OPEN_NO_RECALL = FILE_FLAG_OPEN_NO_RECALL
|
||||||
|
O_FILE_FLAG_OPEN_REPARSE_POINT = FILE_FLAG_OPEN_REPARSE_POINT
|
||||||
|
O_FILE_FLAG_SESSION_AWARE = FILE_FLAG_SESSION_AWARE
|
||||||
|
O_FILE_FLAG_POSIX_SEMANTICS = FILE_FLAG_POSIX_SEMANTICS
|
||||||
|
O_FILE_FLAG_BACKUP_SEMANTICS = FILE_FLAG_BACKUP_SEMANTICS
|
||||||
|
O_FILE_FLAG_DELETE_ON_CLOSE = FILE_FLAG_DELETE_ON_CLOSE
|
||||||
|
O_FILE_FLAG_SEQUENTIAL_SCAN = FILE_FLAG_SEQUENTIAL_SCAN
|
||||||
|
O_FILE_FLAG_RANDOM_ACCESS = FILE_FLAG_RANDOM_ACCESS
|
||||||
|
O_FILE_FLAG_NO_BUFFERING = FILE_FLAG_NO_BUFFERING
|
||||||
|
O_FILE_FLAG_OVERLAPPED = FILE_FLAG_OVERLAPPED
|
||||||
|
O_FILE_FLAG_WRITE_THROUGH = FILE_FLAG_WRITE_THROUGH
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
FILE_READ_DATA = 0x00000001
|
FILE_READ_DATA = 0x00000001
|
||||||
FILE_READ_ATTRIBUTES = 0x00000080
|
FILE_READ_ATTRIBUTES = 0x00000080
|
||||||
|
|||||||
+18
@@ -238,6 +238,7 @@ var (
|
|||||||
procFindResourceW = modkernel32.NewProc("FindResourceW")
|
procFindResourceW = modkernel32.NewProc("FindResourceW")
|
||||||
procFindVolumeClose = modkernel32.NewProc("FindVolumeClose")
|
procFindVolumeClose = modkernel32.NewProc("FindVolumeClose")
|
||||||
procFindVolumeMountPointClose = modkernel32.NewProc("FindVolumeMountPointClose")
|
procFindVolumeMountPointClose = modkernel32.NewProc("FindVolumeMountPointClose")
|
||||||
|
procFlushConsoleInputBuffer = modkernel32.NewProc("FlushConsoleInputBuffer")
|
||||||
procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers")
|
procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers")
|
||||||
procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile")
|
procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile")
|
||||||
procFormatMessageW = modkernel32.NewProc("FormatMessageW")
|
procFormatMessageW = modkernel32.NewProc("FormatMessageW")
|
||||||
@@ -284,6 +285,7 @@ var (
|
|||||||
procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW")
|
procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW")
|
||||||
procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo")
|
procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo")
|
||||||
procGetNamedPipeServerProcessId = modkernel32.NewProc("GetNamedPipeServerProcessId")
|
procGetNamedPipeServerProcessId = modkernel32.NewProc("GetNamedPipeServerProcessId")
|
||||||
|
procGetNumberOfConsoleInputEvents = modkernel32.NewProc("GetNumberOfConsoleInputEvents")
|
||||||
procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult")
|
procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult")
|
||||||
procGetPriorityClass = modkernel32.NewProc("GetPriorityClass")
|
procGetPriorityClass = modkernel32.NewProc("GetPriorityClass")
|
||||||
procGetProcAddress = modkernel32.NewProc("GetProcAddress")
|
procGetProcAddress = modkernel32.NewProc("GetProcAddress")
|
||||||
@@ -2111,6 +2113,14 @@ func FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FlushConsoleInputBuffer(console Handle) (err error) {
|
||||||
|
r1, _, e1 := syscall.SyscallN(procFlushConsoleInputBuffer.Addr(), uintptr(console))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func FlushFileBuffers(handle Handle) (err error) {
|
func FlushFileBuffers(handle Handle) (err error) {
|
||||||
r1, _, e1 := syscall.SyscallN(procFlushFileBuffers.Addr(), uintptr(handle))
|
r1, _, e1 := syscall.SyscallN(procFlushFileBuffers.Addr(), uintptr(handle))
|
||||||
if r1 == 0 {
|
if r1 == 0 {
|
||||||
@@ -2481,6 +2491,14 @@ func GetNamedPipeServerProcessId(pipe Handle, serverProcessID *uint32) (err erro
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetNumberOfConsoleInputEvents(console Handle, numevents *uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.SyscallN(procGetNumberOfConsoleInputEvents.Addr(), uintptr(console), uintptr(unsafe.Pointer(numevents)))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) {
|
func GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) {
|
||||||
var _p0 uint32
|
var _p0 uint32
|
||||||
if wait {
|
if wait {
|
||||||
|
|||||||
+2
-9
@@ -427,13 +427,6 @@ type isolatingRunSequence struct {
|
|||||||
|
|
||||||
func (i *isolatingRunSequence) Len() int { return len(i.indexes) }
|
func (i *isolatingRunSequence) Len() int { return len(i.indexes) }
|
||||||
|
|
||||||
func maxLevel(a, b level) level {
|
|
||||||
if a > b {
|
|
||||||
return a
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types,
|
// Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types,
|
||||||
// either L or R, for each isolating run sequence.
|
// either L or R, for each isolating run sequence.
|
||||||
func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence {
|
func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence {
|
||||||
@@ -474,8 +467,8 @@ func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence {
|
|||||||
indexes: indexes,
|
indexes: indexes,
|
||||||
types: types,
|
types: types,
|
||||||
level: level,
|
level: level,
|
||||||
sos: typeForLevel(maxLevel(prevLevel, level)),
|
sos: typeForLevel(max(prevLevel, level)),
|
||||||
eos: typeForLevel(maxLevel(succLevel, level)),
|
eos: typeForLevel(max(succLevel, level)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -40,7 +40,7 @@ type Cursor struct {
|
|||||||
// Root returns a cursor for the virtual root node,
|
// Root returns a cursor for the virtual root node,
|
||||||
// whose children are the files provided to [New].
|
// whose children are the files provided to [New].
|
||||||
//
|
//
|
||||||
// Its [Cursor.Node] and [Cursor.Stack] methods return nil.
|
// Its [Cursor.Node] method return nil.
|
||||||
func (in *Inspector) Root() Cursor {
|
func (in *Inspector) Root() Cursor {
|
||||||
return Cursor{in, -1}
|
return Cursor{in, -1}
|
||||||
}
|
}
|
||||||
|
|||||||
+75
-10
@@ -5,9 +5,11 @@
|
|||||||
package packages
|
package packages
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"cmp"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"iter"
|
||||||
"os"
|
"os"
|
||||||
"sort"
|
"slices"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Visit visits all the packages in the import graph whose roots are
|
// Visit visits all the packages in the import graph whose roots are
|
||||||
@@ -16,6 +18,20 @@ import (
|
|||||||
// package's dependencies have been visited (postorder).
|
// package's dependencies have been visited (postorder).
|
||||||
// The boolean result of pre(pkg) determines whether
|
// The boolean result of pre(pkg) determines whether
|
||||||
// the imports of package pkg are visited.
|
// the imports of package pkg are visited.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// pkgs, err := Load(...)
|
||||||
|
// if err != nil { ... }
|
||||||
|
// Visit(pkgs, nil, func(pkg *Package) {
|
||||||
|
// log.Println(pkg)
|
||||||
|
// })
|
||||||
|
//
|
||||||
|
// In most cases, it is more convenient to use [Postorder]:
|
||||||
|
//
|
||||||
|
// for pkg := range Postorder(pkgs) {
|
||||||
|
// log.Println(pkg)
|
||||||
|
// }
|
||||||
func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) {
|
func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) {
|
||||||
seen := make(map[*Package]bool)
|
seen := make(map[*Package]bool)
|
||||||
var visit func(*Package)
|
var visit func(*Package)
|
||||||
@@ -24,13 +40,8 @@ func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) {
|
|||||||
seen[pkg] = true
|
seen[pkg] = true
|
||||||
|
|
||||||
if pre == nil || pre(pkg) {
|
if pre == nil || pre(pkg) {
|
||||||
paths := make([]string, 0, len(pkg.Imports))
|
for _, imp := range sorted(pkg.Imports) { // for determinism
|
||||||
for path := range pkg.Imports {
|
visit(imp)
|
||||||
paths = append(paths, path)
|
|
||||||
}
|
|
||||||
sort.Strings(paths) // Imports is a map, this makes visit stable
|
|
||||||
for _, path := range paths {
|
|
||||||
visit(pkg.Imports[path])
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +61,7 @@ func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) {
|
|||||||
func PrintErrors(pkgs []*Package) int {
|
func PrintErrors(pkgs []*Package) int {
|
||||||
var n int
|
var n int
|
||||||
errModules := make(map[*Module]bool)
|
errModules := make(map[*Module]bool)
|
||||||
Visit(pkgs, nil, func(pkg *Package) {
|
for pkg := range Postorder(pkgs) {
|
||||||
for _, err := range pkg.Errors {
|
for _, err := range pkg.Errors {
|
||||||
fmt.Fprintln(os.Stderr, err)
|
fmt.Fprintln(os.Stderr, err)
|
||||||
n++
|
n++
|
||||||
@@ -63,6 +74,60 @@ func PrintErrors(pkgs []*Package) int {
|
|||||||
fmt.Fprintln(os.Stderr, mod.Error.Err)
|
fmt.Fprintln(os.Stderr, mod.Error.Err)
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Postorder returns an iterator over the the packages in
|
||||||
|
// the import graph whose roots are pkg.
|
||||||
|
// Packages are enumerated in dependencies-first order.
|
||||||
|
func Postorder(pkgs []*Package) iter.Seq[*Package] {
|
||||||
|
return func(yield func(*Package) bool) {
|
||||||
|
seen := make(map[*Package]bool)
|
||||||
|
var visit func(*Package) bool
|
||||||
|
visit = func(pkg *Package) bool {
|
||||||
|
if !seen[pkg] {
|
||||||
|
seen[pkg] = true
|
||||||
|
for _, imp := range sorted(pkg.Imports) { // for determinism
|
||||||
|
if !visit(imp) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !yield(pkg) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
for _, pkg := range pkgs {
|
||||||
|
if !visit(pkg) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- copied from golang.org.x/tools/gopls/internal/util/moremaps --
|
||||||
|
|
||||||
|
// sorted returns an iterator over the entries of m in key order.
|
||||||
|
func sorted[M ~map[K]V, K cmp.Ordered, V any](m M) iter.Seq2[K, V] {
|
||||||
|
// TODO(adonovan): use maps.Sorted if proposal #68598 is accepted.
|
||||||
|
return func(yield func(K, V) bool) {
|
||||||
|
keys := keySlice(m)
|
||||||
|
slices.Sort(keys)
|
||||||
|
for _, k := range keys {
|
||||||
|
if !yield(k, m[k]) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// KeySlice returns the keys of the map M, like slices.Collect(maps.Keys(m)).
|
||||||
|
func keySlice[M ~map[K]V, K comparable, V any](m M) []K {
|
||||||
|
r := make([]K, 0, len(m))
|
||||||
|
for k := range m {
|
||||||
|
r = append(r, k)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|||||||
+4
-1
@@ -698,7 +698,10 @@ func Object(pkg *types.Package, p Path) (types.Object, error) {
|
|||||||
} else if false && aliases.Enabled() {
|
} else if false && aliases.Enabled() {
|
||||||
// The Enabled check is too expensive, so for now we
|
// The Enabled check is too expensive, so for now we
|
||||||
// simply assume that aliases are not enabled.
|
// simply assume that aliases are not enabled.
|
||||||
// TODO(adonovan): replace with "if true {" when go1.24 is assured.
|
//
|
||||||
|
// Now that go1.24 is assured, we should be able to
|
||||||
|
// replace this with "if true {", but it causes tests
|
||||||
|
// to fail. TODO(adonovan): investigate.
|
||||||
return nil, fmt.Errorf("cannot apply %q to %s (got %T, want alias)", code, t, t)
|
return nil, fmt.Errorf("cannot apply %q to %s (got %T, want alias)", code, t, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-17
@@ -11,7 +11,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"go/types"
|
"go/types"
|
||||||
"hash/maphash"
|
"hash/maphash"
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"golang.org/x/tools/internal/typeparams"
|
"golang.org/x/tools/internal/typeparams"
|
||||||
)
|
)
|
||||||
@@ -380,22 +379,8 @@ var theSeed = maphash.MakeSeed()
|
|||||||
func (hasher) hashTypeName(tname *types.TypeName) uint32 {
|
func (hasher) hashTypeName(tname *types.TypeName) uint32 {
|
||||||
// Since types.Identical uses == to compare TypeNames,
|
// Since types.Identical uses == to compare TypeNames,
|
||||||
// the Hash function uses maphash.Comparable.
|
// the Hash function uses maphash.Comparable.
|
||||||
// TODO(adonovan): or will, when it becomes available in go1.24.
|
hash := maphash.Comparable(theSeed, tname)
|
||||||
// In the meantime we use the pointer's numeric value.
|
return uint32(hash ^ (hash >> 32))
|
||||||
//
|
|
||||||
// hash := maphash.Comparable(theSeed, tname)
|
|
||||||
//
|
|
||||||
// (Another approach would be to hash the name and package
|
|
||||||
// path, and whether or not it is a package-level typename. It
|
|
||||||
// is rare for a package to define multiple local types with
|
|
||||||
// the same name.)
|
|
||||||
ptr := uintptr(unsafe.Pointer(tname))
|
|
||||||
if unsafe.Sizeof(ptr) == 8 {
|
|
||||||
hash := uint64(ptr)
|
|
||||||
return uint32(hash ^ (hash >> 32))
|
|
||||||
} else {
|
|
||||||
return uint32(ptr)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// shallowHash computes a hash of t without looking at any of its
|
// shallowHash computes a hash of t without looking at any of its
|
||||||
|
|||||||
-53
@@ -1,53 +0,0 @@
|
|||||||
// Copyright 2024 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build go1.22 && !go1.24
|
|
||||||
|
|
||||||
package gcimporter
|
|
||||||
|
|
||||||
import (
|
|
||||||
"go/token"
|
|
||||||
"go/types"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TODO(rfindley): delete this workaround once go1.24 is assured.
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
// Update markBlack so that it correctly sets the color
|
|
||||||
// of imported TypeNames.
|
|
||||||
//
|
|
||||||
// See the doc comment for markBlack for details.
|
|
||||||
|
|
||||||
type color uint32
|
|
||||||
const (
|
|
||||||
white color = iota
|
|
||||||
black
|
|
||||||
grey
|
|
||||||
)
|
|
||||||
type object struct {
|
|
||||||
_ *types.Scope
|
|
||||||
_ token.Pos
|
|
||||||
_ *types.Package
|
|
||||||
_ string
|
|
||||||
_ types.Type
|
|
||||||
_ uint32
|
|
||||||
color_ color
|
|
||||||
_ token.Pos
|
|
||||||
}
|
|
||||||
type typeName struct {
|
|
||||||
object
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the size of types.TypeName changes, this will fail to compile.
|
|
||||||
const delta = int64(unsafe.Sizeof(typeName{})) - int64(unsafe.Sizeof(types.TypeName{}))
|
|
||||||
var _ [-delta * delta]int
|
|
||||||
|
|
||||||
markBlack = func(obj *types.TypeName) {
|
|
||||||
type uP = unsafe.Pointer
|
|
||||||
var ptr *typeName
|
|
||||||
*(*uP)(uP(&ptr)) = uP(obj)
|
|
||||||
ptr.color_ = black
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+301
-295
@@ -12,348 +12,354 @@ type pkginfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var deps = [...]pkginfo{
|
var deps = [...]pkginfo{
|
||||||
{"archive/tar", "\x03j\x03E5\x01\v\x01#\x01\x01\x02\x05\n\x02\x01\x02\x02\v"},
|
{"archive/tar", "\x03k\x03E;\x01\n\x01$\x01\x01\x02\x05\b\x02\x01\x02\x02\f"},
|
||||||
{"archive/zip", "\x02\x04`\a\x16\x0205\x01+\x05\x01\x11\x03\x02\r\x04"},
|
{"archive/zip", "\x02\x04a\a\x03\x12\x021;\x01+\x05\x01\x0f\x03\x02\x0e\x04"},
|
||||||
{"bufio", "\x03j}F\x13"},
|
{"bufio", "\x03k\x83\x01D\x14"},
|
||||||
{"bytes", "m+R\x03\fH\x02\x02"},
|
{"bytes", "n*Y\x03\fG\x02\x02"},
|
||||||
{"cmp", ""},
|
{"cmp", ""},
|
||||||
{"compress/bzip2", "\x02\x02\xe6\x01C"},
|
{"compress/bzip2", "\x02\x02\xed\x01A"},
|
||||||
{"compress/flate", "\x02k\x03z\r\x025\x01\x03"},
|
{"compress/flate", "\x02l\x03\x80\x01\f\x033\x01\x03"},
|
||||||
{"compress/gzip", "\x02\x04`\a\x03\x15eU"},
|
{"compress/gzip", "\x02\x04a\a\x03\x14lT"},
|
||||||
{"compress/lzw", "\x02k\x03z"},
|
{"compress/lzw", "\x02l\x03\x80\x01"},
|
||||||
{"compress/zlib", "\x02\x04`\a\x03\x13\x01f"},
|
{"compress/zlib", "\x02\x04a\a\x03\x12\x01m"},
|
||||||
{"container/heap", "\xae\x02"},
|
{"container/heap", "\xb3\x02"},
|
||||||
{"container/list", ""},
|
{"container/list", ""},
|
||||||
{"container/ring", ""},
|
{"container/ring", ""},
|
||||||
{"context", "m\\i\x01\f"},
|
{"context", "n\\m\x01\r"},
|
||||||
{"crypto", "\x83\x01gE"},
|
{"crypto", "\x83\x01nC"},
|
||||||
{"crypto/aes", "\x10\n\a\x8e\x02"},
|
{"crypto/aes", "\x10\n\a\x93\x02"},
|
||||||
{"crypto/cipher", "\x03\x1e\x01\x01\x1d\x11\x1c,Q"},
|
{"crypto/cipher", "\x03\x1e\x01\x01\x1e\x11\x1c+X"},
|
||||||
{"crypto/des", "\x10\x13\x1d-,\x96\x01\x03"},
|
{"crypto/des", "\x10\x13\x1e-+\x9b\x01\x03"},
|
||||||
{"crypto/dsa", "@\x04)}\x0e"},
|
{"crypto/dsa", "A\x04)\x83\x01\r"},
|
||||||
{"crypto/ecdh", "\x03\v\f\x0e\x04\x14\x04\r\x1c}"},
|
{"crypto/ecdh", "\x03\v\f\x0e\x04\x15\x04\r\x1c\x83\x01"},
|
||||||
{"crypto/ecdsa", "\x0e\x05\x03\x04\x01\x0e\x16\x01\x04\f\x01\x1c}\x0e\x04L\x01"},
|
{"crypto/ecdsa", "\x0e\x05\x03\x04\x01\x0e\a\v\x05\x01\x04\f\x01\x1c\x83\x01\r\x05K\x01"},
|
||||||
{"crypto/ed25519", "\x0e\x1c\x16\n\a\x1c}E"},
|
{"crypto/ed25519", "\x0e\x1c\x11\x06\n\a\x1c\x83\x01C"},
|
||||||
{"crypto/elliptic", "0=}\x0e:"},
|
{"crypto/elliptic", "0>\x83\x01\r9"},
|
||||||
{"crypto/fips140", " \x05\x90\x01"},
|
{"crypto/fips140", " \x05"},
|
||||||
{"crypto/hkdf", "-\x12\x01-\x16"},
|
{"crypto/hkdf", "-\x13\x01-\x15"},
|
||||||
{"crypto/hmac", "\x1a\x14\x11\x01\x112"},
|
{"crypto/hmac", "\x1a\x14\x12\x01\x111"},
|
||||||
{"crypto/internal/boring", "\x0e\x02\rf"},
|
{"crypto/internal/boring", "\x0e\x02\rf"},
|
||||||
{"crypto/internal/boring/bbig", "\x1a\xde\x01M"},
|
{"crypto/internal/boring/bbig", "\x1a\xe4\x01M"},
|
||||||
{"crypto/internal/boring/bcache", "\xb3\x02\x12"},
|
{"crypto/internal/boring/bcache", "\xb8\x02\x13"},
|
||||||
{"crypto/internal/boring/sig", ""},
|
{"crypto/internal/boring/sig", ""},
|
||||||
{"crypto/internal/cryptotest", "\x03\r\n)\x0e\x19\x06\x13\x12#\a\t\x11\x11\x11\x1b\x01\f\r\x05\n"},
|
{"crypto/internal/cryptotest", "\x03\r\n\x06$\x0e\x19\x06\x12\x12 \x04\a\t\x16\x01\x11\x11\x1b\x01\a\x05\b\x03\x05\v"},
|
||||||
{"crypto/internal/entropy", "E"},
|
{"crypto/internal/entropy", "F"},
|
||||||
{"crypto/internal/fips140", ">/}9\r\x15"},
|
{"crypto/internal/fips140", "?/\x15\xa7\x01\v\x16"},
|
||||||
{"crypto/internal/fips140/aes", "\x03\x1d\x03\x02\x13\x04\x01\x01\x05*\x8c\x016"},
|
{"crypto/internal/fips140/aes", "\x03\x1d\x03\x02\x13\x05\x01\x01\x05*\x92\x014"},
|
||||||
{"crypto/internal/fips140/aes/gcm", " \x01\x02\x02\x02\x11\x04\x01\x06*\x8a\x01"},
|
{"crypto/internal/fips140/aes/gcm", " \x01\x02\x02\x02\x11\x05\x01\x06*\x8f\x01"},
|
||||||
{"crypto/internal/fips140/alias", "\xc5\x02"},
|
{"crypto/internal/fips140/alias", "\xcb\x02"},
|
||||||
{"crypto/internal/fips140/bigmod", "%\x17\x01\x06*\x8c\x01"},
|
{"crypto/internal/fips140/bigmod", "%\x18\x01\x06*\x92\x01"},
|
||||||
{"crypto/internal/fips140/check", " \x0e\x06\b\x02\xac\x01["},
|
{"crypto/internal/fips140/check", " \x0e\x06\t\x02\xb2\x01Z"},
|
||||||
{"crypto/internal/fips140/check/checktest", "%\xfe\x01\""},
|
{"crypto/internal/fips140/check/checktest", "%\x85\x02!"},
|
||||||
{"crypto/internal/fips140/drbg", "\x03\x1c\x01\x01\x04\x13\x04\b\x01(}\x0f9"},
|
{"crypto/internal/fips140/drbg", "\x03\x1c\x01\x01\x04\x13\x05\b\x01(\x83\x01\x0f7"},
|
||||||
{"crypto/internal/fips140/ecdh", "\x03\x1d\x05\x02\t\f1}\x0f9"},
|
{"crypto/internal/fips140/ecdh", "\x03\x1d\x05\x02\t\r1\x83\x01\x0f7"},
|
||||||
{"crypto/internal/fips140/ecdsa", "\x03\x1d\x04\x01\x02\a\x02\x067}H"},
|
{"crypto/internal/fips140/ecdsa", "\x03\x1d\x04\x01\x02\a\x02\x068\x15nF"},
|
||||||
{"crypto/internal/fips140/ed25519", "\x03\x1d\x05\x02\x04\v7\xc2\x01\x03"},
|
{"crypto/internal/fips140/ed25519", "\x03\x1d\x05\x02\x04\v8\xc6\x01\x03"},
|
||||||
{"crypto/internal/fips140/edwards25519", "%\a\f\x041\x8c\x019"},
|
{"crypto/internal/fips140/edwards25519", "%\a\f\x051\x92\x017"},
|
||||||
{"crypto/internal/fips140/edwards25519/field", "%\x13\x041\x8c\x01"},
|
{"crypto/internal/fips140/edwards25519/field", "%\x13\x051\x92\x01"},
|
||||||
{"crypto/internal/fips140/hkdf", "\x03\x1d\x05\t\x069"},
|
{"crypto/internal/fips140/hkdf", "\x03\x1d\x05\t\x06:\x15"},
|
||||||
{"crypto/internal/fips140/hmac", "\x03\x1d\x14\x01\x017"},
|
{"crypto/internal/fips140/hmac", "\x03\x1d\x14\x01\x018\x15"},
|
||||||
{"crypto/internal/fips140/mlkem", "\x03\x1d\x05\x02\x0e\x03\x041"},
|
{"crypto/internal/fips140/mlkem", "\x03\x1d\x05\x02\x0e\x03\x051"},
|
||||||
{"crypto/internal/fips140/nistec", "%\f\a\x041\x8c\x01*\x0f\x13"},
|
{"crypto/internal/fips140/nistec", "%\f\a\x051\x92\x01*\r\x14"},
|
||||||
{"crypto/internal/fips140/nistec/fiat", "%\x135\x8c\x01"},
|
{"crypto/internal/fips140/nistec/fiat", "%\x136\x92\x01"},
|
||||||
{"crypto/internal/fips140/pbkdf2", "\x03\x1d\x05\t\x069"},
|
{"crypto/internal/fips140/pbkdf2", "\x03\x1d\x05\t\x06:\x15"},
|
||||||
{"crypto/internal/fips140/rsa", "\x03\x1d\x04\x01\x02\r\x01\x01\x025}H"},
|
{"crypto/internal/fips140/rsa", "\x03\x1d\x04\x01\x02\r\x01\x01\x026\x15nF"},
|
||||||
{"crypto/internal/fips140/sha256", "\x03\x1d\x1c\x01\x06*\x8c\x01"},
|
{"crypto/internal/fips140/sha256", "\x03\x1d\x1d\x01\x06*\x15}"},
|
||||||
{"crypto/internal/fips140/sha3", "\x03\x1d\x18\x04\x010\x8c\x01L"},
|
{"crypto/internal/fips140/sha3", "\x03\x1d\x18\x05\x010\x92\x01K"},
|
||||||
{"crypto/internal/fips140/sha512", "\x03\x1d\x1c\x01\x06*\x8c\x01"},
|
{"crypto/internal/fips140/sha512", "\x03\x1d\x1d\x01\x06*\x15}"},
|
||||||
{"crypto/internal/fips140/ssh", " \x05"},
|
{"crypto/internal/fips140/ssh", "%^"},
|
||||||
{"crypto/internal/fips140/subtle", "#"},
|
{"crypto/internal/fips140/subtle", "#\x1a\xc3\x01"},
|
||||||
{"crypto/internal/fips140/tls12", "\x03\x1d\x05\t\x06\x027"},
|
{"crypto/internal/fips140/tls12", "\x03\x1d\x05\t\x06\x028\x15"},
|
||||||
{"crypto/internal/fips140/tls13", "\x03\x1d\x05\b\a\b1"},
|
{"crypto/internal/fips140/tls13", "\x03\x1d\x05\b\a\t1\x15"},
|
||||||
|
{"crypto/internal/fips140cache", "\xaa\x02\r&"},
|
||||||
{"crypto/internal/fips140deps", ""},
|
{"crypto/internal/fips140deps", ""},
|
||||||
{"crypto/internal/fips140deps/byteorder", "\x99\x01"},
|
{"crypto/internal/fips140deps/byteorder", "\x99\x01"},
|
||||||
{"crypto/internal/fips140deps/cpu", "\xad\x01\a"},
|
{"crypto/internal/fips140deps/cpu", "\xae\x01\a"},
|
||||||
{"crypto/internal/fips140deps/godebug", "\xb5\x01"},
|
{"crypto/internal/fips140deps/godebug", "\xb6\x01"},
|
||||||
{"crypto/internal/fips140hash", "5\x1a4\xc2\x01"},
|
{"crypto/internal/fips140hash", "5\x1b3\xc8\x01"},
|
||||||
{"crypto/internal/fips140only", "'\r\x01\x01M25"},
|
{"crypto/internal/fips140only", "'\r\x01\x01M3;"},
|
||||||
{"crypto/internal/fips140test", ""},
|
{"crypto/internal/fips140test", ""},
|
||||||
{"crypto/internal/hpke", "\x0e\x01\x01\x03\x1a\x1d#,`N"},
|
{"crypto/internal/hpke", "\x0e\x01\x01\x03\x053#+gM"},
|
||||||
{"crypto/internal/impl", "\xb0\x02"},
|
{"crypto/internal/impl", "\xb5\x02"},
|
||||||
{"crypto/internal/randutil", "\xea\x01\x12"},
|
{"crypto/internal/randutil", "\xf1\x01\x12"},
|
||||||
{"crypto/internal/sysrand", "mi!\x1f\r\x0f\x01\x01\v\x06"},
|
{"crypto/internal/sysrand", "nn! \r\r\x01\x01\f\x06"},
|
||||||
{"crypto/internal/sysrand/internal/seccomp", "m"},
|
{"crypto/internal/sysrand/internal/seccomp", "n"},
|
||||||
{"crypto/md5", "\x0e2-\x16\x16`"},
|
{"crypto/md5", "\x0e3-\x15\x16g"},
|
||||||
{"crypto/mlkem", "/"},
|
{"crypto/mlkem", "/"},
|
||||||
{"crypto/pbkdf2", "2\r\x01-\x16"},
|
{"crypto/pbkdf2", "2\x0e\x01-\x15"},
|
||||||
{"crypto/rand", "\x1a\x06\a\x19\x04\x01(}\x0eM"},
|
{"crypto/rand", "\x1a\x06\a\x1a\x04\x01(\x83\x01\rM"},
|
||||||
{"crypto/rc4", "#\x1d-\xc2\x01"},
|
{"crypto/rc4", "#\x1e-\xc6\x01"},
|
||||||
{"crypto/rsa", "\x0e\f\x01\t\x0f\f\x01\x04\x06\a\x1c\x03\x1325\r\x01"},
|
{"crypto/rsa", "\x0e\f\x01\t\x0f\r\x01\x04\x06\a\x1c\x03\x123;\f\x01"},
|
||||||
{"crypto/sha1", "\x0e\f&-\x16\x16\x14L"},
|
{"crypto/sha1", "\x0e\f'\x03*\x15\x16\x15R"},
|
||||||
{"crypto/sha256", "\x0e\f\x1aO"},
|
{"crypto/sha256", "\x0e\f\x1aO"},
|
||||||
{"crypto/sha3", "\x0e'N\xc2\x01"},
|
{"crypto/sha3", "\x0e'N\xc8\x01"},
|
||||||
{"crypto/sha512", "\x0e\f\x1cM"},
|
{"crypto/sha512", "\x0e\f\x1cM"},
|
||||||
{"crypto/subtle", "8\x96\x01U"},
|
{"crypto/subtle", "8\x9b\x01W"},
|
||||||
{"crypto/tls", "\x03\b\x02\x01\x01\x01\x01\x02\x01\x01\x01\x03\x01\a\x01\v\x02\n\x01\b\x05\x03\x01\x01\x01\x01\x02\x01\x02\x01\x17\x02\x03\x13\x16\x14\b5\x16\x16\r\n\x01\x01\x01\x02\x01\f\x06\x02\x01"},
|
{"crypto/tls", "\x03\b\x02\x01\x01\x01\x01\x02\x01\x01\x01\x02\x01\x01\a\x01\r\n\x01\t\x05\x03\x01\x01\x01\x01\x02\x01\x02\x01\x17\x02\x03\x12\x16\x15\b;\x16\x16\r\b\x01\x01\x01\x02\x01\r\x06\x02\x01\x0f"},
|
||||||
{"crypto/tls/internal/fips140tls", " \x93\x02"},
|
{"crypto/tls/internal/fips140tls", "\x17\xa1\x02"},
|
||||||
{"crypto/x509", "\x03\v\x01\x01\x01\x01\x01\x01\x01\x011\x03\x02\x01\x01\x02\x05\x0e\x06\x02\x02\x03E\x032\x01\x02\t\x01\x01\x01\a\x10\x05\x01\x06\x02\x05\f\x01\x02\r\x02\x01\x01\x02\x03\x01"},
|
{"crypto/x509", "\x03\v\x01\x01\x01\x01\x01\x01\x01\x012\x05\x01\x01\x02\x05\x0e\x06\x02\x02\x03E\x038\x01\x02\b\x01\x01\x02\a\x10\x05\x01\x06\x02\x05\n\x01\x02\x0e\x02\x01\x01\x02\x03\x01"},
|
||||||
{"crypto/x509/pkix", "c\x06\a\x88\x01G"},
|
{"crypto/x509/pkix", "d\x06\a\x8d\x01G"},
|
||||||
{"database/sql", "\x03\nJ\x16\x03z\f\x06\"\x05\n\x02\x03\x01\f\x02\x02\x02"},
|
{"database/sql", "\x03\nK\x16\x03\x80\x01\v\a\"\x05\b\x02\x03\x01\r\x02\x02\x02"},
|
||||||
{"database/sql/driver", "\r`\x03\xae\x01\x11\x10"},
|
{"database/sql/driver", "\ra\x03\xb4\x01\x0f\x11"},
|
||||||
{"debug/buildinfo", "\x03W\x02\x01\x01\b\a\x03`\x18\x02\x01+\x0f "},
|
{"debug/buildinfo", "\x03X\x02\x01\x01\b\a\x03e\x19\x02\x01+\x0f\x1f"},
|
||||||
{"debug/dwarf", "\x03c\a\x03z1\x13\x01\x01"},
|
{"debug/dwarf", "\x03d\a\x03\x80\x011\x11\x01\x01"},
|
||||||
{"debug/elf", "\x03\x06P\r\a\x03`\x19\x01,\x19\x01\x15"},
|
{"debug/elf", "\x03\x06Q\r\a\x03e\x1a\x01,\x17\x01\x16"},
|
||||||
{"debug/gosym", "\x03c\n\xbe\x01\x01\x01\x02"},
|
{"debug/gosym", "\x03d\n\xc2\x01\x01\x01\x02"},
|
||||||
{"debug/macho", "\x03\x06P\r\n`\x1a,\x19\x01"},
|
{"debug/macho", "\x03\x06Q\r\ne\x1b,\x17\x01"},
|
||||||
{"debug/pe", "\x03\x06P\r\a\x03`\x1a,\x19\x01\x15"},
|
{"debug/pe", "\x03\x06Q\r\a\x03e\x1b,\x17\x01\x16"},
|
||||||
{"debug/plan9obj", "f\a\x03`\x1a,"},
|
{"debug/plan9obj", "g\a\x03e\x1b,"},
|
||||||
{"embed", "m+:\x18\x01T"},
|
{"embed", "n*@\x19\x01S"},
|
||||||
{"embed/internal/embedtest", ""},
|
{"embed/internal/embedtest", ""},
|
||||||
{"encoding", ""},
|
{"encoding", ""},
|
||||||
{"encoding/ascii85", "\xea\x01E"},
|
{"encoding/ascii85", "\xf1\x01C"},
|
||||||
{"encoding/asn1", "\x03j\x03\x87\x01\x01&\x0f\x02\x01\x0f\x03\x01"},
|
{"encoding/asn1", "\x03k\x03\x8c\x01\x01'\r\x02\x01\x10\x03\x01"},
|
||||||
{"encoding/base32", "\xea\x01C\x02"},
|
{"encoding/base32", "\xf1\x01A\x02"},
|
||||||
{"encoding/base64", "\x99\x01QC\x02"},
|
{"encoding/base64", "\x99\x01XA\x02"},
|
||||||
{"encoding/binary", "m}\r'\x0f\x05"},
|
{"encoding/binary", "n\x83\x01\f(\r\x05"},
|
||||||
{"encoding/csv", "\x02\x01j\x03zF\x11\x02"},
|
{"encoding/csv", "\x02\x01k\x03\x80\x01D\x12\x02"},
|
||||||
{"encoding/gob", "\x02_\x05\a\x03`\x1a\f\x01\x02\x1d\b\x14\x01\x0e\x02"},
|
{"encoding/gob", "\x02`\x05\a\x03e\x1b\v\x01\x03\x1d\b\x12\x01\x0f\x02"},
|
||||||
{"encoding/hex", "m\x03zC\x03"},
|
{"encoding/hex", "n\x03\x80\x01A\x03"},
|
||||||
{"encoding/json", "\x03\x01]\x04\b\x03z\r'\x0f\x02\x01\x02\x0f\x01\x01\x02"},
|
{"encoding/json", "\x03\x01^\x04\b\x03\x80\x01\f(\r\x02\x01\x02\x10\x01\x01\x02"},
|
||||||
{"encoding/pem", "\x03b\b}C\x03"},
|
{"encoding/pem", "\x03c\b\x83\x01A\x03"},
|
||||||
{"encoding/xml", "\x02\x01^\f\x03z4\x05\f\x01\x02\x0f\x02"},
|
{"encoding/xml", "\x02\x01_\f\x03\x80\x014\x05\n\x01\x02\x10\x02"},
|
||||||
{"errors", "\xc9\x01|"},
|
{"errors", "\xca\x01\x81\x01"},
|
||||||
{"expvar", "jK9\t\n\x15\r\n\x02\x03\x01\x10"},
|
{"expvar", "kK?\b\v\x15\r\b\x02\x03\x01\x11"},
|
||||||
{"flag", "a\f\x03z,\b\x05\n\x02\x01\x0f"},
|
{"flag", "b\f\x03\x80\x01,\b\x05\b\x02\x01\x10"},
|
||||||
{"fmt", "mE8\r\x1f\b\x0f\x02\x03\x11"},
|
{"fmt", "nE>\f \b\r\x02\x03\x12"},
|
||||||
{"go/ast", "\x03\x01l\x0f\x01j\x03)\b\x0f\x02\x01"},
|
{"go/ast", "\x03\x01m\x0e\x01q\x03)\b\r\x02\x01"},
|
||||||
{"go/ast/internal/tests", ""},
|
{"go/build", "\x02\x01k\x03\x01\x02\x02\a\x02\x01\x17\x1f\x04\x02\t\x19\x13\x01+\x01\x04\x01\a\b\x02\x01\x12\x02\x02"},
|
||||||
{"go/build", "\x02\x01j\x03\x01\x03\x02\a\x02\x01\x17\x1e\x04\x02\t\x14\x12\x01+\x01\x04\x01\a\n\x02\x01\x11\x02\x02"},
|
{"go/build/constraint", "n\xc6\x01\x01\x12\x02"},
|
||||||
{"go/build/constraint", "m\xc2\x01\x01\x11\x02"},
|
{"go/constant", "q\x0f}\x01\x024\x01\x02\x12"},
|
||||||
{"go/constant", "p\x10w\x01\x016\x01\x02\x11"},
|
{"go/doc", "\x04m\x01\x05\t>31\x10\x02\x01\x12\x02"},
|
||||||
{"go/doc", "\x04l\x01\x06\t=-1\x12\x02\x01\x11\x02"},
|
{"go/doc/comment", "\x03n\xc1\x01\x01\x01\x01\x12\x02"},
|
||||||
{"go/doc/comment", "\x03m\xbd\x01\x01\x01\x01\x11\x02"},
|
{"go/format", "\x03n\x01\v\x01\x02qD"},
|
||||||
{"go/format", "\x03m\x01\f\x01\x02jF"},
|
{"go/importer", "s\a\x01\x01\x04\x01p9"},
|
||||||
{"go/importer", "s\a\x01\x01\x04\x01i9"},
|
{"go/internal/gccgoimporter", "\x02\x01X\x13\x03\x04\v\x01n\x02,\x01\x05\x11\x01\f\b"},
|
||||||
{"go/internal/gccgoimporter", "\x02\x01W\x13\x03\x05\v\x01g\x02,\x01\x05\x13\x01\v\b"},
|
{"go/internal/gcimporter", "\x02o\x0f\x010\x05\x0e-,\x15\x03\x02"},
|
||||||
{"go/internal/gcimporter", "\x02n\x10\x01/\x05\x0e',\x17\x03\x02"},
|
{"go/internal/srcimporter", "q\x01\x01\n\x03\x01p,\x01\x05\x12\x02\x14"},
|
||||||
{"go/internal/srcimporter", "p\x01\x02\n\x03\x01i,\x01\x05\x14\x02\x13"},
|
{"go/parser", "\x03k\x03\x01\x02\v\x01q\x01+\x06\x12"},
|
||||||
{"go/parser", "\x03j\x03\x01\x03\v\x01j\x01+\x06\x14"},
|
{"go/printer", "q\x01\x02\x03\tq\f \x15\x02\x01\x02\v\x05\x02"},
|
||||||
{"go/printer", "p\x01\x03\x03\tj\r\x1f\x17\x02\x01\x02\n\x05\x02"},
|
{"go/scanner", "\x03n\x0fq2\x10\x01\x13\x02"},
|
||||||
{"go/scanner", "\x03m\x10j2\x12\x01\x12\x02"},
|
{"go/token", "\x04m\x83\x01>\x02\x03\x01\x0f\x02"},
|
||||||
{"go/token", "\x04l\xbd\x01\x02\x03\x01\x0e\x02"},
|
{"go/types", "\x03\x01\x06d\x03\x01\x03\b\x03\x02\x15\x1f\x061\x04\x03\t \x06\a\b\x01\x01\x01\x02\x01\x0f\x02\x02"},
|
||||||
{"go/types", "\x03\x01\x06c\x03\x01\x04\b\x03\x02\x15\x1e\x06+\x04\x03\n%\a\n\x01\x01\x01\x02\x01\x0e\x02\x02"},
|
{"go/version", "\xbb\x01z"},
|
||||||
{"go/version", "\xba\x01v"},
|
{"hash", "\xf1\x01"},
|
||||||
{"hash", "\xea\x01"},
|
{"hash/adler32", "n\x15\x16"},
|
||||||
{"hash/adler32", "m\x16\x16"},
|
{"hash/crc32", "n\x15\x16\x15\x89\x01\x01\x13"},
|
||||||
{"hash/crc32", "m\x16\x16\x14\x85\x01\x01\x12"},
|
{"hash/crc64", "n\x15\x16\x9e\x01"},
|
||||||
{"hash/crc64", "m\x16\x16\x99\x01"},
|
{"hash/fnv", "n\x15\x16g"},
|
||||||
{"hash/fnv", "m\x16\x16`"},
|
{"hash/maphash", "\x83\x01\x11!\x03\x93\x01"},
|
||||||
{"hash/maphash", "\x94\x01\x05\x1b\x03@N"},
|
{"html", "\xb5\x02\x02\x12"},
|
||||||
{"html", "\xb0\x02\x02\x11"},
|
{"html/template", "\x03h\x06\x18-;\x01\n!\x05\x01\x02\x03\f\x01\x02\f\x01\x03\x02"},
|
||||||
{"html/template", "\x03g\x06\x19,5\x01\v \x05\x01\x02\x03\x0e\x01\x02\v\x01\x03\x02"},
|
{"image", "\x02l\x1ee\x0f4\x03\x01"},
|
||||||
{"image", "\x02k\x1f^\x0f6\x03\x01"},
|
|
||||||
{"image/color", ""},
|
{"image/color", ""},
|
||||||
{"image/color/palette", "\x8c\x01"},
|
{"image/color/palette", "\x8c\x01"},
|
||||||
{"image/draw", "\x8b\x01\x01\x04"},
|
{"image/draw", "\x8b\x01\x01\x04"},
|
||||||
{"image/gif", "\x02\x01\x05e\x03\x1b\x01\x01\x01\vQ"},
|
{"image/gif", "\x02\x01\x05f\x03\x1a\x01\x01\x01\vX"},
|
||||||
{"image/internal/imageutil", "\x8b\x01"},
|
{"image/internal/imageutil", "\x8b\x01"},
|
||||||
{"image/jpeg", "\x02k\x1e\x01\x04Z"},
|
{"image/jpeg", "\x02l\x1d\x01\x04a"},
|
||||||
{"image/png", "\x02\a]\n\x13\x02\x06\x01^E"},
|
{"image/png", "\x02\a^\n\x12\x02\x06\x01eC"},
|
||||||
{"index/suffixarray", "\x03c\a}\r*\f\x01"},
|
{"index/suffixarray", "\x03d\a\x83\x01\f+\n\x01"},
|
||||||
{"internal/abi", "\xb4\x01\x91\x01"},
|
{"internal/abi", "\xb5\x01\x96\x01"},
|
||||||
{"internal/asan", "\xc5\x02"},
|
{"internal/asan", "\xcb\x02"},
|
||||||
{"internal/bisect", "\xa3\x02\x0f\x01"},
|
{"internal/bisect", "\xaa\x02\r\x01"},
|
||||||
{"internal/buildcfg", "pG_\x06\x02\x05\f\x01"},
|
{"internal/buildcfg", "qGe\x06\x02\x05\n\x01"},
|
||||||
{"internal/bytealg", "\xad\x01\x98\x01"},
|
{"internal/bytealg", "\xae\x01\x9d\x01"},
|
||||||
{"internal/byteorder", ""},
|
{"internal/byteorder", ""},
|
||||||
{"internal/cfg", ""},
|
{"internal/cfg", ""},
|
||||||
{"internal/chacha8rand", "\x99\x01\x1b\x91\x01"},
|
{"internal/cgrouptest", "q[Q\x06\x0f\x02\x01\x04\x01"},
|
||||||
|
{"internal/chacha8rand", "\x99\x01\x15\a\x96\x01"},
|
||||||
{"internal/copyright", ""},
|
{"internal/copyright", ""},
|
||||||
{"internal/coverage", ""},
|
{"internal/coverage", ""},
|
||||||
{"internal/coverage/calloc", ""},
|
{"internal/coverage/calloc", ""},
|
||||||
{"internal/coverage/cfile", "j\x06\x17\x16\x01\x02\x01\x01\x01\x01\x01\x01\x01#\x01\x1f,\x06\a\f\x01\x03\f\x06"},
|
{"internal/coverage/cfile", "k\x06\x16\x17\x01\x02\x01\x01\x01\x01\x01\x01\x01#\x02$,\x06\a\n\x01\x03\r\x06"},
|
||||||
{"internal/coverage/cformat", "\x04l-\x04I\f7\x01\x02\f"},
|
{"internal/coverage/cformat", "\x04m-\x04O\v6\x01\x02\r"},
|
||||||
{"internal/coverage/cmerge", "p-Z"},
|
{"internal/coverage/cmerge", "q-_"},
|
||||||
{"internal/coverage/decodecounter", "f\n-\v\x02@,\x19\x16"},
|
{"internal/coverage/decodecounter", "g\n-\v\x02F,\x17\x17"},
|
||||||
{"internal/coverage/decodemeta", "\x02d\n\x17\x16\v\x02@,"},
|
{"internal/coverage/decodemeta", "\x02e\n\x16\x17\v\x02F,"},
|
||||||
{"internal/coverage/encodecounter", "\x02d\n-\f\x01\x02>\f \x17"},
|
{"internal/coverage/encodecounter", "\x02e\n-\f\x01\x02D\v!\x15"},
|
||||||
{"internal/coverage/encodemeta", "\x02\x01c\n\x13\x04\x16\r\x02>,/"},
|
{"internal/coverage/encodemeta", "\x02\x01d\n\x12\x04\x17\r\x02D,."},
|
||||||
{"internal/coverage/pods", "\x04l-y\x06\x05\f\x02\x01"},
|
{"internal/coverage/pods", "\x04m-\x7f\x06\x05\n\x02\x01"},
|
||||||
{"internal/coverage/rtcov", "\xc5\x02"},
|
{"internal/coverage/rtcov", "\xcb\x02"},
|
||||||
{"internal/coverage/slicereader", "f\nz["},
|
{"internal/coverage/slicereader", "g\n\x80\x01Z"},
|
||||||
{"internal/coverage/slicewriter", "pz"},
|
{"internal/coverage/slicewriter", "q\x80\x01"},
|
||||||
{"internal/coverage/stringtab", "p8\x04>"},
|
{"internal/coverage/stringtab", "q8\x04D"},
|
||||||
{"internal/coverage/test", ""},
|
{"internal/coverage/test", ""},
|
||||||
{"internal/coverage/uleb128", ""},
|
{"internal/coverage/uleb128", ""},
|
||||||
{"internal/cpu", "\xc5\x02"},
|
{"internal/cpu", "\xcb\x02"},
|
||||||
{"internal/dag", "\x04l\xbd\x01\x03"},
|
{"internal/dag", "\x04m\xc1\x01\x03"},
|
||||||
{"internal/diff", "\x03m\xbe\x01\x02"},
|
{"internal/diff", "\x03n\xc2\x01\x02"},
|
||||||
{"internal/exportdata", "\x02\x01j\x03\x03]\x1a,\x01\x05\x13\x01\x02"},
|
{"internal/exportdata", "\x02\x01k\x03\x02c\x1b,\x01\x05\x11\x01\x02"},
|
||||||
{"internal/filepathlite", "m+:\x19B"},
|
{"internal/filepathlite", "n*@\x1a@"},
|
||||||
{"internal/fmtsort", "\x04\x9a\x02\x0f"},
|
{"internal/fmtsort", "\x04\xa1\x02\r"},
|
||||||
{"internal/fuzz", "\x03\nA\x18\x04\x03\x03\x01\f\x0355\r\x02\x1d\x01\x05\x02\x05\f\x01\x02\x01\x01\v\x04\x02"},
|
{"internal/fuzz", "\x03\nB\x18\x04\x03\x03\x01\v\x036;\f\x03\x1d\x01\x05\x02\x05\n\x01\x02\x01\x01\f\x04\x02"},
|
||||||
{"internal/goarch", ""},
|
{"internal/goarch", ""},
|
||||||
{"internal/godebug", "\x96\x01 |\x01\x12"},
|
{"internal/godebug", "\x96\x01!\x80\x01\x01\x13"},
|
||||||
{"internal/godebugs", ""},
|
{"internal/godebugs", ""},
|
||||||
{"internal/goexperiment", ""},
|
{"internal/goexperiment", ""},
|
||||||
{"internal/goos", ""},
|
{"internal/goos", ""},
|
||||||
{"internal/goroot", "\x96\x02\x01\x05\x14\x02"},
|
{"internal/goroot", "\x9d\x02\x01\x05\x12\x02"},
|
||||||
{"internal/gover", "\x04"},
|
{"internal/gover", "\x04"},
|
||||||
{"internal/goversion", ""},
|
{"internal/goversion", ""},
|
||||||
{"internal/itoa", ""},
|
{"internal/itoa", ""},
|
||||||
{"internal/lazyregexp", "\x96\x02\v\x0f\x02"},
|
{"internal/lazyregexp", "\x9d\x02\v\r\x02"},
|
||||||
{"internal/lazytemplate", "\xea\x01,\x1a\x02\v"},
|
{"internal/lazytemplate", "\xf1\x01,\x18\x02\f"},
|
||||||
{"internal/msan", "\xc5\x02"},
|
{"internal/msan", "\xcb\x02"},
|
||||||
{"internal/nettrace", ""},
|
{"internal/nettrace", ""},
|
||||||
{"internal/obscuretestdata", "e\x85\x01,"},
|
{"internal/obscuretestdata", "f\x8b\x01,"},
|
||||||
{"internal/oserror", "m"},
|
{"internal/oserror", "n"},
|
||||||
{"internal/pkgbits", "\x03K\x18\a\x03\x05\vj\x0e\x1e\r\f\x01"},
|
{"internal/pkgbits", "\x03L\x18\a\x03\x04\vq\r\x1f\r\n\x01"},
|
||||||
{"internal/platform", ""},
|
{"internal/platform", ""},
|
||||||
{"internal/poll", "mO\x1a\x149\x0f\x01\x01\v\x06"},
|
{"internal/poll", "nO\x1f\x159\r\x01\x01\f\x06"},
|
||||||
{"internal/profile", "\x03\x04f\x03z7\r\x01\x01\x0f"},
|
{"internal/profile", "\x03\x04g\x03\x80\x017\v\x01\x01\x10"},
|
||||||
{"internal/profilerecord", ""},
|
{"internal/profilerecord", ""},
|
||||||
{"internal/race", "\x94\x01\xb1\x01"},
|
{"internal/race", "\x94\x01\xb7\x01"},
|
||||||
{"internal/reflectlite", "\x94\x01 3<\""},
|
{"internal/reflectlite", "\x94\x01!9<!"},
|
||||||
{"internal/runtime/atomic", "\xc5\x02"},
|
{"internal/runtime/atomic", "\xb5\x01\x96\x01"},
|
||||||
{"internal/runtime/exithook", "\xca\x01{"},
|
{"internal/runtime/cgroup", "\x98\x01:\x02w"},
|
||||||
{"internal/runtime/maps", "\x94\x01\x01\x1f\v\t\x05\x01w"},
|
{"internal/runtime/exithook", "\xcb\x01\x80\x01"},
|
||||||
{"internal/runtime/math", "\xb4\x01"},
|
{"internal/runtime/gc", "\xb5\x01"},
|
||||||
{"internal/runtime/sys", "\xb4\x01\x04"},
|
{"internal/runtime/maps", "\x94\x01\x01 \v\t\a\x03x"},
|
||||||
{"internal/runtime/syscall", "\xc5\x02"},
|
{"internal/runtime/math", "\xb5\x01"},
|
||||||
{"internal/saferio", "\xea\x01["},
|
{"internal/runtime/startlinetest", ""},
|
||||||
{"internal/singleflight", "\xb2\x02"},
|
{"internal/runtime/strconv", "\xd0\x01"},
|
||||||
{"internal/stringslite", "\x98\x01\xad\x01"},
|
{"internal/runtime/sys", "\xb5\x01\x04"},
|
||||||
{"internal/sync", "\x94\x01 \x14k\x12"},
|
{"internal/runtime/syscall", "\xb5\x01\x96\x01"},
|
||||||
{"internal/synctest", "\xc5\x02"},
|
{"internal/runtime/wasitest", ""},
|
||||||
{"internal/syscall/execenv", "\xb4\x02"},
|
{"internal/saferio", "\xf1\x01Z"},
|
||||||
{"internal/syscall/unix", "\xa3\x02\x10\x01\x11"},
|
{"internal/singleflight", "\xb7\x02"},
|
||||||
{"internal/sysinfo", "\x02\x01\xaa\x01=,\x1a\x02"},
|
{"internal/stringslite", "\x98\x01\xb3\x01"},
|
||||||
|
{"internal/sync", "\x94\x01!\x14o\x13"},
|
||||||
|
{"internal/synctest", "\x94\x01\xb7\x01"},
|
||||||
|
{"internal/syscall/execenv", "\xb9\x02"},
|
||||||
|
{"internal/syscall/unix", "\xaa\x02\x0e\x01\x12"},
|
||||||
|
{"internal/sysinfo", "\x02\x01\xab\x01C,\x18\x02"},
|
||||||
{"internal/syslist", ""},
|
{"internal/syslist", ""},
|
||||||
{"internal/testenv", "\x03\n`\x02\x01*\x1a\x10'+\x01\x05\a\f\x01\x02\x02\x01\n"},
|
{"internal/testenv", "\x03\na\x02\x01)\x1b\x10-+\x01\x05\a\n\x01\x02\x02\x01\v"},
|
||||||
{"internal/testlog", "\xb2\x02\x01\x12"},
|
{"internal/testhash", "\x03\x80\x01n\x118\v"},
|
||||||
{"internal/testpty", "m\x03\xa6\x01"},
|
{"internal/testlog", "\xb7\x02\x01\x13"},
|
||||||
{"internal/trace", "\x02\x01\x01\x06\\\a\x03n\x03\x03\x06\x03\n6\x01\x02\x0f\x06"},
|
{"internal/testpty", "n\x03\xac\x01"},
|
||||||
{"internal/trace/internal/testgen", "\x03c\nl\x03\x02\x03\x011\v\x0f"},
|
{"internal/trace", "\x02\x01\x01\x06]\a\x03t\x03\x03\x06\x03\t5\x01\x01\x01\x10\x06"},
|
||||||
{"internal/trace/internal/tracev1", "\x03\x01b\a\x03t\x06\r6\x01"},
|
{"internal/trace/internal/testgen", "\x03d\nr\x03\x02\x03\x011\v\r\x10"},
|
||||||
{"internal/trace/raw", "\x02d\nq\x03\x06E\x01\x11"},
|
{"internal/trace/internal/tracev1", "\x03\x01c\a\x03z\x06\f5\x01"},
|
||||||
{"internal/trace/testtrace", "\x02\x01j\x03l\x03\x06\x057\f\x02\x01"},
|
{"internal/trace/raw", "\x02e\nw\x03\x06C\x01\x12"},
|
||||||
|
{"internal/trace/testtrace", "\x02\x01k\x03r\x03\x05\x01\x057\n\x02\x01"},
|
||||||
{"internal/trace/tracev2", ""},
|
{"internal/trace/tracev2", ""},
|
||||||
{"internal/trace/traceviewer", "\x02]\v\x06\x1a<\x16\a\a\x04\t\n\x15\x01\x05\a\f\x01\x02\r"},
|
{"internal/trace/traceviewer", "\x02^\v\x06\x19=\x1c\a\a\x04\b\v\x15\x01\x05\a\n\x01\x02\x0e"},
|
||||||
{"internal/trace/traceviewer/format", ""},
|
{"internal/trace/traceviewer/format", ""},
|
||||||
{"internal/trace/version", "pq\t"},
|
{"internal/trace/version", "qw\t"},
|
||||||
{"internal/txtar", "\x03m\xa6\x01\x1a"},
|
{"internal/txtar", "\x03n\xac\x01\x18"},
|
||||||
{"internal/types/errors", "\xaf\x02"},
|
{"internal/types/errors", "\xb4\x02"},
|
||||||
{"internal/unsafeheader", "\xc5\x02"},
|
{"internal/unsafeheader", "\xcb\x02"},
|
||||||
{"internal/xcoff", "Y\r\a\x03`\x1a,\x19\x01"},
|
{"internal/xcoff", "Z\r\a\x03e\x1b,\x17\x01"},
|
||||||
{"internal/zstd", "f\a\x03z\x0f"},
|
{"internal/zstd", "g\a\x03\x80\x01\x0f"},
|
||||||
{"io", "m\xc5\x01"},
|
{"io", "n\xc9\x01"},
|
||||||
{"io/fs", "m+*(1\x12\x12\x04"},
|
{"io/fs", "n*+.1\x10\x13\x04"},
|
||||||
{"io/ioutil", "\xea\x01\x01+\x17\x03"},
|
{"io/ioutil", "\xf1\x01\x01+\x15\x03"},
|
||||||
{"iter", "\xc8\x01[\""},
|
{"iter", "\xc9\x01a!"},
|
||||||
{"log", "pz\x05'\r\x0f\x01\f"},
|
{"log", "q\x80\x01\x05'\r\r\x01\r"},
|
||||||
{"log/internal", ""},
|
{"log/internal", ""},
|
||||||
{"log/slog", "\x03\nT\t\x03\x03z\x04\x01\x02\x02\x04'\x05\n\x02\x01\x02\x01\f\x02\x02\x02"},
|
{"log/slog", "\x03\nU\t\x03\x03\x80\x01\x04\x01\x02\x02\x03(\x05\b\x02\x01\x02\x01\r\x02\x02\x02"},
|
||||||
{"log/slog/internal", ""},
|
{"log/slog/internal", ""},
|
||||||
{"log/slog/internal/benchmarks", "\r`\x03z\x06\x03<\x10"},
|
{"log/slog/internal/benchmarks", "\ra\x03\x80\x01\x06\x03:\x11"},
|
||||||
{"log/slog/internal/buffer", "\xb2\x02"},
|
{"log/slog/internal/buffer", "\xb7\x02"},
|
||||||
{"log/slog/internal/slogtest", "\xf0\x01"},
|
{"log/syslog", "n\x03\x84\x01\x12\x16\x18\x02\x0e"},
|
||||||
{"log/syslog", "m\x03~\x12\x16\x1a\x02\r"},
|
{"maps", "\xf4\x01W"},
|
||||||
{"maps", "\xed\x01X"},
|
{"math", "\xae\x01RK"},
|
||||||
{"math", "\xad\x01LL"},
|
{"math/big", "\x03k\x03(\x15C\f\x03\x020\x02\x01\x02\x14"},
|
||||||
{"math/big", "\x03j\x03)\x14=\r\x02\x024\x01\x02\x13"},
|
{"math/big/internal/asmgen", "\x03\x01m\x8f\x012\x03"},
|
||||||
{"math/bits", "\xc5\x02"},
|
{"math/bits", "\xcb\x02"},
|
||||||
{"math/cmplx", "\xf7\x01\x02"},
|
{"math/cmplx", "\xfd\x01\x03"},
|
||||||
{"math/rand", "\xb5\x01B;\x01\x12"},
|
{"math/rand", "\xb6\x01G:\x01\x13"},
|
||||||
{"math/rand/v2", "m,\x02\\\x02L"},
|
{"math/rand/v2", "n+\x03a\x03K"},
|
||||||
{"mime", "\x02\x01b\b\x03z\f \x17\x03\x02\x0f\x02"},
|
{"mime", "\x02\x01c\b\x03\x80\x01\v!\x15\x03\x02\x10\x02"},
|
||||||
{"mime/multipart", "\x02\x01G#\x03E5\f\x01\x06\x02\x15\x02\x06\x11\x02\x01\x15"},
|
{"mime/multipart", "\x02\x01H#\x03E;\v\x01\a\x02\x15\x02\x06\x0f\x02\x01\x16"},
|
||||||
{"mime/quotedprintable", "\x02\x01mz"},
|
{"mime/quotedprintable", "\x02\x01n\x80\x01"},
|
||||||
{"net", "\x04\t`+\x1d\a\x04\x05\f\x01\x04\x14\x01%\x06\r\n\x05\x01\x01\v\x06\a"},
|
{"net", "\x04\ta*\x1e\a\x04\x05\x11\x01\x04\x15\x01%\x06\r\b\x05\x01\x01\f\x06\a"},
|
||||||
{"net/http", "\x02\x01\x04\x04\x02=\b\x13\x01\a\x03E5\x01\x03\b\x01\x02\x02\x02\x01\x02\x06\x02\x01\x01\n\x01\x01\x05\x01\x02\x05\n\x01\x01\x01\x02\x01\x01\v\x02\x02\x02\b\x01\x01\x01"},
|
{"net/http", "\x02\x01\x04\x04\x02>\b\x13\x01\a\x03E;\x01\x03\a\x01\x03\x02\x02\x01\x02\x06\x02\x01\x01\n\x01\x01\x05\x01\x02\x05\b\x01\x01\x01\x02\x01\r\x02\x02\x02\b\x01\x01\x01"},
|
||||||
{"net/http/cgi", "\x02P\x1b\x03z\x04\b\n\x01\x13\x01\x01\x01\x04\x01\x05\x02\n\x02\x01\x0f\x0e"},
|
{"net/http/cgi", "\x02Q\x1b\x03\x80\x01\x04\a\v\x01\x13\x01\x01\x01\x04\x01\x05\x02\b\x02\x01\x10\x0e"},
|
||||||
{"net/http/cookiejar", "\x04i\x03\x90\x01\x01\b\f\x18\x03\x02\r\x04"},
|
{"net/http/cookiejar", "\x04j\x03\x96\x01\x01\b\f\x16\x03\x02\x0e\x04"},
|
||||||
{"net/http/fcgi", "\x02\x01\nY\a\x03z\x16\x01\x01\x14\x1a\x02\r"},
|
{"net/http/fcgi", "\x02\x01\nZ\a\x03\x80\x01\x16\x01\x01\x14\x18\x02\x0e"},
|
||||||
{"net/http/httptest", "\x02\x01\nE\x02\x1b\x01z\x04\x12\x01\n\t\x02\x19\x01\x02\r\x0e"},
|
{"net/http/httptest", "\x02\x01\nF\x02\x1b\x01\x80\x01\x04\x12\x01\n\t\x02\x17\x01\x02\x0e\x0e"},
|
||||||
{"net/http/httptrace", "\rEn@\x14\n!"},
|
{"net/http/httptrace", "\rFnF\x14\n "},
|
||||||
{"net/http/httputil", "\x02\x01\n`\x03z\x04\x0f\x03\x01\x05\x02\x01\v\x01\x1b\x02\r\x0e"},
|
{"net/http/httputil", "\x02\x01\na\x03\x80\x01\x04\x0f\x03\x01\x05\x02\x01\v\x01\x19\x02\x0e\x0e"},
|
||||||
{"net/http/internal", "\x02\x01j\x03z"},
|
{"net/http/internal", "\x02\x01k\x03\x80\x01"},
|
||||||
{"net/http/internal/ascii", "\xb0\x02\x11"},
|
{"net/http/internal/ascii", "\xb5\x02\x12"},
|
||||||
{"net/http/internal/httpcommon", "\r`\x03\x96\x01\x0e\x01\x19\x01\x01\x02\x1b\x02"},
|
{"net/http/internal/httpcommon", "\ra\x03\x9c\x01\x0e\x01\x17\x01\x01\x02\x1c\x02"},
|
||||||
{"net/http/internal/testcert", "\xb0\x02"},
|
{"net/http/internal/testcert", "\xb5\x02"},
|
||||||
{"net/http/pprof", "\x02\x01\nc\x19,\x11$\x04\x13\x14\x01\r\x06\x03\x01\x02\x01\x0f"},
|
{"net/http/pprof", "\x02\x01\nd\x18-\x11*\x04\x13\x14\x01\r\x04\x03\x01\x02\x01\x10"},
|
||||||
{"net/internal/cgotest", ""},
|
{"net/internal/cgotest", ""},
|
||||||
{"net/internal/socktest", "p\xc2\x01\x02"},
|
{"net/internal/socktest", "q\xc6\x01\x02"},
|
||||||
{"net/mail", "\x02k\x03z\x04\x0f\x03\x14\x1c\x02\r\x04"},
|
{"net/mail", "\x02l\x03\x80\x01\x04\x0f\x03\x14\x1a\x02\x0e\x04"},
|
||||||
{"net/netip", "\x04i+\x01#;\x026\x15"},
|
{"net/netip", "\x04j*\x01$@\x034\x16"},
|
||||||
{"net/rpc", "\x02f\x05\x03\x10\n`\x04\x12\x01\x1d\x0f\x03\x02"},
|
{"net/rpc", "\x02g\x05\x03\x0f\ng\x04\x12\x01\x1d\r\x03\x02"},
|
||||||
{"net/rpc/jsonrpc", "j\x03\x03z\x16\x11!"},
|
{"net/rpc/jsonrpc", "k\x03\x03\x80\x01\x16\x11\x1f"},
|
||||||
{"net/smtp", "\x19.\v\x13\b\x03z\x16\x14\x1c"},
|
{"net/smtp", "\x19/\v\x13\b\x03\x80\x01\x16\x14\x1a"},
|
||||||
{"net/textproto", "\x02\x01j\x03z\r\t/\x01\x02\x13"},
|
{"net/textproto", "\x02\x01k\x03\x80\x01\f\n-\x01\x02\x14"},
|
||||||
{"net/url", "m\x03\x86\x01%\x12\x02\x01\x15"},
|
{"net/url", "n\x03\x8b\x01&\x10\x02\x01\x16"},
|
||||||
{"os", "m+\x01\x18\x03\b\t\r\x03\x01\x04\x10\x018\n\x05\x01\x01\v\x06"},
|
{"os", "n*\x01\x19\x03\b\t\x12\x03\x01\x05\x10\x018\b\x05\x01\x01\f\x06"},
|
||||||
{"os/exec", "\x03\n`H \x01\x14\x01+\x06\a\f\x01\x04\v"},
|
{"os/exec", "\x03\naH%\x01\x15\x01+\x06\a\n\x01\x04\f"},
|
||||||
{"os/exec/internal/fdtest", "\xb4\x02"},
|
{"os/exec/internal/fdtest", "\xb9\x02"},
|
||||||
{"os/signal", "\r\x89\x02\x17\x05\x02"},
|
{"os/signal", "\r\x90\x02\x15\x05\x02"},
|
||||||
{"os/user", "\x02\x01j\x03z,\r\f\x01\x02"},
|
{"os/user", "\x02\x01k\x03\x80\x01,\r\n\x01\x02"},
|
||||||
{"path", "m+\xab\x01"},
|
{"path", "n*\xb1\x01"},
|
||||||
{"path/filepath", "m+\x19:+\r\n\x03\x04\x0f"},
|
{"path/filepath", "n*\x1a@+\r\b\x03\x04\x10"},
|
||||||
{"plugin", "m"},
|
{"plugin", "n"},
|
||||||
{"reflect", "m'\x04\x1c\b\f\x04\x02\x19\x10,\f\x03\x0f\x02\x02"},
|
{"reflect", "n&\x04\x1d\b\f\x06\x04\x1b\x06\t-\n\x03\x10\x02\x02"},
|
||||||
{"reflect/internal/example1", ""},
|
{"reflect/internal/example1", ""},
|
||||||
{"reflect/internal/example2", ""},
|
{"reflect/internal/example2", ""},
|
||||||
{"regexp", "\x03\xe7\x018\v\x02\x01\x02\x0f\x02"},
|
{"regexp", "\x03\xee\x018\t\x02\x01\x02\x10\x02"},
|
||||||
{"regexp/syntax", "\xad\x02\x01\x01\x01\x11\x02"},
|
{"regexp/syntax", "\xb2\x02\x01\x01\x01\x02\x10\x02"},
|
||||||
{"runtime", "\x94\x01\x04\x01\x02\f\x06\a\x02\x01\x01\x0f\x03\x01\x01\x01\x01\x01\x03\x0fd"},
|
{"runtime", "\x94\x01\x04\x01\x03\f\x06\a\x02\x01\x01\x0f\x03\x01\x01\x01\x01\x01\x02\x01\x01\x04\x10c"},
|
||||||
{"runtime/coverage", "\x9f\x01K"},
|
{"runtime/coverage", "\xa0\x01Q"},
|
||||||
{"runtime/debug", "pUQ\r\n\x02\x01\x0f\x06"},
|
{"runtime/debug", "qUW\r\b\x02\x01\x10\x06"},
|
||||||
{"runtime/internal/startlinetest", ""},
|
{"runtime/metrics", "\xb7\x01F-!"},
|
||||||
{"runtime/internal/wasitest", ""},
|
{"runtime/pprof", "\x02\x01\x01\x03\x06Z\a\x03#4)\f \r\b\x01\x01\x01\x02\x02\t\x03\x06"},
|
||||||
{"runtime/metrics", "\xb6\x01A,\""},
|
{"runtime/race", "\xb0\x02"},
|
||||||
{"runtime/pprof", "\x02\x01\x01\x03\x06Y\a\x03$3#\r\x1f\r\n\x01\x01\x01\x02\x02\b\x03\x06"},
|
|
||||||
{"runtime/race", "\xab\x02"},
|
|
||||||
{"runtime/race/internal/amd64v1", ""},
|
{"runtime/race/internal/amd64v1", ""},
|
||||||
{"runtime/trace", "\rcz9\x0f\x01\x12"},
|
{"runtime/trace", "\ra\x03w\t9\b\x05\x01\r\x06"},
|
||||||
{"slices", "\x04\xe9\x01\fL"},
|
{"slices", "\x04\xf0\x01\fK"},
|
||||||
{"sort", "\xc9\x0104"},
|
{"sort", "\xca\x0162"},
|
||||||
{"strconv", "m+:%\x02J"},
|
{"strconv", "n*@%\x03I"},
|
||||||
{"strings", "m'\x04:\x18\x03\f9\x0f\x02\x02"},
|
{"strings", "n&\x04@\x19\x03\f7\x10\x02\x02"},
|
||||||
{"structs", ""},
|
{"structs", ""},
|
||||||
{"sync", "\xc8\x01\vP\x10\x12"},
|
{"sync", "\xc9\x01\x10\x01P\x0e\x13"},
|
||||||
{"sync/atomic", "\xc5\x02"},
|
{"sync/atomic", "\xcb\x02"},
|
||||||
{"syscall", "m(\x03\x01\x1b\b\x03\x03\x06\aT\n\x05\x01\x12"},
|
{"syscall", "n'\x03\x01\x1c\b\x03\x03\x06\vV\b\x05\x01\x13"},
|
||||||
{"testing", "\x03\n`\x02\x01X\x0f\x13\r\x04\x1b\x06\x02\x05\x02\a\x01\x02\x01\x02\x01\f\x02\x02\x02"},
|
{"testing", "\x03\na\x02\x01X\x14\x14\f\x05\x1b\x06\x02\x05\x02\x05\x01\x02\x01\x02\x01\r\x02\x02\x02"},
|
||||||
{"testing/fstest", "m\x03z\x01\v%\x12\x03\b\a"},
|
{"testing/fstest", "n\x03\x80\x01\x01\n&\x10\x03\b\b"},
|
||||||
{"testing/internal/testdeps", "\x02\v\xa6\x01'\x10,\x03\x05\x03\b\a\x02\r"},
|
{"testing/internal/testdeps", "\x02\v\xa7\x01-\x10,\x03\x05\x03\x06\a\x02\x0e"},
|
||||||
{"testing/iotest", "\x03j\x03z\x04"},
|
{"testing/iotest", "\x03k\x03\x80\x01\x04"},
|
||||||
{"testing/quick", "o\x01\x87\x01\x04#\x12\x0f"},
|
{"testing/quick", "p\x01\x8c\x01\x05#\x10\x10"},
|
||||||
{"testing/slogtest", "\r`\x03\x80\x01.\x05\x12\n"},
|
{"testing/slogtest", "\ra\x03\x86\x01.\x05\x10\v"},
|
||||||
{"text/scanner", "\x03mz,+\x02"},
|
{"testing/synctest", "\xda\x01`\x11"},
|
||||||
{"text/tabwriter", "pzY"},
|
{"text/scanner", "\x03n\x80\x01,*\x02"},
|
||||||
{"text/template", "m\x03B8\x01\v\x1f\x01\x05\x01\x02\x05\r\x02\f\x03\x02"},
|
{"text/tabwriter", "q\x80\x01X"},
|
||||||
{"text/template/parse", "\x03m\xb3\x01\f\x01\x11\x02"},
|
{"text/template", "n\x03B>\x01\n \x01\x05\x01\x02\x05\v\x02\r\x03\x02"},
|
||||||
{"time", "m+\x1d\x1d'*\x0f\x02\x11"},
|
{"text/template/parse", "\x03n\xb9\x01\n\x01\x12\x02"},
|
||||||
{"time/tzdata", "m\xc7\x01\x11"},
|
{"time", "n*\x1e\"(*\r\x02\x12"},
|
||||||
|
{"time/tzdata", "n\xcb\x01\x12"},
|
||||||
{"unicode", ""},
|
{"unicode", ""},
|
||||||
{"unicode/utf16", ""},
|
{"unicode/utf16", ""},
|
||||||
{"unicode/utf8", ""},
|
{"unicode/utf8", ""},
|
||||||
{"unique", "\x94\x01>\x01P\x0f\x13\x12"},
|
{"unique", "\x94\x01!#\x01Q\r\x01\x13\x12"},
|
||||||
{"unsafe", ""},
|
{"unsafe", ""},
|
||||||
{"vendor/golang.org/x/crypto/chacha20", "\x10V\a\x8c\x01*'"},
|
{"vendor/golang.org/x/crypto/chacha20", "\x10W\a\x92\x01*&"},
|
||||||
{"vendor/golang.org/x/crypto/chacha20poly1305", "\x10V\a\xd9\x01\x04\x01\a"},
|
{"vendor/golang.org/x/crypto/chacha20poly1305", "\x10W\a\xde\x01\x04\x01\a"},
|
||||||
{"vendor/golang.org/x/crypto/cryptobyte", "c\n\x03\x88\x01&!\n"},
|
{"vendor/golang.org/x/crypto/cryptobyte", "d\n\x03\x8d\x01' \n"},
|
||||||
{"vendor/golang.org/x/crypto/cryptobyte/asn1", ""},
|
{"vendor/golang.org/x/crypto/cryptobyte/asn1", ""},
|
||||||
{"vendor/golang.org/x/crypto/internal/alias", "\xc5\x02"},
|
{"vendor/golang.org/x/crypto/internal/alias", "\xcb\x02"},
|
||||||
{"vendor/golang.org/x/crypto/internal/poly1305", "Q\x15\x93\x01"},
|
{"vendor/golang.org/x/crypto/internal/poly1305", "R\x15\x99\x01"},
|
||||||
{"vendor/golang.org/x/net/dns/dnsmessage", "m"},
|
{"vendor/golang.org/x/net/dns/dnsmessage", "n"},
|
||||||
{"vendor/golang.org/x/net/http/httpguts", "\x80\x02\x14\x1c\x13\r"},
|
{"vendor/golang.org/x/net/http/httpguts", "\x87\x02\x14\x1a\x14\r"},
|
||||||
{"vendor/golang.org/x/net/http/httpproxy", "m\x03\x90\x01\x15\x01\x1a\x13\r"},
|
{"vendor/golang.org/x/net/http/httpproxy", "n\x03\x96\x01\x10\x05\x01\x18\x14\r"},
|
||||||
{"vendor/golang.org/x/net/http2/hpack", "\x03j\x03zH"},
|
{"vendor/golang.org/x/net/http2/hpack", "\x03k\x03\x80\x01F"},
|
||||||
{"vendor/golang.org/x/net/idna", "p\x87\x019\x13\x10\x02\x01"},
|
{"vendor/golang.org/x/net/idna", "q\x8c\x018\x14\x10\x02\x01"},
|
||||||
{"vendor/golang.org/x/net/nettest", "\x03c\a\x03z\x11\x05\x16\x01\f\f\x01\x02\x02\x01\n"},
|
{"vendor/golang.org/x/net/nettest", "\x03d\a\x03\x80\x01\x11\x05\x16\x01\f\n\x01\x02\x02\x01\v"},
|
||||||
{"vendor/golang.org/x/sys/cpu", "\x96\x02\r\f\x01\x15"},
|
{"vendor/golang.org/x/sys/cpu", "\x9d\x02\r\n\x01\x16"},
|
||||||
{"vendor/golang.org/x/text/secure/bidirule", "m\xd6\x01\x11\x01"},
|
{"vendor/golang.org/x/text/secure/bidirule", "n\xdb\x01\x11\x01"},
|
||||||
{"vendor/golang.org/x/text/transform", "\x03j}Y"},
|
{"vendor/golang.org/x/text/transform", "\x03k\x83\x01X"},
|
||||||
{"vendor/golang.org/x/text/unicode/bidi", "\x03\be~@\x15"},
|
{"vendor/golang.org/x/text/unicode/bidi", "\x03\bf\x84\x01>\x16"},
|
||||||
{"vendor/golang.org/x/text/unicode/norm", "f\nzH\x11\x11"},
|
{"vendor/golang.org/x/text/unicode/norm", "g\n\x80\x01F\x12\x11"},
|
||||||
{"weak", "\x94\x01\x8f\x01\""},
|
{"weak", "\x94\x01\x96\x01!"},
|
||||||
}
|
}
|
||||||
|
|||||||
+54
-4
@@ -502,6 +502,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"MD4", Const, 0, ""},
|
{"MD4", Const, 0, ""},
|
||||||
{"MD5", Const, 0, ""},
|
{"MD5", Const, 0, ""},
|
||||||
{"MD5SHA1", Const, 0, ""},
|
{"MD5SHA1", Const, 0, ""},
|
||||||
|
{"MessageSigner", Type, 25, ""},
|
||||||
{"PrivateKey", Type, 0, ""},
|
{"PrivateKey", Type, 0, ""},
|
||||||
{"PublicKey", Type, 2, ""},
|
{"PublicKey", Type, 2, ""},
|
||||||
{"RIPEMD160", Const, 0, ""},
|
{"RIPEMD160", Const, 0, ""},
|
||||||
@@ -517,6 +518,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"SHA512", Const, 0, ""},
|
{"SHA512", Const, 0, ""},
|
||||||
{"SHA512_224", Const, 5, ""},
|
{"SHA512_224", Const, 5, ""},
|
||||||
{"SHA512_256", Const, 5, ""},
|
{"SHA512_256", Const, 5, ""},
|
||||||
|
{"SignMessage", Func, 25, "func(signer Signer, rand io.Reader, msg []byte, opts SignerOpts) (signature []byte, err error)"},
|
||||||
{"Signer", Type, 4, ""},
|
{"Signer", Type, 4, ""},
|
||||||
{"SignerOpts", Type, 4, ""},
|
{"SignerOpts", Type, 4, ""},
|
||||||
},
|
},
|
||||||
@@ -600,10 +602,12 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"X25519", Func, 20, "func() Curve"},
|
{"X25519", Func, 20, "func() Curve"},
|
||||||
},
|
},
|
||||||
"crypto/ecdsa": {
|
"crypto/ecdsa": {
|
||||||
|
{"(*PrivateKey).Bytes", Method, 25, ""},
|
||||||
{"(*PrivateKey).ECDH", Method, 20, ""},
|
{"(*PrivateKey).ECDH", Method, 20, ""},
|
||||||
{"(*PrivateKey).Equal", Method, 15, ""},
|
{"(*PrivateKey).Equal", Method, 15, ""},
|
||||||
{"(*PrivateKey).Public", Method, 4, ""},
|
{"(*PrivateKey).Public", Method, 4, ""},
|
||||||
{"(*PrivateKey).Sign", Method, 4, ""},
|
{"(*PrivateKey).Sign", Method, 4, ""},
|
||||||
|
{"(*PublicKey).Bytes", Method, 25, ""},
|
||||||
{"(*PublicKey).ECDH", Method, 20, ""},
|
{"(*PublicKey).ECDH", Method, 20, ""},
|
||||||
{"(*PublicKey).Equal", Method, 15, ""},
|
{"(*PublicKey).Equal", Method, 15, ""},
|
||||||
{"(PrivateKey).Add", Method, 0, ""},
|
{"(PrivateKey).Add", Method, 0, ""},
|
||||||
@@ -619,6 +623,8 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"(PublicKey).ScalarBaseMult", Method, 0, ""},
|
{"(PublicKey).ScalarBaseMult", Method, 0, ""},
|
||||||
{"(PublicKey).ScalarMult", Method, 0, ""},
|
{"(PublicKey).ScalarMult", Method, 0, ""},
|
||||||
{"GenerateKey", Func, 0, "func(c elliptic.Curve, rand io.Reader) (*PrivateKey, error)"},
|
{"GenerateKey", Func, 0, "func(c elliptic.Curve, rand io.Reader) (*PrivateKey, error)"},
|
||||||
|
{"ParseRawPrivateKey", Func, 25, "func(curve elliptic.Curve, data []byte) (*PrivateKey, error)"},
|
||||||
|
{"ParseUncompressedPublicKey", Func, 25, "func(curve elliptic.Curve, data []byte) (*PublicKey, error)"},
|
||||||
{"PrivateKey", Type, 0, ""},
|
{"PrivateKey", Type, 0, ""},
|
||||||
{"PrivateKey.D", Field, 0, ""},
|
{"PrivateKey.D", Field, 0, ""},
|
||||||
{"PrivateKey.PublicKey", Field, 0, ""},
|
{"PrivateKey.PublicKey", Field, 0, ""},
|
||||||
@@ -815,6 +821,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
"crypto/sha3": {
|
"crypto/sha3": {
|
||||||
{"(*SHA3).AppendBinary", Method, 24, ""},
|
{"(*SHA3).AppendBinary", Method, 24, ""},
|
||||||
{"(*SHA3).BlockSize", Method, 24, ""},
|
{"(*SHA3).BlockSize", Method, 24, ""},
|
||||||
|
{"(*SHA3).Clone", Method, 25, ""},
|
||||||
{"(*SHA3).MarshalBinary", Method, 24, ""},
|
{"(*SHA3).MarshalBinary", Method, 24, ""},
|
||||||
{"(*SHA3).Reset", Method, 24, ""},
|
{"(*SHA3).Reset", Method, 24, ""},
|
||||||
{"(*SHA3).Size", Method, 24, ""},
|
{"(*SHA3).Size", Method, 24, ""},
|
||||||
@@ -967,6 +974,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"Config.GetCertificate", Field, 4, ""},
|
{"Config.GetCertificate", Field, 4, ""},
|
||||||
{"Config.GetClientCertificate", Field, 8, ""},
|
{"Config.GetClientCertificate", Field, 8, ""},
|
||||||
{"Config.GetConfigForClient", Field, 8, ""},
|
{"Config.GetConfigForClient", Field, 8, ""},
|
||||||
|
{"Config.GetEncryptedClientHelloKeys", Field, 25, ""},
|
||||||
{"Config.InsecureSkipVerify", Field, 0, ""},
|
{"Config.InsecureSkipVerify", Field, 0, ""},
|
||||||
{"Config.KeyLogWriter", Field, 8, ""},
|
{"Config.KeyLogWriter", Field, 8, ""},
|
||||||
{"Config.MaxVersion", Field, 2, ""},
|
{"Config.MaxVersion", Field, 2, ""},
|
||||||
@@ -5463,6 +5471,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"ParenExpr.X", Field, 0, ""},
|
{"ParenExpr.X", Field, 0, ""},
|
||||||
{"Pkg", Const, 0, ""},
|
{"Pkg", Const, 0, ""},
|
||||||
{"Preorder", Func, 23, "func(root Node) iter.Seq[Node]"},
|
{"Preorder", Func, 23, "func(root Node) iter.Seq[Node]"},
|
||||||
|
{"PreorderStack", Func, 25, "func(root Node, stack []Node, f func(n Node, stack []Node) bool)"},
|
||||||
{"Print", Func, 0, "func(fset *token.FileSet, x any) error"},
|
{"Print", Func, 0, "func(fset *token.FileSet, x any) error"},
|
||||||
{"RECV", Const, 0, ""},
|
{"RECV", Const, 0, ""},
|
||||||
{"RangeStmt", Type, 0, ""},
|
{"RangeStmt", Type, 0, ""},
|
||||||
@@ -5933,6 +5942,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"(*File).SetLines", Method, 0, ""},
|
{"(*File).SetLines", Method, 0, ""},
|
||||||
{"(*File).SetLinesForContent", Method, 0, ""},
|
{"(*File).SetLinesForContent", Method, 0, ""},
|
||||||
{"(*File).Size", Method, 0, ""},
|
{"(*File).Size", Method, 0, ""},
|
||||||
|
{"(*FileSet).AddExistingFiles", Method, 25, ""},
|
||||||
{"(*FileSet).AddFile", Method, 0, ""},
|
{"(*FileSet).AddFile", Method, 0, ""},
|
||||||
{"(*FileSet).Base", Method, 0, ""},
|
{"(*FileSet).Base", Method, 0, ""},
|
||||||
{"(*FileSet).File", Method, 0, ""},
|
{"(*FileSet).File", Method, 0, ""},
|
||||||
@@ -6382,7 +6392,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"Label", Type, 5, ""},
|
{"Label", Type, 5, ""},
|
||||||
{"LocalVar", Const, 25, ""},
|
{"LocalVar", Const, 25, ""},
|
||||||
{"LookupFieldOrMethod", Func, 5, "func(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool)"},
|
{"LookupFieldOrMethod", Func, 5, "func(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool)"},
|
||||||
{"LookupSelection", Func, 25, ""},
|
{"LookupSelection", Func, 25, "func(T Type, addressable bool, pkg *Package, name string) (Selection, bool)"},
|
||||||
{"Map", Type, 5, ""},
|
{"Map", Type, 5, ""},
|
||||||
{"MethodExpr", Const, 5, ""},
|
{"MethodExpr", Const, 5, ""},
|
||||||
{"MethodSet", Type, 5, ""},
|
{"MethodSet", Type, 5, ""},
|
||||||
@@ -6490,9 +6500,11 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"Lang", Func, 22, "func(x string) string"},
|
{"Lang", Func, 22, "func(x string) string"},
|
||||||
},
|
},
|
||||||
"hash": {
|
"hash": {
|
||||||
|
{"Cloner", Type, 25, ""},
|
||||||
{"Hash", Type, 0, ""},
|
{"Hash", Type, 0, ""},
|
||||||
{"Hash32", Type, 0, ""},
|
{"Hash32", Type, 0, ""},
|
||||||
{"Hash64", Type, 0, ""},
|
{"Hash64", Type, 0, ""},
|
||||||
|
{"XOF", Type, 25, ""},
|
||||||
},
|
},
|
||||||
"hash/adler32": {
|
"hash/adler32": {
|
||||||
{"Checksum", Func, 0, "func(data []byte) uint32"},
|
{"Checksum", Func, 0, "func(data []byte) uint32"},
|
||||||
@@ -6533,6 +6545,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
},
|
},
|
||||||
"hash/maphash": {
|
"hash/maphash": {
|
||||||
{"(*Hash).BlockSize", Method, 14, ""},
|
{"(*Hash).BlockSize", Method, 14, ""},
|
||||||
|
{"(*Hash).Clone", Method, 25, ""},
|
||||||
{"(*Hash).Reset", Method, 14, ""},
|
{"(*Hash).Reset", Method, 14, ""},
|
||||||
{"(*Hash).Seed", Method, 14, ""},
|
{"(*Hash).Seed", Method, 14, ""},
|
||||||
{"(*Hash).SetSeed", Method, 14, ""},
|
{"(*Hash).SetSeed", Method, 14, ""},
|
||||||
@@ -7133,7 +7146,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"FormatFileInfo", Func, 21, "func(info FileInfo) string"},
|
{"FormatFileInfo", Func, 21, "func(info FileInfo) string"},
|
||||||
{"Glob", Func, 16, "func(fsys FS, pattern string) (matches []string, err error)"},
|
{"Glob", Func, 16, "func(fsys FS, pattern string) (matches []string, err error)"},
|
||||||
{"GlobFS", Type, 16, ""},
|
{"GlobFS", Type, 16, ""},
|
||||||
{"Lstat", Func, 25, ""},
|
{"Lstat", Func, 25, "func(fsys FS, name string) (FileInfo, error)"},
|
||||||
{"ModeAppend", Const, 16, ""},
|
{"ModeAppend", Const, 16, ""},
|
||||||
{"ModeCharDevice", Const, 16, ""},
|
{"ModeCharDevice", Const, 16, ""},
|
||||||
{"ModeDevice", Const, 16, ""},
|
{"ModeDevice", Const, 16, ""},
|
||||||
@@ -7158,7 +7171,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"ReadDirFile", Type, 16, ""},
|
{"ReadDirFile", Type, 16, ""},
|
||||||
{"ReadFile", Func, 16, "func(fsys FS, name string) ([]byte, error)"},
|
{"ReadFile", Func, 16, "func(fsys FS, name string) ([]byte, error)"},
|
||||||
{"ReadFileFS", Type, 16, ""},
|
{"ReadFileFS", Type, 16, ""},
|
||||||
{"ReadLink", Func, 25, ""},
|
{"ReadLink", Func, 25, "func(fsys FS, name string) (string, error)"},
|
||||||
{"ReadLinkFS", Type, 25, ""},
|
{"ReadLinkFS", Type, 25, ""},
|
||||||
{"SkipAll", Var, 20, ""},
|
{"SkipAll", Var, 20, ""},
|
||||||
{"SkipDir", Var, 16, ""},
|
{"SkipDir", Var, 16, ""},
|
||||||
@@ -7275,6 +7288,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"(Record).Attrs", Method, 21, ""},
|
{"(Record).Attrs", Method, 21, ""},
|
||||||
{"(Record).Clone", Method, 21, ""},
|
{"(Record).Clone", Method, 21, ""},
|
||||||
{"(Record).NumAttrs", Method, 21, ""},
|
{"(Record).NumAttrs", Method, 21, ""},
|
||||||
|
{"(Record).Source", Method, 25, ""},
|
||||||
{"(Value).Any", Method, 21, ""},
|
{"(Value).Any", Method, 21, ""},
|
||||||
{"(Value).Bool", Method, 21, ""},
|
{"(Value).Bool", Method, 21, ""},
|
||||||
{"(Value).Duration", Method, 21, ""},
|
{"(Value).Duration", Method, 21, ""},
|
||||||
@@ -7306,6 +7320,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"Float64", Func, 21, "func(key string, v float64) Attr"},
|
{"Float64", Func, 21, "func(key string, v float64) Attr"},
|
||||||
{"Float64Value", Func, 21, "func(v float64) Value"},
|
{"Float64Value", Func, 21, "func(v float64) Value"},
|
||||||
{"Group", Func, 21, "func(key string, args ...any) Attr"},
|
{"Group", Func, 21, "func(key string, args ...any) Attr"},
|
||||||
|
{"GroupAttrs", Func, 25, "func(key string, attrs ...Attr) Attr"},
|
||||||
{"GroupValue", Func, 21, "func(as ...Attr) Value"},
|
{"GroupValue", Func, 21, "func(as ...Attr) Value"},
|
||||||
{"Handler", Type, 21, ""},
|
{"Handler", Type, 21, ""},
|
||||||
{"HandlerOptions", Type, 21, ""},
|
{"HandlerOptions", Type, 21, ""},
|
||||||
@@ -7916,7 +7931,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"(*Writer).WriteField", Method, 0, ""},
|
{"(*Writer).WriteField", Method, 0, ""},
|
||||||
{"ErrMessageTooLarge", Var, 9, ""},
|
{"ErrMessageTooLarge", Var, 9, ""},
|
||||||
{"File", Type, 0, ""},
|
{"File", Type, 0, ""},
|
||||||
{"FileContentDisposition", Func, 25, ""},
|
{"FileContentDisposition", Func, 25, "func(fieldname string, filename string) string"},
|
||||||
{"FileHeader", Type, 0, ""},
|
{"FileHeader", Type, 0, ""},
|
||||||
{"FileHeader.Filename", Field, 0, ""},
|
{"FileHeader.Filename", Field, 0, ""},
|
||||||
{"FileHeader.Header", Field, 0, ""},
|
{"FileHeader.Header", Field, 0, ""},
|
||||||
@@ -8294,6 +8309,11 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"(*Client).PostForm", Method, 0, ""},
|
{"(*Client).PostForm", Method, 0, ""},
|
||||||
{"(*Cookie).String", Method, 0, ""},
|
{"(*Cookie).String", Method, 0, ""},
|
||||||
{"(*Cookie).Valid", Method, 18, ""},
|
{"(*Cookie).Valid", Method, 18, ""},
|
||||||
|
{"(*CrossOriginProtection).AddInsecureBypassPattern", Method, 25, ""},
|
||||||
|
{"(*CrossOriginProtection).AddTrustedOrigin", Method, 25, ""},
|
||||||
|
{"(*CrossOriginProtection).Check", Method, 25, ""},
|
||||||
|
{"(*CrossOriginProtection).Handler", Method, 25, ""},
|
||||||
|
{"(*CrossOriginProtection).SetDenyHandler", Method, 25, ""},
|
||||||
{"(*MaxBytesError).Error", Method, 19, ""},
|
{"(*MaxBytesError).Error", Method, 19, ""},
|
||||||
{"(*ProtocolError).Error", Method, 0, ""},
|
{"(*ProtocolError).Error", Method, 0, ""},
|
||||||
{"(*ProtocolError).Is", Method, 21, ""},
|
{"(*ProtocolError).Is", Method, 21, ""},
|
||||||
@@ -8388,6 +8408,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"Cookie.Unparsed", Field, 0, ""},
|
{"Cookie.Unparsed", Field, 0, ""},
|
||||||
{"Cookie.Value", Field, 0, ""},
|
{"Cookie.Value", Field, 0, ""},
|
||||||
{"CookieJar", Type, 0, ""},
|
{"CookieJar", Type, 0, ""},
|
||||||
|
{"CrossOriginProtection", Type, 25, ""},
|
||||||
{"DefaultClient", Var, 0, ""},
|
{"DefaultClient", Var, 0, ""},
|
||||||
{"DefaultMaxHeaderBytes", Const, 0, ""},
|
{"DefaultMaxHeaderBytes", Const, 0, ""},
|
||||||
{"DefaultMaxIdleConnsPerHost", Const, 0, ""},
|
{"DefaultMaxIdleConnsPerHost", Const, 0, ""},
|
||||||
@@ -8460,6 +8481,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"MethodPost", Const, 6, ""},
|
{"MethodPost", Const, 6, ""},
|
||||||
{"MethodPut", Const, 6, ""},
|
{"MethodPut", Const, 6, ""},
|
||||||
{"MethodTrace", Const, 6, ""},
|
{"MethodTrace", Const, 6, ""},
|
||||||
|
{"NewCrossOriginProtection", Func, 25, "func() *CrossOriginProtection"},
|
||||||
{"NewFileTransport", Func, 0, "func(fs FileSystem) RoundTripper"},
|
{"NewFileTransport", Func, 0, "func(fs FileSystem) RoundTripper"},
|
||||||
{"NewFileTransportFS", Func, 22, "func(fsys fs.FS) RoundTripper"},
|
{"NewFileTransportFS", Func, 22, "func(fsys fs.FS) RoundTripper"},
|
||||||
{"NewRequest", Func, 0, "func(method string, url string, body io.Reader) (*Request, error)"},
|
{"NewRequest", Func, 0, "func(method string, url string, body io.Reader) (*Request, error)"},
|
||||||
@@ -9174,15 +9196,19 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"(*Root).Link", Method, 25, ""},
|
{"(*Root).Link", Method, 25, ""},
|
||||||
{"(*Root).Lstat", Method, 24, ""},
|
{"(*Root).Lstat", Method, 24, ""},
|
||||||
{"(*Root).Mkdir", Method, 24, ""},
|
{"(*Root).Mkdir", Method, 24, ""},
|
||||||
|
{"(*Root).MkdirAll", Method, 25, ""},
|
||||||
{"(*Root).Name", Method, 24, ""},
|
{"(*Root).Name", Method, 24, ""},
|
||||||
{"(*Root).Open", Method, 24, ""},
|
{"(*Root).Open", Method, 24, ""},
|
||||||
{"(*Root).OpenFile", Method, 24, ""},
|
{"(*Root).OpenFile", Method, 24, ""},
|
||||||
{"(*Root).OpenRoot", Method, 24, ""},
|
{"(*Root).OpenRoot", Method, 24, ""},
|
||||||
|
{"(*Root).ReadFile", Method, 25, ""},
|
||||||
{"(*Root).Readlink", Method, 25, ""},
|
{"(*Root).Readlink", Method, 25, ""},
|
||||||
{"(*Root).Remove", Method, 24, ""},
|
{"(*Root).Remove", Method, 24, ""},
|
||||||
|
{"(*Root).RemoveAll", Method, 25, ""},
|
||||||
{"(*Root).Rename", Method, 25, ""},
|
{"(*Root).Rename", Method, 25, ""},
|
||||||
{"(*Root).Stat", Method, 24, ""},
|
{"(*Root).Stat", Method, 24, ""},
|
||||||
{"(*Root).Symlink", Method, 25, ""},
|
{"(*Root).Symlink", Method, 25, ""},
|
||||||
|
{"(*Root).WriteFile", Method, 25, ""},
|
||||||
{"(*SyscallError).Error", Method, 0, ""},
|
{"(*SyscallError).Error", Method, 0, ""},
|
||||||
{"(*SyscallError).Timeout", Method, 10, ""},
|
{"(*SyscallError).Timeout", Method, 10, ""},
|
||||||
{"(*SyscallError).Unwrap", Method, 13, ""},
|
{"(*SyscallError).Unwrap", Method, 13, ""},
|
||||||
@@ -9623,6 +9649,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"StructTag", Type, 0, ""},
|
{"StructTag", Type, 0, ""},
|
||||||
{"Swapper", Func, 8, "func(slice any) func(i int, j int)"},
|
{"Swapper", Func, 8, "func(slice any) func(i int, j int)"},
|
||||||
{"Type", Type, 0, ""},
|
{"Type", Type, 0, ""},
|
||||||
|
{"TypeAssert", Func, 25, "func[T any](v Value) (T, bool)"},
|
||||||
{"TypeFor", Func, 22, "func[T any]() Type"},
|
{"TypeFor", Func, 22, "func[T any]() Type"},
|
||||||
{"TypeOf", Func, 0, "func(i any) Type"},
|
{"TypeOf", Func, 0, "func(i any) Type"},
|
||||||
{"Uint", Const, 0, ""},
|
{"Uint", Const, 0, ""},
|
||||||
@@ -9909,6 +9936,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"SetBlockProfileRate", Func, 1, "func(rate int)"},
|
{"SetBlockProfileRate", Func, 1, "func(rate int)"},
|
||||||
{"SetCPUProfileRate", Func, 0, "func(hz int)"},
|
{"SetCPUProfileRate", Func, 0, "func(hz int)"},
|
||||||
{"SetCgoTraceback", Func, 7, "func(version int, traceback unsafe.Pointer, context unsafe.Pointer, symbolizer unsafe.Pointer)"},
|
{"SetCgoTraceback", Func, 7, "func(version int, traceback unsafe.Pointer, context unsafe.Pointer, symbolizer unsafe.Pointer)"},
|
||||||
|
{"SetDefaultGOMAXPROCS", Func, 25, "func()"},
|
||||||
{"SetFinalizer", Func, 0, "func(obj any, finalizer any)"},
|
{"SetFinalizer", Func, 0, "func(obj any, finalizer any)"},
|
||||||
{"SetMutexProfileFraction", Func, 8, "func(rate int) int"},
|
{"SetMutexProfileFraction", Func, 8, "func(rate int) int"},
|
||||||
{"Stack", Func, 0, "func(buf []byte, all bool) int"},
|
{"Stack", Func, 0, "func(buf []byte, all bool) int"},
|
||||||
@@ -10021,11 +10049,20 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"WriteHeapProfile", Func, 0, "func(w io.Writer) error"},
|
{"WriteHeapProfile", Func, 0, "func(w io.Writer) error"},
|
||||||
},
|
},
|
||||||
"runtime/trace": {
|
"runtime/trace": {
|
||||||
|
{"(*FlightRecorder).Enabled", Method, 25, ""},
|
||||||
|
{"(*FlightRecorder).Start", Method, 25, ""},
|
||||||
|
{"(*FlightRecorder).Stop", Method, 25, ""},
|
||||||
|
{"(*FlightRecorder).WriteTo", Method, 25, ""},
|
||||||
{"(*Region).End", Method, 11, ""},
|
{"(*Region).End", Method, 11, ""},
|
||||||
{"(*Task).End", Method, 11, ""},
|
{"(*Task).End", Method, 11, ""},
|
||||||
|
{"FlightRecorder", Type, 25, ""},
|
||||||
|
{"FlightRecorderConfig", Type, 25, ""},
|
||||||
|
{"FlightRecorderConfig.MaxBytes", Field, 25, ""},
|
||||||
|
{"FlightRecorderConfig.MinAge", Field, 25, ""},
|
||||||
{"IsEnabled", Func, 11, "func() bool"},
|
{"IsEnabled", Func, 11, "func() bool"},
|
||||||
{"Log", Func, 11, "func(ctx context.Context, category string, message string)"},
|
{"Log", Func, 11, "func(ctx context.Context, category string, message string)"},
|
||||||
{"Logf", Func, 11, "func(ctx context.Context, category string, format string, args ...any)"},
|
{"Logf", Func, 11, "func(ctx context.Context, category string, format string, args ...any)"},
|
||||||
|
{"NewFlightRecorder", Func, 25, "func(cfg FlightRecorderConfig) *FlightRecorder"},
|
||||||
{"NewTask", Func, 11, "func(pctx context.Context, taskType string) (ctx context.Context, task *Task)"},
|
{"NewTask", Func, 11, "func(pctx context.Context, taskType string) (ctx context.Context, task *Task)"},
|
||||||
{"Region", Type, 11, ""},
|
{"Region", Type, 11, ""},
|
||||||
{"Start", Func, 5, "func(w io.Writer) error"},
|
{"Start", Func, 5, "func(w io.Writer) error"},
|
||||||
@@ -16642,6 +16679,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"ValueOf", Func, 0, ""},
|
{"ValueOf", Func, 0, ""},
|
||||||
},
|
},
|
||||||
"testing": {
|
"testing": {
|
||||||
|
{"(*B).Attr", Method, 25, ""},
|
||||||
{"(*B).Chdir", Method, 24, ""},
|
{"(*B).Chdir", Method, 24, ""},
|
||||||
{"(*B).Cleanup", Method, 14, ""},
|
{"(*B).Cleanup", Method, 14, ""},
|
||||||
{"(*B).Context", Method, 24, ""},
|
{"(*B).Context", Method, 24, ""},
|
||||||
@@ -16658,6 +16696,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"(*B).Logf", Method, 0, ""},
|
{"(*B).Logf", Method, 0, ""},
|
||||||
{"(*B).Loop", Method, 24, ""},
|
{"(*B).Loop", Method, 24, ""},
|
||||||
{"(*B).Name", Method, 8, ""},
|
{"(*B).Name", Method, 8, ""},
|
||||||
|
{"(*B).Output", Method, 25, ""},
|
||||||
{"(*B).ReportAllocs", Method, 1, ""},
|
{"(*B).ReportAllocs", Method, 1, ""},
|
||||||
{"(*B).ReportMetric", Method, 13, ""},
|
{"(*B).ReportMetric", Method, 13, ""},
|
||||||
{"(*B).ResetTimer", Method, 0, ""},
|
{"(*B).ResetTimer", Method, 0, ""},
|
||||||
@@ -16674,6 +16713,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"(*B).StopTimer", Method, 0, ""},
|
{"(*B).StopTimer", Method, 0, ""},
|
||||||
{"(*B).TempDir", Method, 15, ""},
|
{"(*B).TempDir", Method, 15, ""},
|
||||||
{"(*F).Add", Method, 18, ""},
|
{"(*F).Add", Method, 18, ""},
|
||||||
|
{"(*F).Attr", Method, 25, ""},
|
||||||
{"(*F).Chdir", Method, 24, ""},
|
{"(*F).Chdir", Method, 24, ""},
|
||||||
{"(*F).Cleanup", Method, 18, ""},
|
{"(*F).Cleanup", Method, 18, ""},
|
||||||
{"(*F).Context", Method, 24, ""},
|
{"(*F).Context", Method, 24, ""},
|
||||||
@@ -16689,6 +16729,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"(*F).Log", Method, 18, ""},
|
{"(*F).Log", Method, 18, ""},
|
||||||
{"(*F).Logf", Method, 18, ""},
|
{"(*F).Logf", Method, 18, ""},
|
||||||
{"(*F).Name", Method, 18, ""},
|
{"(*F).Name", Method, 18, ""},
|
||||||
|
{"(*F).Output", Method, 25, ""},
|
||||||
{"(*F).Setenv", Method, 18, ""},
|
{"(*F).Setenv", Method, 18, ""},
|
||||||
{"(*F).Skip", Method, 18, ""},
|
{"(*F).Skip", Method, 18, ""},
|
||||||
{"(*F).SkipNow", Method, 18, ""},
|
{"(*F).SkipNow", Method, 18, ""},
|
||||||
@@ -16697,6 +16738,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"(*F).TempDir", Method, 18, ""},
|
{"(*F).TempDir", Method, 18, ""},
|
||||||
{"(*M).Run", Method, 4, ""},
|
{"(*M).Run", Method, 4, ""},
|
||||||
{"(*PB).Next", Method, 3, ""},
|
{"(*PB).Next", Method, 3, ""},
|
||||||
|
{"(*T).Attr", Method, 25, ""},
|
||||||
{"(*T).Chdir", Method, 24, ""},
|
{"(*T).Chdir", Method, 24, ""},
|
||||||
{"(*T).Cleanup", Method, 14, ""},
|
{"(*T).Cleanup", Method, 14, ""},
|
||||||
{"(*T).Context", Method, 24, ""},
|
{"(*T).Context", Method, 24, ""},
|
||||||
@@ -16712,6 +16754,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"(*T).Log", Method, 0, ""},
|
{"(*T).Log", Method, 0, ""},
|
||||||
{"(*T).Logf", Method, 0, ""},
|
{"(*T).Logf", Method, 0, ""},
|
||||||
{"(*T).Name", Method, 8, ""},
|
{"(*T).Name", Method, 8, ""},
|
||||||
|
{"(*T).Output", Method, 25, ""},
|
||||||
{"(*T).Parallel", Method, 0, ""},
|
{"(*T).Parallel", Method, 0, ""},
|
||||||
{"(*T).Run", Method, 7, ""},
|
{"(*T).Run", Method, 7, ""},
|
||||||
{"(*T).Setenv", Method, 17, ""},
|
{"(*T).Setenv", Method, 17, ""},
|
||||||
@@ -16834,6 +16877,10 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"Run", Func, 22, "func(t *testing.T, newHandler func(*testing.T) slog.Handler, result func(*testing.T) map[string]any)"},
|
{"Run", Func, 22, "func(t *testing.T, newHandler func(*testing.T) slog.Handler, result func(*testing.T) map[string]any)"},
|
||||||
{"TestHandler", Func, 21, "func(h slog.Handler, results func() []map[string]any) error"},
|
{"TestHandler", Func, 21, "func(h slog.Handler, results func() []map[string]any) error"},
|
||||||
},
|
},
|
||||||
|
"testing/synctest": {
|
||||||
|
{"Test", Func, 25, "func(t *testing.T, f func(*testing.T))"},
|
||||||
|
{"Wait", Func, 25, "func()"},
|
||||||
|
},
|
||||||
"text/scanner": {
|
"text/scanner": {
|
||||||
{"(*Position).IsValid", Method, 0, ""},
|
{"(*Position).IsValid", Method, 0, ""},
|
||||||
{"(*Scanner).Init", Method, 0, ""},
|
{"(*Scanner).Init", Method, 0, ""},
|
||||||
@@ -17347,6 +17394,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"CaseRange.Lo", Field, 0, ""},
|
{"CaseRange.Lo", Field, 0, ""},
|
||||||
{"CaseRanges", Var, 0, ""},
|
{"CaseRanges", Var, 0, ""},
|
||||||
{"Categories", Var, 0, ""},
|
{"Categories", Var, 0, ""},
|
||||||
|
{"CategoryAliases", Var, 25, ""},
|
||||||
{"Caucasian_Albanian", Var, 4, ""},
|
{"Caucasian_Albanian", Var, 4, ""},
|
||||||
{"Cc", Var, 0, ""},
|
{"Cc", Var, 0, ""},
|
||||||
{"Cf", Var, 0, ""},
|
{"Cf", Var, 0, ""},
|
||||||
@@ -17354,6 +17402,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"Cham", Var, 0, ""},
|
{"Cham", Var, 0, ""},
|
||||||
{"Cherokee", Var, 0, ""},
|
{"Cherokee", Var, 0, ""},
|
||||||
{"Chorasmian", Var, 16, ""},
|
{"Chorasmian", Var, 16, ""},
|
||||||
|
{"Cn", Var, 25, ""},
|
||||||
{"Co", Var, 0, ""},
|
{"Co", Var, 0, ""},
|
||||||
{"Common", Var, 0, ""},
|
{"Common", Var, 0, ""},
|
||||||
{"Coptic", Var, 0, ""},
|
{"Coptic", Var, 0, ""},
|
||||||
@@ -17432,6 +17481,7 @@ var PackageSymbols = map[string][]Symbol{
|
|||||||
{"Khojki", Var, 4, ""},
|
{"Khojki", Var, 4, ""},
|
||||||
{"Khudawadi", Var, 4, ""},
|
{"Khudawadi", Var, 4, ""},
|
||||||
{"L", Var, 0, ""},
|
{"L", Var, 0, ""},
|
||||||
|
{"LC", Var, 25, ""},
|
||||||
{"Lao", Var, 0, ""},
|
{"Lao", Var, 0, ""},
|
||||||
{"Latin", Var, 0, ""},
|
{"Latin", Var, 0, ""},
|
||||||
{"Lepcha", Var, 0, ""},
|
{"Lepcha", Var, 0, ""},
|
||||||
|
|||||||
Vendored
+11
-9
@@ -2346,7 +2346,7 @@ go.yaml.in/yaml/v2
|
|||||||
# go.yaml.in/yaml/v3 v3.0.4
|
# go.yaml.in/yaml/v3 v3.0.4
|
||||||
## explicit; go 1.16
|
## explicit; go 1.16
|
||||||
go.yaml.in/yaml/v3
|
go.yaml.in/yaml/v3
|
||||||
# golang.org/x/crypto v0.42.0
|
# golang.org/x/crypto v0.43.0
|
||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/crypto/argon2
|
golang.org/x/crypto/argon2
|
||||||
golang.org/x/crypto/bcrypt
|
golang.org/x/crypto/bcrypt
|
||||||
@@ -2394,12 +2394,12 @@ golang.org/x/image/math/fixed
|
|||||||
golang.org/x/image/tiff
|
golang.org/x/image/tiff
|
||||||
golang.org/x/image/tiff/lzw
|
golang.org/x/image/tiff/lzw
|
||||||
golang.org/x/image/vector
|
golang.org/x/image/vector
|
||||||
# golang.org/x/mod v0.27.0
|
# golang.org/x/mod v0.28.0
|
||||||
## explicit; go 1.23.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/mod/internal/lazyregexp
|
golang.org/x/mod/internal/lazyregexp
|
||||||
golang.org/x/mod/module
|
golang.org/x/mod/module
|
||||||
golang.org/x/mod/semver
|
golang.org/x/mod/semver
|
||||||
# golang.org/x/net v0.44.0
|
# golang.org/x/net v0.46.0
|
||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/net/bpf
|
golang.org/x/net/bpf
|
||||||
golang.org/x/net/context
|
golang.org/x/net/context
|
||||||
@@ -2432,7 +2432,7 @@ golang.org/x/oauth2/internal
|
|||||||
golang.org/x/sync/errgroup
|
golang.org/x/sync/errgroup
|
||||||
golang.org/x/sync/semaphore
|
golang.org/x/sync/semaphore
|
||||||
golang.org/x/sync/singleflight
|
golang.org/x/sync/singleflight
|
||||||
# golang.org/x/sys v0.36.0
|
# golang.org/x/sys v0.37.0
|
||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/sys/cpu
|
golang.org/x/sys/cpu
|
||||||
golang.org/x/sys/execabs
|
golang.org/x/sys/execabs
|
||||||
@@ -2443,10 +2443,10 @@ golang.org/x/sys/windows/registry
|
|||||||
golang.org/x/sys/windows/svc
|
golang.org/x/sys/windows/svc
|
||||||
golang.org/x/sys/windows/svc/eventlog
|
golang.org/x/sys/windows/svc/eventlog
|
||||||
golang.org/x/sys/windows/svc/mgr
|
golang.org/x/sys/windows/svc/mgr
|
||||||
# golang.org/x/term v0.35.0
|
# golang.org/x/term v0.36.0
|
||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/term
|
golang.org/x/term
|
||||||
# golang.org/x/text v0.29.0
|
# golang.org/x/text v0.30.0
|
||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/text/cases
|
golang.org/x/text/cases
|
||||||
golang.org/x/text/encoding
|
golang.org/x/text/encoding
|
||||||
@@ -2474,8 +2474,8 @@ golang.org/x/text/width
|
|||||||
# golang.org/x/time v0.13.0
|
# golang.org/x/time v0.13.0
|
||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/time/rate
|
golang.org/x/time/rate
|
||||||
# golang.org/x/tools v0.36.0
|
# golang.org/x/tools v0.37.0
|
||||||
## explicit; go 1.23.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/tools/cover
|
golang.org/x/tools/cover
|
||||||
golang.org/x/tools/go/ast/astutil
|
golang.org/x/tools/go/ast/astutil
|
||||||
golang.org/x/tools/go/ast/edge
|
golang.org/x/tools/go/ast/edge
|
||||||
@@ -2501,6 +2501,8 @@ golang.org/x/tools/internal/stdlib
|
|||||||
golang.org/x/tools/internal/typeparams
|
golang.org/x/tools/internal/typeparams
|
||||||
golang.org/x/tools/internal/typesinternal
|
golang.org/x/tools/internal/typesinternal
|
||||||
golang.org/x/tools/internal/versions
|
golang.org/x/tools/internal/versions
|
||||||
|
# golang.org/x/tools/godoc v0.1.0-deprecated
|
||||||
|
## explicit; go 1.24.0
|
||||||
# google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb
|
# google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb
|
||||||
## explicit; go 1.23.0
|
## explicit; go 1.23.0
|
||||||
google.golang.org/genproto/protobuf/field_mask
|
google.golang.org/genproto/protobuf/field_mask
|
||||||
|
|||||||
Reference in New Issue
Block a user