Skip to content

Commit 0482f4b

Browse files
Identity-based encryption features to support timelock encryption (#28)
migrated from the `timelock` branch where work was done previously, but stripped out the aggregation code and added a few tests Co-authored-by: nikkolasg <[email protected]>
1 parent a60ddc0 commit 0482f4b

File tree

5 files changed

+320
-28
lines changed

5 files changed

+320
-28
lines changed

encrypt/ibe/ibe.go

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
package ibe
2+
3+
import (
4+
"crypto/rand"
5+
"errors"
6+
"fmt"
7+
8+
"golang.org/x/crypto/blake2s"
9+
10+
"github.com/drand/kyber"
11+
"github.com/drand/kyber/pairing"
12+
"github.com/drand/kyber/util/random"
13+
)
14+
15+
type Ciphertext struct {
16+
// Random point rP
17+
U kyber.Point
18+
// Sigma attached to ID: sigma XOR H(rG_id)
19+
V []byte
20+
// ciphertext of the message M XOR H(sigma)
21+
W []byte
22+
}
23+
24+
// H2Tag is the domain separation tag for the H2 hash function
25+
func H2Tag() []byte {
26+
return []byte("IBE-H2")
27+
}
28+
29+
// H3Tag is the domain separation tag for the H3 hash function
30+
func H3Tag() []byte {
31+
return []byte("IBE-H3")
32+
}
33+
34+
// H4Tag is the domain separation tag for the H4 hash function
35+
func H4Tag() []byte {
36+
return []byte("IBE-H4")
37+
}
38+
39+
// Encrypt implements the cca identity based encryption scheme from
40+
// https://crypto.stanford.edu/~dabo/pubs/papers/bfibe.pdf for more information
41+
// about the scheme.
42+
// - master is the master key on G1
43+
// - ID is the ID towards which we encrypt the message
44+
// - msg is the actual message
45+
// - seed is the random seed to generate the random element (sigma) of the encryption
46+
// The suite must produce points which implements the `HashablePoint` interface.
47+
func Encrypt(s pairing.Suite, master kyber.Point, ID, msg []byte) (*Ciphertext, error) {
48+
if len(msg)>>16 > 0 {
49+
// we're using blake2 as XOF which only outputs 2^16-1 length
50+
return nil, errors.New("plaintext too long for blake2")
51+
}
52+
// 1. Compute Gid = e(master,Q_id)
53+
hG2, ok := s.G2().Point().(kyber.HashablePoint)
54+
if !ok {
55+
return nil, errors.New("point needs to implement `kyber.HashablePoint`")
56+
}
57+
Qid := hG2.Hash(ID)
58+
Gid := s.Pair(master, Qid)
59+
60+
// 2. Derive random sigma
61+
sigma := make([]byte, len(msg))
62+
if _, err := rand.Read(sigma); err != nil {
63+
return nil, fmt.Errorf("err reading rand sigma: %v", err)
64+
}
65+
// 3. Derive r from sigma and msg
66+
r, err := h3(s, sigma, msg)
67+
if err != nil {
68+
return nil, err
69+
}
70+
// 4. Compute U = rP
71+
U := s.G1().Point().Mul(r, s.G1().Point().Base())
72+
73+
// 5. Compute V = sigma XOR H2(rGid)
74+
rGid := Gid.Mul(r, Gid) // even in Gt, it's additive notation
75+
hrGid, err := gtToHash(rGid, len(msg), H2Tag())
76+
if err != nil {
77+
return nil, err
78+
}
79+
V := xor(sigma, hrGid)
80+
81+
// 6. Compute M XOR H(sigma)
82+
hsigma, err := h4(sigma, len(msg))
83+
if err != nil {
84+
return nil, err
85+
}
86+
W := xor(msg, hsigma)
87+
88+
return &Ciphertext{
89+
U: U,
90+
V: V,
91+
W: W,
92+
}, nil
93+
}
94+
95+
func Decrypt(s pairing.Suite, private kyber.Point, c *Ciphertext) ([]byte, error) {
96+
// 1. Compute sigma = V XOR H2(e(rP,private))
97+
gidt := s.Pair(c.U, private)
98+
hgidt, err := gtToHash(gidt, len(c.W), H2Tag())
99+
if err != nil {
100+
return nil, err
101+
}
102+
if len(hgidt) != len(c.V) {
103+
return nil, fmt.Errorf("XorSigma is of invalid length: exp %d vs got %d", len(hgidt), len(c.V))
104+
}
105+
sigma := xor(hgidt, c.V)
106+
107+
// 2. Compute M = W XOR H4(sigma)
108+
hsigma, err := h4(sigma, len(c.W))
109+
if err != nil {
110+
return nil, err
111+
}
112+
113+
msg := xor(hsigma, c.W)
114+
115+
// 3. Check U = rP
116+
r, err := h3(s, sigma, msg)
117+
if err != nil {
118+
return nil, err
119+
}
120+
rP := s.G1().Point().Mul(r, s.G1().Point().Base())
121+
if !rP.Equal(c.U) {
122+
return nil, fmt.Errorf("invalid proof: rP check failed")
123+
}
124+
return msg, nil
125+
126+
}
127+
128+
const maxSize = 1 << 10
129+
130+
// hash sigma and msg to get r
131+
func h3(s pairing.Suite, sigma, msg []byte) (kyber.Scalar, error) {
132+
h3, err := blake2s.NewXOF(maxSize, nil)
133+
if err != nil {
134+
panic(err)
135+
}
136+
if _, err := h3.Write(H3Tag()); err != nil {
137+
return nil, fmt.Errorf("err hashing h3 tag: %v", err)
138+
}
139+
if _, err := h3.Write(sigma); err != nil {
140+
return nil, fmt.Errorf("err hashing sigma to XOF: %v", err)
141+
}
142+
_, _ = h3.Write(msg)
143+
return s.G1().Scalar().Pick(random.New(h3)), nil
144+
}
145+
146+
func h4(sigma []byte, length int) ([]byte, error) {
147+
h4, err := blake2s.NewXOF(maxSize, nil)
148+
if err != nil {
149+
panic(err)
150+
}
151+
if _, err := h4.Write(H4Tag()); err != nil {
152+
return nil, fmt.Errorf("err writing h4tag: %v", err)
153+
}
154+
if _, err := h4.Write(sigma); err != nil {
155+
return nil, fmt.Errorf("err writing sigma to h4: %v", err)
156+
}
157+
h4sigma := make([]byte, length)
158+
if _, err := h4.Read(h4sigma); err != nil {
159+
return nil, fmt.Errorf("err reading from h4: %v", err)
160+
}
161+
return h4sigma, nil
162+
}
163+
164+
func gtToHash(gt kyber.Point, length int, dst []byte) ([]byte, error) {
165+
xof, err := blake2s.NewXOF(maxSize, nil)
166+
if err != nil {
167+
return nil, err
168+
}
169+
if _, err := xof.Write(dst); err != nil {
170+
return nil, errors.New("err writing dst to gtHash")
171+
}
172+
gt.MarshalTo(xof)
173+
var b = make([]byte, length)
174+
if _, err := xof.Read(b); err != nil {
175+
return nil, errors.New("couldn't read from xof")
176+
}
177+
return b[:], nil
178+
}
179+
180+
func xor(a, b []byte) []byte {
181+
if len(a) != len(b) {
182+
panic("wrong xor input")
183+
}
184+
res := make([]byte, len(a))
185+
for i := 0; i < len(a); i++ {
186+
res[i] = a[i] ^ b[i]
187+
}
188+
return res
189+
}

encrypt/ibe/ibe_test.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package ibe
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
"github.com/drand/kyber"
8+
bls "github.com/drand/kyber-bls12381"
9+
"github.com/drand/kyber/pairing"
10+
"github.com/drand/kyber/util/random"
11+
"github.com/stretchr/testify/require"
12+
)
13+
14+
func newSetting() (pairing.Suite, kyber.Point, []byte, kyber.Point) {
15+
suite := bls.NewBLS12381Suite()
16+
P := suite.G1().Point().Base()
17+
s := suite.G1().Scalar().Pick(random.New())
18+
Ppub := suite.G1().Point().Mul(s, P)
19+
20+
ID := []byte("passtherand")
21+
IDP := suite.G2().Point().(kyber.HashablePoint)
22+
Qid := IDP.Hash(ID) // public key
23+
sQid := Qid.Mul(s, Qid) // secret key
24+
return suite, Ppub, ID, sQid
25+
}
26+
27+
func TestValidTimelockEncryptionDecryptsCorrectly(t *testing.T) {
28+
suite, Ppub, ID, sQid := newSetting()
29+
msg := []byte("Hello World\n")
30+
31+
c, err := Encrypt(suite, Ppub, ID, msg)
32+
require.NoError(t, err)
33+
msg2, err := Decrypt(suite, sQid, c)
34+
require.NoError(t, err)
35+
require.Equal(t, msg, msg2)
36+
}
37+
38+
func TestInvalidSigmaFailsDecryption(t *testing.T) {
39+
suite, Ppub, ID, sQid := newSetting()
40+
msg := []byte("Hello World\n")
41+
42+
c, err := Encrypt(suite, Ppub, ID, msg)
43+
require.NoError(t, err)
44+
45+
c.V = []byte("somenonsense")
46+
47+
_, err = Decrypt(suite, sQid, c)
48+
require.Error(t, err)
49+
require.ErrorContains(t, err, "invalid proof")
50+
}
51+
52+
func TestInvalidMessageFailsDecryption(t *testing.T) {
53+
suite, Ppub, ID, sQid := newSetting()
54+
msg := []byte("Hello World\n")
55+
56+
c, err := Encrypt(suite, Ppub, ID, msg)
57+
require.NoError(t, err)
58+
59+
c.W = []byte("somenonsense")
60+
_, err = Decrypt(suite, sQid, c)
61+
require.Error(t, err)
62+
require.ErrorContains(t, err, "invalid proof")
63+
}
64+
65+
func TestVeryLongInputFailsEncryption(t *testing.T) {
66+
suite, Ppub, ID, _ := newSetting()
67+
msg := []byte(strings.Repeat("And you have to understand this, that a prince, especially a new one, cannot observe all those things for which men are esteemed", 1000))
68+
_, err := Encrypt(suite, Ppub, ID, msg)
69+
require.Error(t, err)
70+
}
71+
72+
func TestVeryLongCipherFailsDecryptionBecauseOfLength(t *testing.T) {
73+
suite, Ppub, ID, sQid := newSetting()
74+
msg := []byte("hello world")
75+
c, err := Encrypt(suite, Ppub, ID, msg)
76+
require.NoError(t, err)
77+
78+
c.W = []byte(strings.Repeat("And you have to understand this, that a prince, especially a new one, cannot observe all those things for which men are esteemed", 1000))
79+
_, err = Decrypt(suite, sQid, c)
80+
81+
require.Error(t, err)
82+
require.ErrorContains(t, err, "XorSigma is of invalid length")
83+
}

