go_pgp/Signatures.go
2024-05-10 22:24:14 +02:00

105 lines
2.1 KiB
Go

package go_pgp
import (
"bytes"
"errors"
"io"
"github.com/ProtonMail/go-crypto/openpgp"
"github.com/ProtonMail/go-crypto/openpgp/armor"
)
func CreateSignature(data []byte, signer *Entity) ([]byte, error) {
if signer == nil {
return nil, errors.New("signer undefined")
}
var result []byte
var err error
buf := bytes.NewBuffer([]byte{})
err = openpgp.ArmoredDetachSign(buf, &signer.Entity, bytes.NewBuffer(data), signer.cfg)
if err == nil {
result = buf.Bytes()
}
return result, err
}
func CreateTextSignature(text string, signer *Entity) ([]byte, error) {
if signer == nil {
return nil, errors.New("signer undefined")
}
var result []byte
var err error
buf := bytes.NewBuffer([]byte{})
err = openpgp.DetachSignText(buf, &signer.Entity, bytes.NewBufferString(text), signer.cfg)
if err == nil {
result = buf.Bytes()
}
return result, err
}
func CreateArmoredSignature(data []byte, signer *Entity) (string, error) {
if signer == nil {
return "", errors.New("signer undefined")
}
result := ""
var err error
buf := bytes.NewBufferString("")
err = openpgp.ArmoredDetachSign(buf, &signer.Entity, bytes.NewBuffer(data), signer.cfg)
if err == nil {
result = buf.String()
}
return result, err
}
func CreateArmoredTextSignature(text string, signer *Entity) (string, error) {
if signer == nil {
return "", errors.New("signer undefined")
}
result := ""
var err error
buf := bytes.NewBufferString("")
err = openpgp.ArmoredDetachSignText(buf, &signer.Entity, bytes.NewBufferString(text), signer.cfg)
if err == nil {
result = buf.String()
}
return result, err
}
func CheckSignature(keyring EntityList, signed, signature []byte) (*Entity, error) {
var _signed io.Reader
var _signature io.Reader
// Default readers
_signed = bytes.NewBuffer(signed)
_signature = bytes.NewBuffer(signature)
// Unarmor signature if possible
if unarmored, err := armor.Decode(_signature); err == nil {
_signature = unarmored.Body
}
// Check signature
signer, err := openpgp.CheckDetachedSignature(keyring, _signed, _signature, nil)
if signer != nil {
return &Entity{*signer, nil}, err
}
return nil, err
}