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

102 lines
2.5 KiB
Go

package go_pgp
import (
"bytes"
"io"
"os"
// required in order to use the crypto.SHA256- and -SHA512-Hashes
_ "crypto/sha256"
_ "crypto/sha512"
"github.com/ProtonMail/go-crypto/openpgp"
"github.com/ProtonMail/go-crypto/openpgp/armor"
)
func writeKeyDataToFile(data []byte, filePath, dataType string, armored bool) error {
out, err := os.Create(filePath)
if nil != err {
return err
}
defer out.Close()
if !armored {
_, err = out.Write(data)
if nil == err {
out.Sync()
}
} else {
var armored io.WriteCloser
armored, err = armor.Encode(out, dataType, nil)
if nil != err {
return err
}
_, err = armored.Write(data)
if nil == err {
armored.Close()
out.Sync()
}
}
return err
}
// WritePublicEntityData will write the entitys complete public data to a file
func WritePublicEntityData(entity *Entity, filePath string) error {
data, err := ExtractPublicEntityData(entity)
if nil != err {
return err
}
return writeKeyDataToFile(data, filePath, openpgp.PublicKeyType, false)
}
// WriteArmoredPublicEntityData will write the entitys complete public data to an armored file
func WriteArmoredPublicEntityData(entity *Entity, filePath string) error {
data, err := ExtractPublicEntityData(entity)
if nil != err {
return err
}
return writeKeyDataToFile(data, filePath, openpgp.PublicKeyType, true)
}
// WritePrivateEntityData will write the entitys public and private keys to a file
func WritePrivateEntityData(entity *Entity, filePath string) error {
data, err := ExtractPrivateEntityData(entity)
if nil != err {
return err
}
return writeKeyDataToFile(data, filePath, openpgp.PrivateKeyType, false)
}
// WriteArmoredPrivateEntityData will write the entitys public and private keys to an armored file
func WriteArmoredPrivateEntityData(entity *Entity, filePath string) error {
data, err := ExtractPrivateEntityData(entity)
if nil != err {
return err
}
return writeKeyDataToFile(data, filePath, openpgp.PrivateKeyType, true)
}
// ExtractPublicEntityData will write the entitys complete public data to a []byte
func ExtractPublicEntityData(entity *Entity) ([]byte, error) {
if nil == entity {
return nil, ErrUndefinedPGPEntity
}
out := new(bytes.Buffer)
entity.Serialize(out)
return out.Bytes(), nil
}
// ExtractPrivateEntityData will write the entitys public and private keys to a []byte
func ExtractPrivateEntityData(entity *Entity) ([]byte, error) {
if nil == entity {
return nil, ErrUndefinedPGPEntity
}
out := new(bytes.Buffer)
entity.SerializePrivate(out, &defaultConfig)
return out.Bytes(), nil
}