diff --git a/scripts/rs256/rs256.go b/scripts/rs256/rs256.go new file mode 100644 index 0000000..f8cc9cc --- /dev/null +++ b/scripts/rs256/rs256.go @@ -0,0 +1,76 @@ +package main + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "encoding/asn1" + "encoding/gob" + "encoding/pem" + "fmt" + "os" +) + +func main() { + reader := rand.Reader + bitSize := 2048 + + key, err := rsa.GenerateKey(reader, bitSize) + checkError(err) + + publicKey := key.PublicKey + + saveGobKey("private.key", key) + savePEMKey("private.pem", key) + + saveGobKey("public.key", publicKey) + savePublicPEMKey("public.pem", publicKey) +} + +func saveGobKey(fileName string, key interface{}) { + outFile, err := os.Create(fileName) + checkError(err) + defer outFile.Close() + + encoder := gob.NewEncoder(outFile) + err = encoder.Encode(key) + checkError(err) +} + +func savePEMKey(fileName string, key *rsa.PrivateKey) { + outFile, err := os.Create(fileName) + checkError(err) + defer outFile.Close() + + var privateKey = &pem.Block{ + Type: "PRIVATE KEY", + Bytes: x509.MarshalPKCS1PrivateKey(key), + } + + err = pem.Encode(outFile, privateKey) + checkError(err) +} + +func savePublicPEMKey(fileName string, pubkey rsa.PublicKey) { + asn1Bytes, err := asn1.Marshal(pubkey) + checkError(err) + + var pemkey = &pem.Block{ + Type: "PUBLIC KEY", + Bytes: asn1Bytes, + } + + pemfile, err := os.Create(fileName) + checkError(err) + defer pemfile.Close() + + err = pem.Encode(pemfile, pemkey) + checkError(err) +} + +func checkError(err error) { + if err != nil { + fmt.Println("Fatal error ", err.Error()) + os.Exit(1) + } +}