// KeyToPEM returns a PEM encoded key from a Private Key func KeyToPEM(privKey *data.PrivateKey) ([]byte, error) { if privKey.Cipher() != "RSA" { return nil, errors.New("only RSA keys are currently supported") } return pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: privKey.Private()}), nil }
func sign(privKey *data.PrivateKey, hash crypto.Hash, hashed []byte) ([]byte, error) { // TODO(diogo): Implement support for ECDSA. if privKey.Cipher() != "RSA" { return nil, fmt.Errorf("private key type not supported: %s", privKey.Cipher()) } // Create an rsa.PrivateKey out of the private key bytes rsaPrivKey, err := x509.ParsePKCS1PrivateKey(privKey.Private()) if err != nil { return nil, err } // Use the RSA key to sign the data sig, err := rsa.SignPKCS1v15(rand.Reader, rsaPrivKey, hash, hashed[:]) if err != nil { return nil, err } return sig, nil }
// EncryptPrivateKey returns an encrypted PEM key given a Privatekey // and a passphrase func EncryptPrivateKey(key *data.PrivateKey, passphrase string) ([]byte, error) { // TODO(diogo): Currently only supports RSA Private keys if key.Cipher() != "RSA" { return nil, errors.New("only RSA keys are currently supported") } password := []byte(passphrase) cipherType := x509.PEMCipherAES256 blockType := "RSA PRIVATE KEY" encryptedPEMBlock, err := x509.EncryptPEMBlock(rand.Reader, blockType, key.Private(), password, cipherType) if err != nil { return nil, err } return pem.EncodeToMemory(encryptedPEMBlock), nil }