@@ -49,6 +49,29 @@ func (keyRing *KeyRing) AddKey(key *Key) error {
49
49
return nil
50
50
}
51
51
52
+ // NewKeyRingFromBinary creates a new keyring with all the keys contained in the unarmored binary data.
53
+ // Note that it accepts only unlocked or public keys, as KeyRing cannot contain locked keys.
54
+ func NewKeyRingFromBinary (binKeys []byte ) (* KeyRing , error ) {
55
+ entities , err := openpgp .ReadKeyRing (bytes .NewReader (binKeys ))
56
+ if err != nil {
57
+ return nil , errors .Wrap (err , "gopenpgp: error in reading keyring" )
58
+ }
59
+
60
+ keyring := & KeyRing {}
61
+ for _ , entity := range entities {
62
+ key , err := NewKeyFromEntity (entity )
63
+ if err != nil {
64
+ return nil , errors .Wrap (err , "gopenpgp: error in reading keyring" )
65
+ }
66
+
67
+ if err = keyring .AddKey (key ); err != nil {
68
+ return nil , errors .Wrap (err , "gopenpgp: error in reading keyring" )
69
+ }
70
+ }
71
+
72
+ return keyring , nil
73
+ }
74
+
52
75
// --- Extract keys from keyring
53
76
54
77
// GetKeys returns openpgp keys contained in this KeyRing.
@@ -88,6 +111,25 @@ func (keyRing *KeyRing) getSigningEntity() (*openpgp.Entity, error) {
88
111
return signEntity , nil
89
112
}
90
113
114
+ // Serialize serializes a KeyRing to binary data.
115
+ func (keyRing * KeyRing ) Serialize () ([]byte , error ) {
116
+ var buffer bytes.Buffer
117
+
118
+ for _ , entity := range keyRing .entities {
119
+ var err error
120
+ if entity .PrivateKey == nil {
121
+ err = entity .Serialize (& buffer )
122
+ } else {
123
+ err = entity .SerializePrivateWithoutSigning (& buffer , nil )
124
+ }
125
+ if err != nil {
126
+ return nil , errors .Wrap (err , "gopenpgp: error in serializing keyring" )
127
+ }
128
+ }
129
+
130
+ return buffer .Bytes (), nil
131
+ }
132
+
91
133
// --- Extract info from key
92
134
93
135
// CountEntities returns the number of entities in the keyring.
0 commit comments