github.com/tommi2day/gomodules@v1.13.2-0.20240423190010-b7d55d252a27/pwlib/rsa_test.go (about)

     1  package pwlib
     2  
     3  import (
     4  	"crypto/rsa"
     5  	"os"
     6  	"path"
     7  	"testing"
     8  
     9  	"github.com/tommi2day/gomodules/test"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  var (
    16  	p *rsa.PublicKey
    17  	k *rsa.PrivateKey
    18  )
    19  
    20  func TestGenRsaKey(t *testing.T) {
    21  	test.Testinit(t)
    22  	err := os.Chdir(test.TestDir)
    23  	require.NoErrorf(t, err, "ChDir failed")
    24  
    25  	pubfilename := "testdata/key.pub"
    26  	privfilename := "testdata/key.pem"
    27  	_ = os.Remove(pubfilename)
    28  	_ = os.Remove(privfilename)
    29  
    30  	t.Run("Key Gen unencrypted", func(t *testing.T) {
    31  		pubkey, privkey, err := GenRsaKey(pubfilename, privfilename, "")
    32  		assert.NoErrorf(t, err, "Error while creating key: %s", err)
    33  		assert.NotEmpty(t, pubkey)
    34  		assert.NotEmpty(t, privkey)
    35  		assert.IsTypef(t, p, pubkey, "Not a public key")
    36  		assert.IsTypef(t, k, privkey, "Not a private key")
    37  		assert.FileExists(t, pubfilename)
    38  		assert.FileExists(t, privfilename)
    39  	})
    40  	pubfilename = "testdata/enckey.pub"
    41  	privfilename = "testdata/enckey.pem"
    42  	_ = os.Remove(pubfilename)
    43  	_ = os.Remove(privfilename)
    44  	t.Run("Key Gen encrypted", func(t *testing.T) {
    45  		pubkey, privkey, err := GenRsaKey(pubfilename, privfilename, "gen_test")
    46  		assert.NoErrorf(t, err, "Error while creating key: %s", err)
    47  		assert.NotEmpty(t, pubkey)
    48  		assert.NotEmpty(t, privkey)
    49  		assert.IsTypef(t, p, pubkey, "Not a public key")
    50  		assert.IsTypef(t, k, privkey, "Not a private key")
    51  		assert.FileExists(t, pubfilename)
    52  		assert.FileExists(t, privfilename)
    53  		//nolint gosec
    54  		content, err := os.ReadFile(privfilename)
    55  		assert.NoErrorf(t, err, "File Read Error %s", err)
    56  		assert.Contains(t, string(content), "Proc-Type: 4,ENCRYPTED")
    57  	})
    58  }
    59  
    60  func TestGetKeyFromFile(t *testing.T) {
    61  	test.Testinit(t)
    62  	app := "test_get"
    63  	testPubFile := path.Join(test.TestData, app+pubExt)
    64  	testNotEncPrivFile := path.Join(test.TestData, app+"_notenc"+privExt)
    65  	testEncPrivFile := path.Join(test.TestData, app+privExt)
    66  	defaultPassword := app
    67  	err := os.Chdir(test.TestDir)
    68  	require.NoError(t, err, "ChDir failed")
    69  	_ = os.Remove(testPubFile)
    70  	_ = os.Remove(testNotEncPrivFile)
    71  	_, _, err = GenRsaKey(testPubFile, testNotEncPrivFile, "")
    72  	require.NoErrorf(t, err, "GenKey NoEncrypt failed failed:%s", err)
    73  	t.Run("Get Public Key", func(t *testing.T) {
    74  		pubkey, err := GetPublicKeyFromFile(testPubFile)
    75  		assert.NoErrorf(t, err, "Error while reading pubkey: %s", err)
    76  		assert.NotEmpty(t, pubkey)
    77  		assert.IsTypef(t, p, pubkey, "Not a public key")
    78  	})
    79  	t.Run("Get private key without password", func(t *testing.T) {
    80  		pubkey, privkey, err := GetPrivateKeyFromFile(testNotEncPrivFile, "")
    81  		assert.NoErrorf(t, err, "Error while reading privkey: %s", err)
    82  		assert.NotEmpty(t, pubkey)
    83  		assert.IsTypef(t, p, pubkey, "Not a public key")
    84  		assert.NotEmpty(t, privkey)
    85  		assert.IsTypef(t, k, privkey, "Not a private key")
    86  	})
    87  	t.Run("Get private key with password, but should be none", func(t *testing.T) {
    88  		pubkey, privkey, err := GetPrivateKeyFromFile(testNotEncPrivFile, defaultPassword)
    89  		assert.Error(t, err, "Password given, but was not set")
    90  		assert.Empty(t, pubkey)
    91  		assert.Empty(t, privkey)
    92  	})
    93  
    94  	// test with encrypted passwords
    95  	_ = os.Remove(testPubFile)
    96  	_ = os.Remove(testEncPrivFile)
    97  	_, _, err = GenRsaKey(testPubFile, testEncPrivFile, defaultPassword)
    98  	require.NoErrorf(t, err, "GenKey NoEncrypt failed failed:%s", err)
    99  	t.Run("Get private key with correct password", func(t *testing.T) {
   100  		pubkey, privkey, err := GetPrivateKeyFromFile(testEncPrivFile, defaultPassword)
   101  		assert.NoErrorf(t, err, "Error while reading privkey: %s", err)
   102  		assert.NotEmpty(t, pubkey)
   103  		assert.IsTypef(t, p, pubkey, "Not a public key")
   104  		assert.NotEmpty(t, privkey)
   105  		assert.IsTypef(t, k, privkey, "Not a private key")
   106  	})
   107  	t.Run("Get private key with wrong password", func(t *testing.T) {
   108  		pubkey, privkey, err := GetPrivateKeyFromFile(testEncPrivFile, "xxxx")
   109  		assert.Errorf(t, err, "Wrong Password has been accepted: ")
   110  		assert.Empty(t, pubkey)
   111  		assert.Empty(t, privkey)
   112  	})
   113  	app = "test_pkcs1"
   114  	t.Run("Get private key with PKCS1 (traditional openssl)", func(t *testing.T) {
   115  		pubkey, privkey, err := GetPrivateKeyFromFile(app+".pem.txt", app)
   116  		assert.NoErrorf(t, err, "Error while reading privkey: %s", err)
   117  		assert.NotEmpty(t, pubkey)
   118  		assert.IsTypef(t, p, pubkey, "Not a public key")
   119  		assert.NotEmpty(t, privkey)
   120  		assert.IsTypef(t, k, privkey, "Not a private key")
   121  	})
   122  	t.Run("Get Public Key PKCS1", func(t *testing.T) {
   123  		pubkey, err := GetPublicKeyFromFile(app + ".pub.txt")
   124  		assert.NoErrorf(t, err, "Error while reading pubkey: %s", err)
   125  		assert.NotEmpty(t, pubkey)
   126  		assert.IsTypef(t, p, pubkey, "Not a public key")
   127  	})
   128  }