@@ -156,7 +156,7 @@ func (key *Key) Unlock(passphrase []byte) (*Key, error) {
156156 }
157157
158158 for _ , sub := range unlockedKey .entity .Subkeys {
159- if sub .PrivateKey != nil {
159+ if sub .PrivateKey != nil && ! sub . PrivateKey . Dummy () {
160160 if err := sub .PrivateKey .Decrypt (passphrase ); err != nil {
161161 return nil , errors .Wrap (err , "gopenpgp: error in unlocking sub key" )
162162 }
@@ -280,13 +280,19 @@ func (key *Key) IsLocked() (bool, error) {
280280 return true , errors .New ("gopenpgp: a public key cannot be locked" )
281281 }
282282
283+ encryptedKeys := 0
284+
283285 for _ , sub := range key .entity .Subkeys {
284- if sub .PrivateKey != nil && ! sub .PrivateKey .Encrypted {
285- return false , nil
286+ if sub .PrivateKey != nil && ! sub .PrivateKey .Dummy () && sub . PrivateKey . Encrypted {
287+ encryptedKeys ++
286288 }
287289 }
288290
289- return key .entity .PrivateKey .Encrypted , nil
291+ if key .entity .PrivateKey .Encrypted {
292+ encryptedKeys ++
293+ }
294+
295+ return encryptedKeys > 0 , nil
290296}
291297
292298// IsUnlocked checks if a private key is unlocked.
@@ -295,13 +301,19 @@ func (key *Key) IsUnlocked() (bool, error) {
295301 return true , errors .New ("gopenpgp: a public key cannot be unlocked" )
296302 }
297303
304+ encryptedKeys := 0
305+
298306 for _ , sub := range key .entity .Subkeys {
299- if sub .PrivateKey != nil && sub .PrivateKey .Encrypted {
300- return false , nil
307+ if sub .PrivateKey != nil && ! sub . PrivateKey . Dummy () && sub .PrivateKey .Encrypted {
308+ encryptedKeys ++
301309 }
302310 }
303311
304- return ! key .entity .PrivateKey .Encrypted , nil
312+ if key .entity .PrivateKey .Encrypted {
313+ encryptedKeys ++
314+ }
315+
316+ return encryptedKeys == 0 , nil
305317}
306318
307319// Check verifies if the public keys match the private key parameters by
0 commit comments