dumb-jose/internal/publickey/eddsa.go

48 lines
877 B
Go

package publickey
import (
"bytes"
"encoding/base64"
"encoding/json"
"fmt"
"golang.org/x/crypto/ed25519"
)
type EdDSAPublicKeyHeader struct {
Curve string `json:"crv"`
X string `json:"x"`
}
func ParseEdDSAPublicKey(data json.RawMessage) (*ed25519.PublicKey, error) {
var header EdDSAPublicKeyHeader
r := bytes.NewReader(data)
dec := json.NewDecoder(r)
err := dec.Decode(&header)
if err != nil {
return nil, err
}
if header.Curve != "Ed25519" {
return nil, fmt.Errorf("Invalid/Unsupported curve type %s", header.Curve)
}
if header.X == "" {
return nil, fmt.Errorf("Non-existent curve point")
}
rawKey, err := base64.RawURLEncoding.DecodeString(header.X)
if err != nil {
return nil, err
}
if len(rawKey) != ed25519.PublicKeySize {
return nil, fmt.Errorf("Invalid public key")
}
key := ed25519.PublicKey(rawKey)
return &key, nil
}