Skip to content

Commit 6d70273

Browse files
authored
Experimental: Add Kernel TLS (#401)
Attempt to use Kernel TLS if available and using `-ktls` parameter. * Enable Kernel TLS: `sudo modprobe tls` * Disable KTLS: `sudo modprobe -r tls`
1 parent a0250de commit 6d70273

File tree

4 files changed

+93
-11
lines changed

4 files changed

+93
-11
lines changed

cli/client.go

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import (
4242
"github.com/minio/pkg/v3/console"
4343
"github.com/minio/pkg/v3/ellipses"
4444
"github.com/minio/warp/pkg"
45+
ktls "gitlab.com/go-extension/tls"
4546
"golang.org/x/net/http2"
4647
)
4748

@@ -218,18 +219,48 @@ func clientTransport(ctx *cli.Context) http.RoundTripper {
218219
DisableCompression: true,
219220
DisableKeepAlives: ctx.Bool("disable-http-keepalive"),
220221
}
221-
if ctx.Bool("tls") {
222+
if ctx.Bool("tls") || ctx.Bool("ktls") {
222223
// Keep TLS config.
223-
tr.TLSClientConfig = &tls.Config{
224-
RootCAs: mustGetSystemCertPool(),
225-
// Can't use SSLv3 because of POODLE and BEAST
226-
// Can't use TLSv1.0 because of POODLE and BEAST using CBC cipher
227-
// Can't use TLSv1.1 because of RC4 cipher usage
228-
MinVersion: tls.VersionTLS12,
229-
InsecureSkipVerify: ctx.Bool("insecure"),
230-
ClientSessionCache: tls.NewLRUClientSessionCache(1024), // up to 1024 nodes
224+
if !ctx.Bool("ktls") {
225+
tr.TLSClientConfig = &tls.Config{
226+
RootCAs: mustGetSystemCertPool(),
227+
// Can't use SSLv3 because of POODLE and BEAST
228+
// Can't use TLSv1.0 because of POODLE and BEAST using CBC cipher
229+
// Can't use TLSv1.1 because of RC4 cipher usage
230+
MinVersion: tls.VersionTLS12,
231+
InsecureSkipVerify: ctx.Bool("insecure"),
232+
ClientSessionCache: tls.NewLRUClientSessionCache(1024), // up to 1024 nodes
233+
}
234+
} else {
235+
d := ktls.Dialer{
236+
NetDialer: &net.Dialer{
237+
Timeout: 10 * time.Second,
238+
KeepAlive: 10 * time.Second,
239+
},
240+
Config: &ktls.Config{
241+
KernelRX: true,
242+
KernelTX: true,
243+
// Prefer the cipher suites that are available in the kernel.
244+
PreferCipherSuites: true,
245+
// We don't care about the size.
246+
CertCompressionDisabled: true,
247+
// Should be ok for benchmarks.
248+
AllowEarlyData: true,
249+
// Can't use SSLv3 because of POODLE and BEAST
250+
// Can't use TLSv1.0 because of POODLE and BEAST using CBC cipher
251+
// Can't use TLSv1.1 because of RC4 cipher usage
252+
RootCAs: mustGetSystemCertPool(),
253+
MinVersion: tls.VersionTLS12,
254+
InsecureSkipVerify: ctx.Bool("insecure"),
255+
ClientSessionCache: ktls.NewLRUClientSessionCache(1024), // up to 1024 nodes
256+
},
257+
}
258+
if ctx.Bool("debug") {
259+
d.Config.KeyLogWriter = os.Stdout
260+
}
261+
tr.DialContext = nil
262+
tr.DialTLSContext = d.DialContext
231263
}
232-
233264
// Because we create a custom TLSClientConfig, we have to opt-in to HTTP/2.
234265
// See https://github.com/golang/go/issues/14275
235266
if ctx.Bool("http2") {
@@ -332,7 +363,7 @@ func newAdminClient(ctx *cli.Context) *madmin.AdminClient {
332363

333364
cl, err := madmin.NewWithOptions(hosts[0], &madmin.Options{
334365
Creds: credentials.NewStaticV4(ctx.String("access-key"), ctx.String("secret-key"), ""),
335-
Secure: ctx.Bool("tls"),
366+
Secure: ctx.Bool("tls") || ctx.Bool("ktls"),
336367
Transport: clientTransport(ctx),
337368
})
338369
fatalIf(probe.NewError(err), "Unable to create MinIO admin client")

cli/flags.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ var ioFlags = []cli.Flag{
176176
Usage: "Use TLS (HTTPS) for transport",
177177
EnvVar: appNameUC + "_TLS",
178178
},
179+
cli.BoolFlag{
180+
Name: "ktls",
181+
Usage: "Use Kernel TLS (HTTPS) for transport if available",
182+
EnvVar: appNameUC + "_KTLS",
183+
},
179184
cli.StringFlag{
180185
Name: "region",
181186
Usage: "Specify a custom region",

go.mod

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,19 @@ require (
2424
github.com/minio/websocket v1.6.0
2525
github.com/muesli/termenv v0.16.0
2626
github.com/posener/complete v1.2.3
27+
gitlab.com/go-extension/tls v0.0.0-20250213181811-2b06719ee5f1
2728
golang.org/x/net v0.41.0
2829
golang.org/x/sync v0.15.0
2930
golang.org/x/time v0.12.0
3031
gopkg.in/yaml.v3 v3.0.1
3132
)
3233

3334
require (
35+
github.com/RyuaNerin/go-krypto v1.3.0 // indirect
36+
github.com/andybalholm/brotli v1.1.1 // indirect
3437
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
3538
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
39+
github.com/blang/semver/v4 v4.0.0 // indirect
3640
github.com/cespare/xxhash/v2 v2.3.0 // indirect
3741
github.com/charmbracelet/colorprofile v0.3.1 // indirect
3842
github.com/charmbracelet/harmonica v0.2.0 // indirect
@@ -70,7 +74,9 @@ require (
7074
github.com/muesli/cancelreader v0.2.2 // indirect
7175
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
7276
github.com/oapi-codegen/runtime v1.1.1 // indirect
77+
github.com/pedroalbanese/camellia v0.0.0-20220911183557-30cc05c20118 // indirect
7378
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect
79+
github.com/pmorjan/kmod v1.1.1 // indirect
7480
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
7581
github.com/prometheus/client_model v0.6.2 // indirect
7682
github.com/prometheus/common v0.64.0 // indirect
@@ -89,6 +95,10 @@ require (
8995
github.com/tklauser/numcpus v0.10.0 // indirect
9096
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
9197
github.com/yusufpapurcu/wmi v1.2.4 // indirect
98+
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 // indirect
99+
gitlab.com/go-extension/hpke v0.0.0-20250212195157-716075a00b8a // indirect
100+
gitlab.com/go-extension/mlkem768 v0.0.0-20240814071630-937354a2177e // indirect
101+
gitlab.com/go-extension/rand v0.0.0-20240303103951-707937a049b5 // indirect
92102
golang.org/x/crypto v0.39.0 // indirect
93103
golang.org/x/sys v0.33.0 // indirect
94104
golang.org/x/text v0.26.0 // indirect

go.sum

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
22
github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
3+
github.com/RyuaNerin/go-krypto v1.3.0 h1:smavTzSMAx8iuVlGb4pEwl9MD2qicqMzuXR2QWp2/Pg=
4+
github.com/RyuaNerin/go-krypto v1.3.0/go.mod h1:9R9TU936laAIqAmjcHo/LsaXYOZlymudOAxjaBf62UM=
5+
github.com/RyuaNerin/testingutil v0.1.0 h1:IYT6JL57RV3U2ml3dLHZsVtPOP6yNK7WUVdzzlpNrss=
6+
github.com/RyuaNerin/testingutil v0.1.0/go.mod h1:yTqj6Ta/ycHMPJHRyO12Mz3VrvTloWOsy23WOZH19AA=
7+
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
8+
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
39
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
410
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
511
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
612
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
13+
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
14+
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
715
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
816
github.com/bygui86/multi-profile/v2 v2.1.0 h1:x/jPqeL/6hJqLXoDI/H5zLPsSFbDR6IEbrBbFpkWQdw=
917
github.com/bygui86/multi-profile/v2 v2.1.0/go.mod h1:f4qCZiQo1nnJdwbPoADUtdDXg3hhnpfgZ9iq3/kW4BA=
@@ -137,11 +145,15 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq
137145
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
138146
github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro=
139147
github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
148+
github.com/pedroalbanese/camellia v0.0.0-20220911183557-30cc05c20118 h1:GJQwwzoQDXGcYO35ViGcG/A994BGB35/7dNoVW4Je8s=
149+
github.com/pedroalbanese/camellia v0.0.0-20220911183557-30cc05c20118/go.mod h1:V3wL7j9ikGCLRV2DMTQZnUqZQnGcQGEqpvTLE0ZcGY8=
140150
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c h1:dAMKvw0MlJT1GshSTtih8C2gDs04w8dReiOGXrGLNoY=
141151
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM=
142152
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
143153
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
144154
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
155+
github.com/pmorjan/kmod v1.1.1 h1:Vfw6bMaOg/sYSBCqJPT9TbqHHf5zK00GbaL5JQLO4r0=
156+
github.com/pmorjan/kmod v1.1.1/go.mod h1:jR4fVosEpQ6b5U0rpxaqoShTDPvCjLIP8vEESZyvnqQ=
145157
github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
146158
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
147159
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
@@ -189,15 +201,30 @@ github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfj
189201
github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ=
190202
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
191203
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
204+
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
205+
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
192206
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
193207
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
208+
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 h1:UNrDfkQqiEYzdMlNsVvBYOAJWZjdktqFE9tQh5BT2+4=
209+
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7/go.mod h1:E+rxHvJG9H6PUdzq9NRG6csuLN3XUx98BfGOVWNYnXs=
210+
gitlab.com/go-extension/hpke v0.0.0-20250212195157-716075a00b8a h1:8Ot1x2DayfUfOrVcXZ/f0SLj81Y9dq/hsf57cNYy66A=
211+
gitlab.com/go-extension/hpke v0.0.0-20250212195157-716075a00b8a/go.mod h1:onq0LLalsHWfSaXZiC3fDBY2A2wWvywnHq8xJIo+bzw=
212+
gitlab.com/go-extension/mlkem768 v0.0.0-20240814071630-937354a2177e h1:D/TnZkP81CR2Md9YJR3X059iLhOU8a493pebdLtQ99Q=
213+
gitlab.com/go-extension/mlkem768 v0.0.0-20240814071630-937354a2177e/go.mod h1:SQhmb9r/Fb0M4mb//AlrwD0yrDHre+nF0QzZD6OZV4k=
214+
gitlab.com/go-extension/rand v0.0.0-20240303103951-707937a049b5 h1:xQA0rfVPqW3G6dnb4qtgBdxr9XLu9vzDfdqKfLqGFXA=
215+
gitlab.com/go-extension/rand v0.0.0-20240303103951-707937a049b5/go.mod h1:nRmjyZOSF6N/6yuRl7ui9wKb1DjMX9ELGzOwELwWVSU=
216+
gitlab.com/go-extension/tls v0.0.0-20250213181811-2b06719ee5f1 h1:Ll1Ol0GoRecpUVCXfO8fuzFSJDq0tdluO87PvswlfNU=
217+
gitlab.com/go-extension/tls v0.0.0-20250213181811-2b06719ee5f1/go.mod h1:1HvcOpo44mnnq9T1kcrFBkclj+/7K8CgXXO3AY/X+Dg=
194218
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
195219
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
220+
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
196221
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
197222
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
198223
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA=
199224
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
200225
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
226+
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
227+
golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
201228
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
202229
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
203230
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -210,17 +237,26 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
210237
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
211238
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
212239
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
240+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
213241
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
242+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
243+
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
214244
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
245+
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
215246
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
216247
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
217248
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
218249
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
250+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
251+
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
219252
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
253+
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
254+
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
220255
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
221256
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
222257
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
223258
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
259+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
224260
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
225261
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
226262
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

0 commit comments

Comments
 (0)