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  }