@@ -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