@@ -826,29 +826,30 @@ func extractPublicKey(secKeyRef *security.SecKeyRef) (crypto.PublicKey, []byte,
826
826
if publicKey , err := security .SecKeyCopyPublicKey (secKeyRef ); err == nil {
827
827
defer publicKey .Release ()
828
828
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
+ }
834
844
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 )
839
847
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 )
841
849
}
842
- return pub , hash , nil
843
- }
844
850
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
849
852
}
850
-
851
- return pub , hash , nil
852
853
}
853
854
854
855
// At this point we only have the private key.
0 commit comments