Skip to content

Commit ba42b52

Browse files
authored
Merge pull request #758 from smallstep/mariano/mackms-public-key
Extract public key from private
2 parents cea7e12 + bee181d commit ba42b52

File tree

1 file changed

+19
-18
lines changed

1 file changed

+19
-18
lines changed

kms/mackms/mackms.go

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -826,29 +826,30 @@ func extractPublicKey(secKeyRef *security.SecKeyRef) (crypto.PublicKey, []byte,
826826
if publicKey, err := security.SecKeyCopyPublicKey(secKeyRef); err == nil {
827827
defer publicKey.Release()
828828

829-
data, err := security.SecKeyCopyExternalRepresentation(publicKey)
830-
if err != nil {
831-
return nil, nil, fmt.Errorf("macOS SecKeyCopyExternalRepresentation failed: %w", err)
832-
}
833-
defer data.Release()
829+
// For an unknown reason this sometimes fails with the error -25293
830+
// (errSecAuthFailed). If this happens attempt to extract the key from
831+
// the private key.
832+
if data, err := security.SecKeyCopyExternalRepresentation(publicKey); err == nil {
833+
defer data.Release()
834+
835+
derBytes := data.Bytes()
836+
// ECDSA public keys are formatted as "04 || X || Y"
837+
if derBytes[0] == 0x04 {
838+
pub, err := parseECDSAPublicKey(derBytes)
839+
if err != nil {
840+
return nil, nil, fmt.Errorf("error parsing ECDSA key: %w", err)
841+
}
842+
return pub, hash, nil
843+
}
834844

835-
derBytes := data.Bytes()
836-
// ECDSA public keys are formatted as "04 || X || Y"
837-
if derBytes[0] == 0x04 {
838-
pub, err := parseECDSAPublicKey(derBytes)
845+
// RSA public keys are formatted using PKCS #1
846+
pub, err := x509.ParsePKCS1PublicKey(derBytes)
839847
if err != nil {
840-
return nil, nil, fmt.Errorf("error parsing ECDSA key: %w", err)
848+
return nil, nil, fmt.Errorf("error parsing RSA key: %w", err)
841849
}
842-
return pub, hash, nil
843-
}
844850

845-
// RSA public keys are formatted using PKCS #1
846-
pub, err := x509.ParsePKCS1PublicKey(derBytes)
847-
if err != nil {
848-
return nil, nil, fmt.Errorf("error parsing RSA key: %w", err)
851+
return pub, hash, nil
849852
}
850-
851-
return pub, hash, nil
852853
}
853854

854855
// At this point we only have the private key.

0 commit comments

Comments
 (0)