// Copyright 2024 Matthew Rich . All rights reserved. package signature import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" _ "crypto/x509" _ "encoding/pem" _ "fmt" _ "os" "errors" ) var ErrInvalidSignature error = errors.New("Invalid signature") type Ident struct { authorized []string publicKey *rsa.PublicKey privateKey *rsa.PrivateKey } func NewIdent() *Ident { i := &Ident{} i.authorized = []string{ "*" } if e := i.Generate(); e != nil { return nil } return i } func (i *Ident) Generate() error { var err error i.privateKey, err = rsa.GenerateKey(rand.Reader, 2048) i.publicKey = &i.privateKey.PublicKey return err } func (i *Ident) Sign(data []byte) ([]byte, error) { checksum := sha256.Sum256(data) sig, e := rsa.SignPKCS1v15(rand.Reader, i.privateKey, crypto.SHA256, checksum[:]) if e != nil { return nil, e } return sig, e } func (i *Ident) Verify(data []byte, signature []byte) error { checksum := sha256.Sum256(data) return rsa.VerifyPKCS1v15(i.publicKey, crypto.SHA256, checksum[:], signature) } func (i *Ident) VerifySum(checksum []byte, signature []byte) error { return rsa.VerifyPKCS1v15(i.publicKey, crypto.SHA256, checksum[:], signature) }