@@ -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