// Provides key manipulation helper methods package key import ( "bytes" "fmt" "github.com/ProtonMail/go-pm-crypto/armor" "golang.org/x/crypto/openpgp" "golang.org/x/crypto/openpgp/packet" "strings" ) // Use: ios/android only //CheckPassphrase check is private key passphrase ok func CheckPassphrase(privateKey string, passphrase string) bool { privKeyReader := strings.NewReader(privateKey) entries, err := openpgp.ReadArmoredKeyRing(privKeyReader) if err != nil { fmt.Println(err) return false } var keys []*packet.PrivateKey for _, e := range entries { keys = append(keys, e.PrivateKey) } var decryptError error var n int for _, key := range keys { if !key.Encrypted { continue // Key already decrypted } if decryptError = key.Decrypt([]byte(passphrase)); decryptError == nil { n++ } } if n == 0 { return false } return true } // Use: ios/android only // PublicKey get a public key from a private key func PublicKey(privateKey string) (string, error) { privKeyReader := strings.NewReader(privateKey) entries, err := openpgp.ReadArmoredKeyRing(privKeyReader) if err != nil { return "", err } var outBuf bytes.Buffer for _, e := range entries { e.Serialize(&outBuf) } outString, err := armor.ArmorWithType(outBuf.Bytes(), armor.PUBLIC_KEY_HEADER) if err != nil { return "", nil } return outString, nil } // Use: ios/android only // PublicKeyBinOut get a public key from a private key func PublicKeyBinOut(privateKey string) ([]byte, error) { privKeyReader := strings.NewReader(privateKey) entries, err := openpgp.ReadArmoredKeyRing(privKeyReader) if err != nil { return nil, err } var outBuf bytes.Buffer for _, e := range entries { e.Serialize(&outBuf) } return outBuf.Bytes(), nil }