1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
package sign
import (
"encoding/json"
"github.com/secure-systems-lab/go-securesystemslib/cjson"
"github.com/theupdateframework/go-tuf/data"
"github.com/theupdateframework/go-tuf/pkg/keys"
)
func Sign(s *data.Signed, k keys.Signer) error {
ids := k.PublicData().IDs()
signatures := make([]data.Signature, 0, len(s.Signatures)+1)
for _, sig := range s.Signatures {
found := false
for _, id := range ids {
if sig.KeyID == id {
found = true
break
}
}
if !found {
signatures = append(signatures, sig)
}
}
canonical, err := cjson.EncodeCanonical(s.Signed)
if err != nil {
return err
}
sig, err := k.SignMessage(canonical)
if err != nil {
return err
}
s.Signatures = signatures
for _, id := range ids {
s.Signatures = append(s.Signatures, data.Signature{
KeyID: id,
Signature: sig,
})
}
return nil
}
func Marshal(v interface{}, keys ...keys.Signer) (*data.Signed, error) {
b, err := json.Marshal(v)
if err != nil {
return nil, err
}
s := &data.Signed{Signed: b}
for _, k := range keys {
if err := Sign(s, k); err != nil {
return nil, err
}
}
return s, nil
}
|