2026-03-30 00:54:20 +00:00
|
|
|
// SPDX-License-Identifier: EUPL-1.2
|
2026-03-29 23:59:48 +00:00
|
|
|
|
2026-03-06 13:20:12 +00:00
|
|
|
package manifest
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"crypto/ed25519"
|
|
|
|
|
"encoding/base64"
|
|
|
|
|
|
2026-03-21 23:54:23 +00:00
|
|
|
coreerr "dappco.re/go/core/log"
|
2026-03-06 13:20:12 +00:00
|
|
|
"gopkg.in/yaml.v3"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// signable returns the canonical bytes to sign (manifest without sign field).
|
|
|
|
|
func signable(m *Manifest) ([]byte, error) {
|
|
|
|
|
tmp := *m
|
|
|
|
|
tmp.Sign = ""
|
|
|
|
|
return yaml.Marshal(&tmp)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Sign computes the ed25519 signature and stores it in m.Sign (base64).
|
|
|
|
|
func Sign(m *Manifest, priv ed25519.PrivateKey) error {
|
|
|
|
|
msg, err := signable(m)
|
|
|
|
|
if err != nil {
|
2026-03-16 20:37:25 +00:00
|
|
|
return coreerr.E("manifest.Sign", "marshal failed", err)
|
2026-03-06 13:20:12 +00:00
|
|
|
}
|
|
|
|
|
sig := ed25519.Sign(priv, msg)
|
|
|
|
|
m.Sign = base64.StdEncoding.EncodeToString(sig)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Verify checks the ed25519 signature in m.Sign against the public key.
|
|
|
|
|
func Verify(m *Manifest, pub ed25519.PublicKey) (bool, error) {
|
|
|
|
|
if m.Sign == "" {
|
2026-03-16 20:37:25 +00:00
|
|
|
return false, coreerr.E("manifest.Verify", "no signature present", nil)
|
2026-03-06 13:20:12 +00:00
|
|
|
}
|
|
|
|
|
sig, err := base64.StdEncoding.DecodeString(m.Sign)
|
|
|
|
|
if err != nil {
|
2026-03-16 20:37:25 +00:00
|
|
|
return false, coreerr.E("manifest.Verify", "decode failed", err)
|
2026-03-06 13:20:12 +00:00
|
|
|
}
|
|
|
|
|
msg, err := signable(m)
|
|
|
|
|
if err != nil {
|
2026-03-16 20:37:25 +00:00
|
|
|
return false, coreerr.E("manifest.Verify", "marshal failed", err)
|
2026-03-06 13:20:12 +00:00
|
|
|
}
|
|
|
|
|
return ed25519.Verify(pub, msg, sig), nil
|
|
|
|
|
}
|