go.mod

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
module github.com/drand/kyber
22

3-
go 1.13
3+
go 1.17
44

55
require (
6-
github.com/drand/kyber-bls12381 v0.2.1
7-
github.com/jonboulle/clockwork v0.1.0
8-
github.com/stretchr/testify v1.4.0
6+
github.com/drand/kyber-bls12381 v0.2.2
7+
github.com/jonboulle/clockwork v0.3.0
8+
github.com/stretchr/testify v1.7.2
99
go.dedis.ch/fixbuf v1.0.3
1010
go.dedis.ch/protobuf v1.0.11
11-
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
12-
golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c
11+
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e
12+
golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c
13+
)
14+
15+
require (
16+
github.com/davecgh/go-spew v1.1.1 // indirect
17+
github.com/kilic/bls12-381 v0.1.0 // indirect
18+
github.com/kr/pretty v0.2.0 // indirect
19+
github.com/pmezard/go-difflib v1.0.0 // indirect
20+
gopkg.in/yaml.v3 v3.0.1 // indirect
1321
)

go.sum

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,36 @@
1-
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
21
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
32
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
43
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5-
github.com/drand/bls12-381 v0.3.2 h1:RImU8Wckmx8XQx1tp1q04OV73J9Tj6mmpQLYDP7V1XE=
64
github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y=
75
github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw=
86
github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw=
97
github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U=
10-
github.com/drand/kyber-bls12381 v0.2.0 h1:3GJfiHaMggQS2l2n7yrfX0PjY9BYikLM2f0zKP1eZTs=
8+
github.com/drand/kyber v1.1.10/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo=
119
github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI=
12-
github.com/drand/kyber-bls12381 v0.2.1 h1:/d5/YAdaCmHpYjF1NZevOEcKGaq6LBbyvkCTIdGqDjs=
1310
github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE=
14-
github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
11+
github.com/drand/kyber-bls12381 v0.2.2 h1:MsqhbRUNIziZVGg5nT/AgZFXjKSc4Vd8jkBC0Y0sq4c=
12+
github.com/drand/kyber-bls12381 v0.2.2/go.mod h1:FsudUZf6Xu61u/gYrDHEHf6lKIKluJdnX7WJe4hkMh4=
1513
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
16-
github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f h1:qET3Wx0v8tMtoTOQnsJXVvqvCopSf48qobR6tcJuDHo=
14+
github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
15+
github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
1716
github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s=
18-
github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5 h1:RAGCvOaqSiey3BGHopL/JI6+baO7D7AYQVDb6I8pRTs=
1917
github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s=
20-
github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 h1:51kHw7l/dUDdOdW06AlUGT5jnpj6nqQSILebcsikSjA=
2118
github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s=
22-
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
19+
github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4=
20+
github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig=
2321
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
22+
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
23+
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
2424
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
2525
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
2626
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
2727
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
2828
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
2929
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
3030
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
31-
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
3231
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
32+
github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
33+
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
3334
go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs=
3435
go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw=
3536
go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ=
@@ -42,33 +43,37 @@ go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYr
4243
golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
4344
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
4445
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
45-
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d h1:9FCpayM9Egr1baVnV1SX0H87m+XB0B8S0hAMi99X/3U=
4646
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
47-
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
4847
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
49-
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
5048
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
51-
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
5249
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
50+
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM=
51+
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
5352
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
53+
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
5454
golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5555
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5656
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5757
golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
58-
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk=
5958
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
60-
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y=
6159
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
62-
golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d h1:QQrM/CCYEzTs91GZylDCQjGHudbPTxF/1fvXdVh5lMo=
6360
golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
64-
golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c h1:38q6VNPWR010vN82/SB121GujZNIfAUb4YttE2rhGuc=
6561
golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
62+
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
63+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
64+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
65+
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
66+
golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI4N6/rdy1iusx77G3oU=
67+
golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
68+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
6669
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
67-
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
70+
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
71+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6872
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
6973
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
7074
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
71-
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
7275
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
73-
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
7476
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
77+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
78+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
79+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)