Add parsing and serializing interfaces for keyrings (#275)

* Add parsing and serializing interfaces for keyrings

* Make error check more compact
This commit is contained in:
Aron Wussler 2024-04-08 11:38:52 +02:00 committed by GitHub
parent 453e81905b
commit 0d1ce13767
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 69 additions and 0 deletions

View file

@ -49,6 +49,29 @@ func (keyRing *KeyRing) AddKey(key *Key) error {
return nil
}
// NewKeyRingFromBinary creates a new keyring with all the keys contained in the unarmored binary data.
// Note that it accepts only unlocked or public keys, as KeyRing cannot contain locked keys.
func NewKeyRingFromBinary(binKeys []byte) (*KeyRing, error) {
entities, err := openpgp.ReadKeyRing(bytes.NewReader(binKeys))
if err != nil {
return nil, errors.Wrap(err, "gopenpgp: error in reading keyring")
}
keyring := &KeyRing{}
for _, entity := range entities {
key, err := NewKeyFromEntity(entity)
if err != nil {
return nil, errors.Wrap(err, "gopenpgp: error in reading keyring")
}
if err = keyring.AddKey(key); err != nil {
return nil, errors.Wrap(err, "gopenpgp: error in reading keyring")
}
}
return keyring, nil
}
// --- Extract keys from keyring
// GetKeys returns openpgp keys contained in this KeyRing.
@ -88,6 +111,25 @@ func (keyRing *KeyRing) getSigningEntity() (*openpgp.Entity, error) {
return signEntity, nil
}
// Serialize serializes a KeyRing to binary data.
func (keyRing *KeyRing) Serialize() ([]byte, error) {
var buffer bytes.Buffer
for _, entity := range keyRing.entities {
var err error
if entity.PrivateKey == nil {
err = entity.Serialize(&buffer)
} else {
err = entity.SerializePrivateWithoutSigning(&buffer, nil)
}
if err != nil {
return nil, errors.Wrap(err, "gopenpgp: error in serializing keyring")
}
}
return buffer.Bytes(), nil
}
// --- Extract info from key
// CountEntities returns the number of entities in the keyring.