Skip to content

Commit be3b29f

Browse files
committed
torchwood: add NewCosignatureVerifierFromKey
1 parent 5ec869b commit be3b29f

1 file changed

Lines changed: 42 additions & 13 deletions

File tree

cosignature.go

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -204,23 +204,55 @@ func NewCosignatureVerifier(vkey string) (*CosignatureVerifier, error) {
204204
hash16, key64, _ := strings.Cut(vkey, "+")
205205
hash, err1 := strconv.ParseUint(hash16, 16, 32)
206206
key, err2 := base64.StdEncoding.DecodeString(key64)
207-
if len(hash16) != 8 || err1 != nil || err2 != nil || !isValidName(name) || len(key) == 0 {
207+
if len(hash16) != 8 || err1 != nil || err2 != nil || len(key) == 0 {
208208
return nil, errors.New("malformed verifier id")
209209
}
210-
if uint32(hash) != keyHash(name, key) {
211-
return nil, errors.New("invalid verifier hash")
212-
}
213210
alg, key := key[0], key[1:]
211+
var verifier *CosignatureVerifier
214212
switch alg {
215213
case algCosignatureEd25519:
216214
if len(key) != ed25519.PublicKeySize {
217215
return nil, errors.New("malformed verifier public key")
218216
}
219217
k := ed25519.PublicKey(key)
218+
v, err := NewCosignatureVerifierFromKey(name, k)
219+
if err != nil {
220+
return nil, err
221+
}
222+
verifier = v
223+
case algCosignatureMLDSA:
224+
k, err := mldsa.NewPublicKey(mldsa.MLDSA44(), key)
225+
if err != nil {
226+
return nil, fmt.Errorf("malformed verifier public key: %w", err)
227+
}
228+
v, err := NewCosignatureVerifierFromKey(name, k)
229+
if err != nil {
230+
return nil, err
231+
}
232+
verifier = v
233+
default:
234+
return nil, errors.New("unknown verifier algorithm")
235+
}
236+
if uint32(hash) != verifier.KeyHash() {
237+
return nil, errors.New("invalid verifier hash")
238+
}
239+
return verifier, nil
240+
}
241+
242+
// NewCosignatureVerifierFromKey constructs a new [CosignatureVerifier] from a
243+
// public key. It supports [ed25519.PublicKey] and [*mldsa.PublicKey].
244+
func NewCosignatureVerifierFromKey(name string, key crypto.PublicKey) (*CosignatureVerifier, error) {
245+
if !isValidName(name) {
246+
return nil, errors.New("invalid name")
247+
}
248+
249+
switch k := key.(type) {
250+
case ed25519.PublicKey:
251+
hash := keyHash(name, append([]byte{algCosignatureEd25519}, k...))
220252
return &CosignatureVerifier{
221253
verifier: verifier{
222254
name: name,
223-
hash: uint32(hash),
255+
hash: hash,
224256
verify: func(msg, sig []byte) bool {
225257
if len(sig) != 8+ed25519.SignatureSize {
226258
return false
@@ -237,17 +269,14 @@ func NewCosignatureVerifier(vkey string) (*CosignatureVerifier, error) {
237269
return ed25519.Verify(k, m, sig)
238270
},
239271
},
240-
key: ed25519.PublicKey(key),
272+
key: k,
241273
}, nil
242-
case algCosignatureMLDSA:
243-
k, err := mldsa.NewPublicKey(mldsa.MLDSA44(), key)
244-
if err != nil {
245-
return nil, fmt.Errorf("malformed verifier public key: %w", err)
246-
}
274+
case *mldsa.PublicKey:
275+
hash := keyHash(name, append([]byte{algCosignatureMLDSA}, k.Bytes()...))
247276
return &CosignatureVerifier{
248277
verifier: verifier{
249278
name: name,
250-
hash: uint32(hash),
279+
hash: hash,
251280
verify: func(msg, sig []byte) bool {
252281
if len(sig) != 8+mldsa.MLDSA44SignatureSize {
253282
return false
@@ -267,7 +296,7 @@ func NewCosignatureVerifier(vkey string) (*CosignatureVerifier, error) {
267296
key: k,
268297
}, nil
269298
default:
270-
return nil, errors.New("unknown verifier algorithm")
299+
return nil, errors.New("key type is not supported")
271300
}
272301
}
273302

0 commit comments

Comments
 (0)