OLD | NEW |
1 // Copyright 2016 The LUCI Authors. All rights reserved. | 1 // Copyright 2016 The LUCI Authors. All rights reserved. |
2 // Use of this source code is governed under the Apache License, Version 2.0 | 2 // Use of this source code is governed under the Apache License, Version 2.0 |
3 // that can be found in the LICENSE file. | 3 // that can be found in the LICENSE file. |
4 | 4 |
5 package delegation | 5 package delegation |
6 | 6 |
7 import ( | 7 import ( |
8 "encoding/base64" | 8 "encoding/base64" |
9 "os" | 9 "os" |
10 "strings" | 10 "strings" |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 _, err := CheckToken(c, CheckTokenParams{ | 97 _, err := CheckToken(c, CheckTokenParams{ |
98 Token: strings.Repeat("aaaa", 10000), | 98 Token: strings.Repeat("aaaa", 10000), |
99 PeerID: "user:to@example.com", | 99 PeerID: "user:to@example.com", |
100 CertificatesProvider: minter, | 100 CertificatesProvider: minter, |
101 GroupsChecker: &fakeGroups{}, | 101 GroupsChecker: &fakeGroups{}, |
102 OwnServiceIdentity: "service:service-id", | 102 OwnServiceIdentity: "service:service-id", |
103 }) | 103 }) |
104 So(err, ShouldEqual, ErrMalformedDelegationToken) | 104 So(err, ShouldEqual, ErrMalformedDelegationToken) |
105 }) | 105 }) |
106 | 106 |
| 107 Convey("Untrusted signer", t, func() { |
| 108 tok := minter.mintToken(c, subtoken(c, "user:from@example.com",
"user:to@example.com")) |
| 109 minter.signerID = "service:nah-i-renamed-myself" |
| 110 _, err := CheckToken(c, CheckTokenParams{ |
| 111 Token: tok, |
| 112 PeerID: "user:to@example.com", |
| 113 CertificatesProvider: minter, |
| 114 GroupsChecker: &fakeGroups{}, |
| 115 OwnServiceIdentity: "service:service-id", |
| 116 }) |
| 117 So(err, ShouldEqual, ErrUnsignedDelegationToken) |
| 118 }) |
| 119 |
107 Convey("Bad signature", t, func() { | 120 Convey("Bad signature", t, func() { |
108 tok := minter.mintToken(c, subtoken(c, "user:from@example.com",
"user:to@example.com")) | 121 tok := minter.mintToken(c, subtoken(c, "user:from@example.com",
"user:to@example.com")) |
109 // An offset in serialized token that points to Subtoken field.
Replace one | 122 // An offset in serialized token that points to Subtoken field.
Replace one |
110 // byte there to "break" the signature. | 123 // byte there to "break" the signature. |
111 sigOffset := len(tok) - 10 | 124 sigOffset := len(tok) - 10 |
112 So(tok[sigOffset], ShouldNotEqual, 'A') | 125 So(tok[sigOffset], ShouldNotEqual, 'A') |
113 _, err := CheckToken(c, CheckTokenParams{ | 126 _, err := CheckToken(c, CheckTokenParams{ |
114 Token: tok[:sigOffset] + "A" + tok[sigOff
set+1:], | 127 Token: tok[:sigOffset] + "A" + tok[sigOff
set+1:], |
115 PeerID: "user:to@example.com", | 128 PeerID: "user:to@example.com", |
116 CertificatesProvider: minter, | 129 CertificatesProvider: minter, |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 signerID string | 194 signerID string |
182 } | 195 } |
183 | 196 |
184 func newFakeTokenMinter() *fakeTokenMinter { | 197 func newFakeTokenMinter() *fakeTokenMinter { |
185 return &fakeTokenMinter{ | 198 return &fakeTokenMinter{ |
186 signer: signingtest.NewSigner(0, nil), | 199 signer: signingtest.NewSigner(0, nil), |
187 signerID: "service:fake-signer", | 200 signerID: "service:fake-signer", |
188 } | 201 } |
189 } | 202 } |
190 | 203 |
191 func (f *fakeTokenMinter) GetAuthServiceCertificates(c context.Context) (*signin
g.PublicCertificates, error) { | 204 func (f *fakeTokenMinter) GetCertificates(c context.Context, id identity.Identit
y) (*signing.PublicCertificates, error) { |
| 205 » if string(id) != f.signerID { |
| 206 » » return nil, nil |
| 207 » } |
192 return f.signer.Certificates(c) | 208 return f.signer.Certificates(c) |
193 } | 209 } |
194 | 210 |
195 func (f *fakeTokenMinter) mintToken(c context.Context, subtoken *messages.Subtok
en) string { | 211 func (f *fakeTokenMinter) mintToken(c context.Context, subtoken *messages.Subtok
en) string { |
196 blob, err := proto.Marshal(subtoken) | 212 blob, err := proto.Marshal(subtoken) |
197 if err != nil { | 213 if err != nil { |
198 panic(err) | 214 panic(err) |
199 } | 215 } |
200 keyID, sig, err := f.signer.SignBytes(c, blob) | 216 keyID, sig, err := f.signer.SignBytes(c, blob) |
201 if err != nil { | 217 if err != nil { |
(...skipping 15 matching lines...) Expand all Loading... |
217 type fakeGroups struct { | 233 type fakeGroups struct { |
218 groups map[string]string // if nil == no group checks | 234 groups map[string]string // if nil == no group checks |
219 } | 235 } |
220 | 236 |
221 func (f *fakeGroups) IsMember(c context.Context, id identity.Identity, group str
ing) (bool, error) { | 237 func (f *fakeGroups) IsMember(c context.Context, id identity.Identity, group str
ing) (bool, error) { |
222 if f.groups == nil { | 238 if f.groups == nil { |
223 return true, nil | 239 return true, nil |
224 } | 240 } |
225 return f.groups[group] == string(id), nil | 241 return f.groups[group] == string(id), nil |
226 } | 242 } |
OLD | NEW |