Created
May 16, 2020 22:48
-
-
Save farhany/71da40b88c4636db7487c4b1d3850595 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Source: https://stackoverflow.com/questions/13555085/save-and-load-crypto-rsa-privatekey-to-and-from-the-disk | |
// Original author: https://stackoverflow.com/users/5213030/david-w | |
package main | |
import ( | |
"crypto/rand" | |
"crypto/rsa" | |
"crypto/x509" | |
"encoding/pem" | |
"errors" | |
"fmt" | |
) | |
func GenerateRsaKeyPair() (*rsa.PrivateKey, *rsa.PublicKey) { | |
privkey, _ := rsa.GenerateKey(rand.Reader, 4096) | |
return privkey, &privkey.PublicKey | |
} | |
func ExportRsaPrivateKeyAsPemStr(privkey *rsa.PrivateKey) string { | |
privkey_bytes := x509.MarshalPKCS1PrivateKey(privkey) | |
privkey_pem := pem.EncodeToMemory( | |
&pem.Block{ | |
Type: "RSA PRIVATE KEY", | |
Bytes: privkey_bytes, | |
}, | |
) | |
return string(privkey_pem) | |
} | |
func ParseRsaPrivateKeyFromPemStr(privPEM string) (*rsa.PrivateKey, error) { | |
block, _ := pem.Decode([]byte(privPEM)) | |
if block == nil { | |
return nil, errors.New("failed to parse PEM block containing the key") | |
} | |
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) | |
if err != nil { | |
return nil, err | |
} | |
return priv, nil | |
} | |
func ExportRsaPublicKeyAsPemStr(pubkey *rsa.PublicKey) (string, error) { | |
pubkey_bytes, err := x509.MarshalPKIXPublicKey(pubkey) | |
if err != nil { | |
return "", err | |
} | |
pubkey_pem := pem.EncodeToMemory( | |
&pem.Block{ | |
Type: "RSA PUBLIC KEY", | |
Bytes: pubkey_bytes, | |
}, | |
) | |
return string(pubkey_pem), nil | |
} | |
func ParseRsaPublicKeyFromPemStr(pubPEM string) (*rsa.PublicKey, error) { | |
block, _ := pem.Decode([]byte(pubPEM)) | |
if block == nil { | |
return nil, errors.New("failed to parse PEM block containing the key") | |
} | |
pub, err := x509.ParsePKIXPublicKey(block.Bytes) | |
if err != nil { | |
return nil, err | |
} | |
switch pub := pub.(type) { | |
case *rsa.PublicKey: | |
return pub, nil | |
default: | |
break // fall through | |
} | |
return nil, errors.New("Key type is not RSA") | |
} | |
func main() { | |
// Create the keys | |
priv, pub := GenerateRsaKeyPair() | |
// Export the keys to pem string | |
priv_pem := ExportRsaPrivateKeyAsPemStr(priv) | |
pub_pem, _ := ExportRsaPublicKeyAsPemStr(pub) | |
// Import the keys from pem string | |
priv_parsed, _ := ParseRsaPrivateKeyFromPemStr(priv_pem) | |
pub_parsed, _ := ParseRsaPublicKeyFromPemStr(pub_pem) | |
// Export the newly imported keys | |
priv_parsed_pem := ExportRsaPrivateKeyAsPemStr(priv_parsed) | |
pub_parsed_pem, _ := ExportRsaPublicKeyAsPemStr(pub_parsed) | |
fmt.Println(priv_parsed_pem) | |
fmt.Println(pub_parsed_pem) | |
// Check that the exported/imported keys match the original keys | |
if priv_pem != priv_parsed_pem || pub_pem != pub_parsed_pem { | |
fmt.Println("Failure: Export and Import did not result in same Keys") | |
} else { | |
fmt.Println("Success") | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment