github.com/choria-io/go-choria@v0.28.1-0.20240416190746-b3bf9c7d5a45/integration/testutil/rsa.go (about) 1 // Copyright (c) 2022, R.I. Pienaar and the Choria Project contributors 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 5 package testutil 6 7 import ( 8 "bytes" 9 "crypto/rand" 10 "crypto/rsa" 11 "crypto/x509" 12 "crypto/x509/pkix" 13 "encoding/pem" 14 "fmt" 15 "math/big" 16 "os" 17 "path/filepath" 18 "time" 19 ) 20 21 func LoadRSAKey(key string) (pri *rsa.PrivateKey, err error) { 22 kb, err := os.ReadFile(key) 23 if err != nil { 24 return nil, err 25 } 26 27 privPem, _ := pem.Decode(kb) 28 if privPem.Type != "RSA PRIVATE KEY" { 29 return nil, fmt.Errorf("not a rsa private key") 30 } 31 32 parsedKey, err := x509.ParsePKCS1PrivateKey(privPem.Bytes) 33 if err != nil { 34 return nil, err 35 } 36 37 return parsedKey, nil 38 } 39 40 // CreateRSAKeyAndCert public.pem and private.pem in td 41 func CreateRSAKeyAndCert(td string) (pri *rsa.PrivateKey, err error) { 42 privateKey, err := rsa.GenerateKey(rand.Reader, 2048) 43 if err != nil { 44 return nil, err 45 } 46 47 template := x509.Certificate{ 48 SerialNumber: big.NewInt(1), 49 Subject: pkix.Name{ 50 Organization: []string{"Choria.IO Testing"}, 51 }, 52 NotBefore: time.Now(), 53 NotAfter: time.Now().Add(time.Hour * 24 * 180), 54 KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, 55 ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, 56 BasicConstraintsValid: true, 57 } 58 59 derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &privateKey.PublicKey, privateKey) 60 if err != nil { 61 return nil, err 62 } 63 64 out := &bytes.Buffer{} 65 66 pem.Encode(out, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) 67 err = os.WriteFile(filepath.Join(td, "public.pem"), out.Bytes(), 0600) 68 if err != nil { 69 return nil, err 70 } 71 72 out.Reset() 73 74 blk := &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)} 75 pem.Encode(out, blk) 76 77 err = os.WriteFile(filepath.Join(td, "private.pem"), out.Bytes(), 0600) 78 if err != nil { 79 return nil, err 80 } 81 82 return privateKey, nil 83 }