github.com/eliastor/durgaform@v0.0.0-20220816172711-d0ab2d17673e/internal/lang/funcs/crypto_test.go (about)

     1  package funcs
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/zclconf/go-cty/cty"
     8  	"golang.org/x/crypto/bcrypt"
     9  )
    10  
    11  func TestUUID(t *testing.T) {
    12  	result, err := UUID()
    13  	if err != nil {
    14  		t.Fatal(err)
    15  	}
    16  
    17  	resultStr := result.AsString()
    18  	if got, want := len(resultStr), 36; got != want {
    19  		t.Errorf("wrong result length %d; want %d", got, want)
    20  	}
    21  }
    22  
    23  func TestUUIDV5(t *testing.T) {
    24  	tests := []struct {
    25  		Namespace cty.Value
    26  		Name      cty.Value
    27  		Want      cty.Value
    28  		Err       bool
    29  	}{
    30  		{
    31  			cty.StringVal("dns"),
    32  			cty.StringVal("tada"),
    33  			cty.StringVal("faa898db-9b9d-5b75-86a9-149e7bb8e3b8"),
    34  			false,
    35  		},
    36  		{
    37  			cty.StringVal("url"),
    38  			cty.StringVal("tada"),
    39  			cty.StringVal("2c1ff6b4-211f-577e-94de-d978b0caa16e"),
    40  			false,
    41  		},
    42  		{
    43  			cty.StringVal("oid"),
    44  			cty.StringVal("tada"),
    45  			cty.StringVal("61eeea26-5176-5288-87fc-232d6ed30d2f"),
    46  			false,
    47  		},
    48  		{
    49  			cty.StringVal("x500"),
    50  			cty.StringVal("tada"),
    51  			cty.StringVal("7e12415e-f7c9-57c3-9e43-52dc9950d264"),
    52  			false,
    53  		},
    54  		{
    55  			cty.StringVal("6ba7b810-9dad-11d1-80b4-00c04fd430c8"),
    56  			cty.StringVal("tada"),
    57  			cty.StringVal("faa898db-9b9d-5b75-86a9-149e7bb8e3b8"),
    58  			false,
    59  		},
    60  		{
    61  			cty.StringVal("tada"),
    62  			cty.StringVal("tada"),
    63  			cty.UnknownVal(cty.String),
    64  			true,
    65  		},
    66  	}
    67  
    68  	for _, test := range tests {
    69  		t.Run(fmt.Sprintf("uuidv5(%#v, %#v)", test.Namespace, test.Name), func(t *testing.T) {
    70  			got, err := UUIDV5(test.Namespace, test.Name)
    71  
    72  			if test.Err {
    73  				if err == nil {
    74  					t.Fatal("succeeded; want error")
    75  				}
    76  				return
    77  			} else if err != nil {
    78  				t.Fatalf("unexpected error: %s", err)
    79  			}
    80  
    81  			if !got.RawEquals(test.Want) {
    82  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
    83  			}
    84  		})
    85  	}
    86  }
    87  
    88  func TestBase64Sha256(t *testing.T) {
    89  	tests := []struct {
    90  		String cty.Value
    91  		Want   cty.Value
    92  		Err    bool
    93  	}{
    94  		{
    95  			cty.StringVal("test"),
    96  			cty.StringVal("n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg="),
    97  			false,
    98  		},
    99  		// This would differ because we're base64-encoding hex represantiation, not raw bytes.
   100  		// base64encode(sha256("test")) =
   101  		// "OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWEwYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjJjZDE1ZDZjMTViMGYwMGEwOA=="
   102  	}
   103  
   104  	for _, test := range tests {
   105  		t.Run(fmt.Sprintf("base64sha256(%#v)", test.String), func(t *testing.T) {
   106  			got, err := Base64Sha256(test.String)
   107  
   108  			if test.Err {
   109  				if err == nil {
   110  					t.Fatal("succeeded; want error")
   111  				}
   112  				return
   113  			} else if err != nil {
   114  				t.Fatalf("unexpected error: %s", err)
   115  			}
   116  
   117  			if !got.RawEquals(test.Want) {
   118  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   119  			}
   120  		})
   121  	}
   122  }
   123  
   124  func TestFileBase64Sha256(t *testing.T) {
   125  	tests := []struct {
   126  		Path cty.Value
   127  		Want cty.Value
   128  		Err  bool
   129  	}{
   130  		{
   131  			cty.StringVal("testdata/hello.txt"),
   132  			cty.StringVal("pZGm1Av0IEBKARczz7exkNYsZb8LzaMrV7J32a2fFG4="),
   133  			false,
   134  		},
   135  		{
   136  			cty.StringVal("testdata/icon.png"),
   137  			cty.StringVal("47U1q9IZW093SmAzdC820Skpn8vHPvc8szud/Y3ezpo="),
   138  			false,
   139  		},
   140  		{
   141  			cty.StringVal("testdata/missing"),
   142  			cty.NilVal,
   143  			true, // no file exists
   144  		},
   145  	}
   146  
   147  	fileSHA256 := MakeFileBase64Sha256Func(".")
   148  
   149  	for _, test := range tests {
   150  		t.Run(fmt.Sprintf("filebase64sha256(%#v)", test.Path), func(t *testing.T) {
   151  			got, err := fileSHA256.Call([]cty.Value{test.Path})
   152  
   153  			if test.Err {
   154  				if err == nil {
   155  					t.Fatal("succeeded; want error")
   156  				}
   157  				return
   158  			} else if err != nil {
   159  				t.Fatalf("unexpected error: %s", err)
   160  			}
   161  
   162  			if !got.RawEquals(test.Want) {
   163  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   164  			}
   165  		})
   166  	}
   167  }
   168  
   169  func TestBase64Sha512(t *testing.T) {
   170  	tests := []struct {
   171  		String cty.Value
   172  		Want   cty.Value
   173  		Err    bool
   174  	}{
   175  		{
   176  			cty.StringVal("test"),
   177  			cty.StringVal("7iaw3Ur350mqGo7jwQrpkj9hiYB3Lkc/iBml1JQODbJ6wYX4oOHV+E+IvIh/1nsUNzLDBMxfqa2Ob1f1ACio/w=="),
   178  			false,
   179  		},
   180  		// This would differ because we're base64-encoding hex represantiation, not raw bytes
   181  		// base64encode(sha512("test")) =
   182  		// "OZWUyNmIwZGQ0YWY3ZTc0OWFhMWE4ZWUzYzEwYWU5OTIzZjYxODk4MDc3MmU0NzNmODgxOWE1ZDQ5NDBlMGRiMjdhYzE4NWY4YTBlMWQ1Zjg0Zjg4YmM4ODdmZDY3YjE0MzczMmMzMDRjYzVmYTlhZDhlNmY1N2Y1MDAyOGE4ZmY="
   183  	}
   184  
   185  	for _, test := range tests {
   186  		t.Run(fmt.Sprintf("base64sha512(%#v)", test.String), func(t *testing.T) {
   187  			got, err := Base64Sha512(test.String)
   188  
   189  			if test.Err {
   190  				if err == nil {
   191  					t.Fatal("succeeded; want error")
   192  				}
   193  				return
   194  			} else if err != nil {
   195  				t.Fatalf("unexpected error: %s", err)
   196  			}
   197  
   198  			if !got.RawEquals(test.Want) {
   199  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   200  			}
   201  		})
   202  	}
   203  }
   204  
   205  func TestFileBase64Sha512(t *testing.T) {
   206  	tests := []struct {
   207  		Path cty.Value
   208  		Want cty.Value
   209  		Err  bool
   210  	}{
   211  		{
   212  			cty.StringVal("testdata/hello.txt"),
   213  			cty.StringVal("LHT9F+2v2A6ER7DUZ0HuJDt+t03SFJoKsbkkb7MDgvJ+hT2FhXGeDmfL2g2qj1FnEGRhXWRa4nrLFb+xRH9Fmw=="),
   214  			false,
   215  		},
   216  		{
   217  			cty.StringVal("testdata/icon.png"),
   218  			cty.StringVal("wSInO/tKEOaLGCAY2h/7gtLWMpzyLJ0ijFh95JTpYrPzXQYgviAdL9ZgpD9EAte8On+drvhFvjIFsfQUwxbNPQ=="),
   219  			false,
   220  		},
   221  		{
   222  			cty.StringVal("testdata/missing"),
   223  			cty.NilVal,
   224  			true, // no file exists
   225  		},
   226  	}
   227  
   228  	fileSHA512 := MakeFileBase64Sha512Func(".")
   229  
   230  	for _, test := range tests {
   231  		t.Run(fmt.Sprintf("filebase64sha512(%#v)", test.Path), func(t *testing.T) {
   232  			got, err := fileSHA512.Call([]cty.Value{test.Path})
   233  
   234  			if test.Err {
   235  				if err == nil {
   236  					t.Fatal("succeeded; want error")
   237  				}
   238  				return
   239  			} else if err != nil {
   240  				t.Fatalf("unexpected error: %s", err)
   241  			}
   242  
   243  			if !got.RawEquals(test.Want) {
   244  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   245  			}
   246  		})
   247  	}
   248  }
   249  
   250  func TestBcrypt(t *testing.T) {
   251  	// single variable test
   252  	p, err := Bcrypt(cty.StringVal("test"))
   253  	if err != nil {
   254  		t.Fatalf("err: %s", err)
   255  	}
   256  
   257  	err = bcrypt.CompareHashAndPassword([]byte(p.AsString()), []byte("test"))
   258  	if err != nil {
   259  		t.Fatalf("Error comparing hash and password: %s", err)
   260  	}
   261  
   262  	// testing with two parameters
   263  	p, err = Bcrypt(cty.StringVal("test"), cty.NumberIntVal(5))
   264  	if err != nil {
   265  		t.Fatalf("err: %s", err)
   266  	}
   267  
   268  	err = bcrypt.CompareHashAndPassword([]byte(p.AsString()), []byte("test"))
   269  	if err != nil {
   270  		t.Fatalf("Error comparing hash and password: %s", err)
   271  	}
   272  
   273  	// Negative test for more than two parameters
   274  	_, err = Bcrypt(cty.StringVal("test"), cty.NumberIntVal(10), cty.NumberIntVal(11))
   275  	if err == nil {
   276  		t.Fatal("succeeded; want error")
   277  	}
   278  }
   279  
   280  func TestMd5(t *testing.T) {
   281  	tests := []struct {
   282  		String cty.Value
   283  		Want   cty.Value
   284  		Err    bool
   285  	}{
   286  		{
   287  			cty.StringVal("tada"),
   288  			cty.StringVal("ce47d07243bb6eaf5e1322c81baf9bbf"),
   289  			false,
   290  		},
   291  		{ // Confirm that we're not trimming any whitespaces
   292  			cty.StringVal(" tada "),
   293  			cty.StringVal("aadf191a583e53062de2d02c008141c4"),
   294  			false,
   295  		},
   296  		{ // We accept empty string too
   297  			cty.StringVal(""),
   298  			cty.StringVal("d41d8cd98f00b204e9800998ecf8427e"),
   299  			false,
   300  		},
   301  	}
   302  
   303  	for _, test := range tests {
   304  		t.Run(fmt.Sprintf("md5(%#v)", test.String), func(t *testing.T) {
   305  			got, err := Md5(test.String)
   306  
   307  			if test.Err {
   308  				if err == nil {
   309  					t.Fatal("succeeded; want error")
   310  				}
   311  				return
   312  			} else if err != nil {
   313  				t.Fatalf("unexpected error: %s", err)
   314  			}
   315  
   316  			if !got.RawEquals(test.Want) {
   317  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   318  			}
   319  		})
   320  	}
   321  }
   322  
   323  func TestFileMD5(t *testing.T) {
   324  	tests := []struct {
   325  		Path cty.Value
   326  		Want cty.Value
   327  		Err  bool
   328  	}{
   329  		{
   330  			cty.StringVal("testdata/hello.txt"),
   331  			cty.StringVal("b10a8db164e0754105b7a99be72e3fe5"),
   332  			false,
   333  		},
   334  		{
   335  			cty.StringVal("testdata/icon.png"),
   336  			cty.StringVal("d7e6c283185a1078c58213beadca98b0"),
   337  			false,
   338  		},
   339  		{
   340  			cty.StringVal("testdata/missing"),
   341  			cty.NilVal,
   342  			true, // no file exists
   343  		},
   344  	}
   345  
   346  	fileMD5 := MakeFileMd5Func(".")
   347  
   348  	for _, test := range tests {
   349  		t.Run(fmt.Sprintf("filemd5(%#v)", test.Path), func(t *testing.T) {
   350  			got, err := fileMD5.Call([]cty.Value{test.Path})
   351  
   352  			if test.Err {
   353  				if err == nil {
   354  					t.Fatal("succeeded; want error")
   355  				}
   356  				return
   357  			} else if err != nil {
   358  				t.Fatalf("unexpected error: %s", err)
   359  			}
   360  
   361  			if !got.RawEquals(test.Want) {
   362  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   363  			}
   364  		})
   365  	}
   366  }
   367  
   368  func TestRsaDecrypt(t *testing.T) {
   369  	tests := []struct {
   370  		Ciphertext cty.Value
   371  		Privatekey cty.Value
   372  		Want       cty.Value
   373  		Err        string
   374  	}{
   375  		// Base-64 encoded cipher decrypts correctly
   376  		{
   377  			cty.StringVal(CipherBase64),
   378  			cty.StringVal(PrivateKey),
   379  			cty.StringVal("message"),
   380  			"",
   381  		},
   382  		// OpenSSH key format
   383  		{
   384  			cty.StringVal(CipherBase64),
   385  			cty.StringVal(OpenSSHPrivateKey),
   386  			cty.StringVal("message"),
   387  			"",
   388  		},
   389  		// Wrong key
   390  		{
   391  			cty.StringVal(CipherBase64),
   392  			cty.StringVal(WrongPrivateKey),
   393  			cty.UnknownVal(cty.String),
   394  			"failed to decrypt: crypto/rsa: decryption error",
   395  		},
   396  		// Bad key
   397  		{
   398  			cty.StringVal(CipherBase64),
   399  			cty.StringVal(BadPrivateKey),
   400  			cty.UnknownVal(cty.String),
   401  			"invalid ASN1 data in the given private key: data truncated",
   402  		},
   403  		// Empty key
   404  		{
   405  			cty.StringVal(CipherBase64),
   406  			cty.StringVal(""),
   407  			cty.UnknownVal(cty.String),
   408  			"invalid private key: ssh: no key found",
   409  		},
   410  		// Bad ciphertext
   411  		{
   412  			cty.StringVal("bad"),
   413  			cty.StringVal(PrivateKey),
   414  			cty.UnknownVal(cty.String),
   415  			`failed to decode input "bad": cipher text must be base64-encoded`,
   416  		},
   417  		// Empty ciphertext
   418  		{
   419  			cty.StringVal(""),
   420  			cty.StringVal(PrivateKey),
   421  			cty.UnknownVal(cty.String),
   422  			"failed to decrypt: crypto/rsa: decryption error",
   423  		},
   424  	}
   425  	for _, test := range tests {
   426  		t.Run(fmt.Sprintf("RsaDecrypt(%#v, %#v)", test.Ciphertext, test.Privatekey), func(t *testing.T) {
   427  			got, err := RsaDecrypt(test.Ciphertext, test.Privatekey)
   428  
   429  			if test.Err != "" {
   430  				if err == nil {
   431  					t.Fatal("succeeded; want error")
   432  				} else if err.Error() != test.Err {
   433  					t.Fatalf("wrong error\ngot:  %s\nwant: %s", err.Error(), test.Err)
   434  				}
   435  				return
   436  			} else if err != nil {
   437  				t.Fatalf("unexpected error: %s", err)
   438  			}
   439  
   440  			if !got.RawEquals(test.Want) {
   441  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   442  			}
   443  		})
   444  	}
   445  }
   446  
   447  func TestSha1(t *testing.T) {
   448  	tests := []struct {
   449  		String cty.Value
   450  		Want   cty.Value
   451  		Err    bool
   452  	}{
   453  		{
   454  			cty.StringVal("test"),
   455  			cty.StringVal("a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"),
   456  			false,
   457  		},
   458  	}
   459  
   460  	for _, test := range tests {
   461  		t.Run(fmt.Sprintf("sha1(%#v)", test.String), func(t *testing.T) {
   462  			got, err := Sha1(test.String)
   463  
   464  			if test.Err {
   465  				if err == nil {
   466  					t.Fatal("succeeded; want error")
   467  				}
   468  				return
   469  			} else if err != nil {
   470  				t.Fatalf("unexpected error: %s", err)
   471  			}
   472  
   473  			if !got.RawEquals(test.Want) {
   474  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   475  			}
   476  		})
   477  	}
   478  }
   479  
   480  func TestFileSHA1(t *testing.T) {
   481  	tests := []struct {
   482  		Path cty.Value
   483  		Want cty.Value
   484  		Err  bool
   485  	}{
   486  		{
   487  			cty.StringVal("testdata/hello.txt"),
   488  			cty.StringVal("0a4d55a8d778e5022fab701977c5d840bbc486d0"),
   489  			false,
   490  		},
   491  		{
   492  			cty.StringVal("testdata/icon.png"),
   493  			cty.StringVal("2821bcc8379e1bd6f4f31b1e6a1fbb204b4a8be8"),
   494  			false,
   495  		},
   496  		{
   497  			cty.StringVal("testdata/missing"),
   498  			cty.NilVal,
   499  			true, // no file exists
   500  		},
   501  	}
   502  
   503  	fileSHA1 := MakeFileSha1Func(".")
   504  
   505  	for _, test := range tests {
   506  		t.Run(fmt.Sprintf("filesha1(%#v)", test.Path), func(t *testing.T) {
   507  			got, err := fileSHA1.Call([]cty.Value{test.Path})
   508  
   509  			if test.Err {
   510  				if err == nil {
   511  					t.Fatal("succeeded; want error")
   512  				}
   513  				return
   514  			} else if err != nil {
   515  				t.Fatalf("unexpected error: %s", err)
   516  			}
   517  
   518  			if !got.RawEquals(test.Want) {
   519  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   520  			}
   521  		})
   522  	}
   523  }
   524  
   525  func TestSha256(t *testing.T) {
   526  	tests := []struct {
   527  		String cty.Value
   528  		Want   cty.Value
   529  		Err    bool
   530  	}{
   531  		{
   532  			cty.StringVal("test"),
   533  			cty.StringVal("9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"),
   534  			false,
   535  		},
   536  	}
   537  
   538  	for _, test := range tests {
   539  		t.Run(fmt.Sprintf("sha256(%#v)", test.String), func(t *testing.T) {
   540  			got, err := Sha256(test.String)
   541  
   542  			if test.Err {
   543  				if err == nil {
   544  					t.Fatal("succeeded; want error")
   545  				}
   546  				return
   547  			} else if err != nil {
   548  				t.Fatalf("unexpected error: %s", err)
   549  			}
   550  
   551  			if !got.RawEquals(test.Want) {
   552  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   553  			}
   554  		})
   555  	}
   556  }
   557  
   558  func TestFileSHA256(t *testing.T) {
   559  	tests := []struct {
   560  		Path cty.Value
   561  		Want cty.Value
   562  		Err  bool
   563  	}{
   564  		{
   565  			cty.StringVal("testdata/hello.txt"),
   566  			cty.StringVal("a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e"),
   567  			false,
   568  		},
   569  		{
   570  			cty.StringVal("testdata/icon.png"),
   571  			cty.StringVal("e3b535abd2195b4f774a6033742f36d129299fcbc73ef73cb33b9dfd8ddece9a"),
   572  			false,
   573  		},
   574  		{
   575  			cty.StringVal("testdata/missing"),
   576  			cty.NilVal,
   577  			true, // no file exists
   578  		},
   579  	}
   580  
   581  	fileSHA256 := MakeFileSha256Func(".")
   582  
   583  	for _, test := range tests {
   584  		t.Run(fmt.Sprintf("filesha256(%#v)", test.Path), func(t *testing.T) {
   585  			got, err := fileSHA256.Call([]cty.Value{test.Path})
   586  
   587  			if test.Err {
   588  				if err == nil {
   589  					t.Fatal("succeeded; want error")
   590  				}
   591  				return
   592  			} else if err != nil {
   593  				t.Fatalf("unexpected error: %s", err)
   594  			}
   595  
   596  			if !got.RawEquals(test.Want) {
   597  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   598  			}
   599  		})
   600  	}
   601  }
   602  
   603  func TestSha512(t *testing.T) {
   604  	tests := []struct {
   605  		String cty.Value
   606  		Want   cty.Value
   607  		Err    bool
   608  	}{
   609  		{
   610  			cty.StringVal("test"),
   611  			cty.StringVal("ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff"),
   612  			false,
   613  		},
   614  	}
   615  
   616  	for _, test := range tests {
   617  		t.Run(fmt.Sprintf("sha512(%#v)", test.String), func(t *testing.T) {
   618  			got, err := Sha512(test.String)
   619  
   620  			if test.Err {
   621  				if err == nil {
   622  					t.Fatal("succeeded; want error")
   623  				}
   624  				return
   625  			} else if err != nil {
   626  				t.Fatalf("unexpected error: %s", err)
   627  			}
   628  
   629  			if !got.RawEquals(test.Want) {
   630  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   631  			}
   632  		})
   633  	}
   634  }
   635  
   636  func TestFileSHA512(t *testing.T) {
   637  	tests := []struct {
   638  		Path cty.Value
   639  		Want cty.Value
   640  		Err  bool
   641  	}{
   642  		{
   643  			cty.StringVal("testdata/hello.txt"),
   644  			cty.StringVal("2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b"),
   645  			false,
   646  		},
   647  		{
   648  			cty.StringVal("testdata/icon.png"),
   649  			cty.StringVal("c122273bfb4a10e68b182018da1ffb82d2d6329cf22c9d228c587de494e962b3f35d0620be201d2fd660a43f4402d7bc3a7f9daef845be3205b1f414c316cd3d"),
   650  			false,
   651  		},
   652  		{
   653  			cty.StringVal("testdata/missing"),
   654  			cty.NilVal,
   655  			true, // no file exists
   656  		},
   657  	}
   658  
   659  	fileSHA512 := MakeFileSha512Func(".")
   660  
   661  	for _, test := range tests {
   662  		t.Run(fmt.Sprintf("filesha512(%#v)", test.Path), func(t *testing.T) {
   663  			got, err := fileSHA512.Call([]cty.Value{test.Path})
   664  
   665  			if test.Err {
   666  				if err == nil {
   667  					t.Fatal("succeeded; want error")
   668  				}
   669  				return
   670  			} else if err != nil {
   671  				t.Fatalf("unexpected error: %s", err)
   672  			}
   673  
   674  			if !got.RawEquals(test.Want) {
   675  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   676  			}
   677  		})
   678  	}
   679  }
   680  
   681  const (
   682  	CipherBase64 = "eczGaDhXDbOFRZGhjx2etVzWbRqWDlmq0bvNt284JHVbwCgObiuyX9uV0LSAMY707IEgMkExJqXmsB4OWKxvB7epRB9G/3+F+pcrQpODlDuL9oDUAsa65zEpYF0Wbn7Oh7nrMQncyUPpyr9WUlALl0gRWytOA23S+y5joa4M34KFpawFgoqTu/2EEH4Xl1zo+0fy73fEto+nfkUY+meuyGZ1nUx/+DljP7ZqxHBFSlLODmtuTMdswUbHbXbWneW51D7Jm7xB8nSdiA2JQNK5+Sg5x8aNfgvFTt/m2w2+qpsyFa5Wjeu6fZmXSl840CA07aXbk9vN4I81WmJyblD/ZA=="
   683  	PrivateKey   = `
   684  -----BEGIN RSA PRIVATE KEY-----
   685  MIIEowIBAAKCAQEAgUElV5mwqkloIrM8ZNZ72gSCcnSJt7+/Usa5G+D15YQUAdf9
   686  c1zEekTfHgDP+04nw/uFNFaE5v1RbHaPxhZYVg5ZErNCa/hzn+x10xzcepeS3KPV
   687  Xcxae4MR0BEegvqZqJzN9loXsNL/c3H/B+2Gle3hTxjlWFb3F5qLgR+4Mf4ruhER
   688  1v6eHQa/nchi03MBpT4UeJ7MrL92hTJYLdpSyCqmr8yjxkKJDVC2uRrr+sTSxfh7
   689  r6v24u/vp/QTmBIAlNPgadVAZw17iNNb7vjV7Gwl/5gHXonCUKURaV++dBNLrHIZ
   690  pqcAM8wHRph8mD1EfL9hsz77pHewxolBATV+7QIDAQABAoIBAC1rK+kFW3vrAYm3
   691  +8/fQnQQw5nec4o6+crng6JVQXLeH32qXShNf8kLLG/Jj0vaYcTPPDZw9JCKkTMQ
   692  0mKj9XR/5DLbBMsV6eNXXuvJJ3x4iKW5eD9WkLD4FKlNarBRyO7j8sfPTqXW7uat
   693  NxWdFH7YsSRvNh/9pyQHLWA5OituidMrYbc3EUx8B1GPNyJ9W8Q8znNYLfwYOjU4
   694  Wv1SLE6qGQQH9Q0WzA2WUf8jklCYyMYTIywAjGb8kbAJlKhmj2t2Igjmqtwt1PYc
   695  pGlqbtQBDUiWXt5S4YX/1maIQ/49yeNUajjpbJiH3DbhJbHwFTzP3pZ9P9GHOzlG
   696  kYR+wSECgYEAw/Xida8kSv8n86V3qSY/I+fYQ5V+jDtXIE+JhRnS8xzbOzz3v0WS
   697  Oo5H+o4nJx5eL3Ghb3Gcm0Jn46dHrxinHbm+3RjXv/X6tlbxIYjRSQfHOTSMCTvd
   698  qcliF5vC6RCLXuc7R+IWR1Ky6eDEZGtrvt3DyeYABsp9fRUFR/6NluUCgYEAqNsw
   699  1aSl7WJa27F0DoJdlU9LWerpXcazlJcIdOz/S9QDmSK3RDQTdqfTxRmrxiYI9LEs
   700  mkOkvzlnnOBMpnZ3ZOU5qIRfprecRIi37KDAOHWGnlC0EWGgl46YLb7/jXiWf0AG
   701  Y+DfJJNd9i6TbIDWu8254/erAS6bKMhW/3q7f2kCgYAZ7Id/BiKJAWRpqTRBXlvw
   702  BhXoKvjI2HjYP21z/EyZ+PFPzur/lNaZhIUlMnUfibbwE9pFggQzzf8scM7c7Sf+
   703  mLoVSdoQ/Rujz7CqvQzi2nKSsM7t0curUIb3lJWee5/UeEaxZcmIufoNUrzohAWH
   704  BJOIPDM4ssUTLRq7wYM9uQKBgHCBau5OP8gE6mjKuXsZXWUoahpFLKwwwmJUp2vQ
   705  pOFPJ/6WZOlqkTVT6QPAcPUbTohKrF80hsZqZyDdSfT3peFx4ZLocBrS56m6NmHR
   706  UYHMvJ8rQm76T1fryHVidz85g3zRmfBeWg8yqT5oFg4LYgfLsPm1gRjOhs8LfPvI
   707  OLlRAoGBAIZ5Uv4Z3s8O7WKXXUe/lq6j7vfiVkR1NW/Z/WLKXZpnmvJ7FgxN4e56
   708  RXT7GwNQHIY8eDjDnsHxzrxd+raOxOZeKcMHj3XyjCX3NHfTscnsBPAGYpY/Wxzh
   709  T8UYnFu6RzkixElTf2rseEav7rkdKkI3LAeIZy7B0HulKKsmqVQ7
   710  -----END RSA PRIVATE KEY-----
   711  `
   712  	OpenSSHPrivateKey = `
   713  -----BEGIN OPENSSH PRIVATE KEY-----
   714  b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
   715  NhAAAAAwEAAQAAAQEAgUElV5mwqkloIrM8ZNZ72gSCcnSJt7+/Usa5G+D15YQUAdf9c1zE
   716  ekTfHgDP+04nw/uFNFaE5v1RbHaPxhZYVg5ZErNCa/hzn+x10xzcepeS3KPVXcxae4MR0B
   717  EegvqZqJzN9loXsNL/c3H/B+2Gle3hTxjlWFb3F5qLgR+4Mf4ruhER1v6eHQa/nchi03MB
   718  pT4UeJ7MrL92hTJYLdpSyCqmr8yjxkKJDVC2uRrr+sTSxfh7r6v24u/vp/QTmBIAlNPgad
   719  VAZw17iNNb7vjV7Gwl/5gHXonCUKURaV++dBNLrHIZpqcAM8wHRph8mD1EfL9hsz77pHew
   720  xolBATV+7QAAA7jbhEFk24RBZAAAAAdzc2gtcnNhAAABAQCBQSVXmbCqSWgiszxk1nvaBI
   721  JydIm3v79Sxrkb4PXlhBQB1/1zXMR6RN8eAM/7TifD+4U0VoTm/VFsdo/GFlhWDlkSs0Jr
   722  +HOf7HXTHNx6l5Lco9VdzFp7gxHQER6C+pmonM32Whew0v9zcf8H7YaV7eFPGOVYVvcXmo
   723  uBH7gx/iu6ERHW/p4dBr+dyGLTcwGlPhR4nsysv3aFMlgt2lLIKqavzKPGQokNULa5Guv6
   724  xNLF+Huvq/bi7++n9BOYEgCU0+Bp1UBnDXuI01vu+NXsbCX/mAdeicJQpRFpX750E0usch
   725  mmpwAzzAdGmHyYPUR8v2GzPvukd7DGiUEBNX7tAAAAAwEAAQAAAQAtayvpBVt76wGJt/vP
   726  30J0EMOZ3nOKOvnK54OiVUFy3h99ql0oTX/JCyxvyY9L2mHEzzw2cPSQipEzENJio/V0f+
   727  Qy2wTLFenjV17rySd8eIiluXg/VpCw+BSpTWqwUcju4/LHz06l1u7mrTcVnRR+2LEkbzYf
   728  /ackBy1gOTorbonTK2G3NxFMfAdRjzcifVvEPM5zWC38GDo1OFr9UixOqhkEB/UNFswNll
   729  H/I5JQmMjGEyMsAIxm/JGwCZSoZo9rdiII5qrcLdT2HKRpam7UAQ1Ill7eUuGF/9ZmiEP+
   730  PcnjVGo46WyYh9w24SWx8BU8z96WfT/Rhzs5RpGEfsEhAAAAgQCGeVL+Gd7PDu1il11Hv5
   731  auo+734lZEdTVv2f1iyl2aZ5ryexYMTeHuekV0+xsDUByGPHg4w57B8c68Xfq2jsTmXinD
   732  B4918owl9zR307HJ7ATwBmKWP1sc4U/FGJxbukc5IsRJU39q7HhGr+65HSpCNywHiGcuwd
   733  B7pSirJqlUOwAAAIEAw/Xida8kSv8n86V3qSY/I+fYQ5V+jDtXIE+JhRnS8xzbOzz3v0WS
   734  Oo5H+o4nJx5eL3Ghb3Gcm0Jn46dHrxinHbm+3RjXv/X6tlbxIYjRSQfHOTSMCTvdqcliF5
   735  vC6RCLXuc7R+IWR1Ky6eDEZGtrvt3DyeYABsp9fRUFR/6NluUAAACBAKjbMNWkpe1iWtux
   736  dA6CXZVPS1nq6V3Gs5SXCHTs/0vUA5kit0Q0E3an08UZq8YmCPSxLJpDpL85Z5zgTKZ2d2
   737  TlOaiEX6a3nESIt+ygwDh1hp5QtBFhoJeOmC2+/414ln9ABmPg3ySTXfYuk2yA1rvNueP3
   738  qwEumyjIVv96u39pAAAAAAEC
   739  -----END OPENSSH PRIVATE KEY-----
   740  `
   741  	WrongPrivateKey = `
   742  -----BEGIN RSA PRIVATE KEY-----
   743  MIIEowIBAAKCAQEAlrCgnEVgmNKCq7KPc+zUU5IrxPu1ClMNJS7RTsTPEkbwe5SB
   744  p+6V6WtCbD/X/lDRRGbOENChh1Phulb7lViqgrdpHydgsrKoS5ah3DfSIxLFLE00
   745  9Yo4TCYwgw6+s59j16ZAFVinaQ9l6Kmrb2ll136hMrz8QKh+qw+onOLd38WFgm+W
   746  ZtUqSXf2LANzfzzy4OWFNyFqKaCAolSkPdTS9Nz+svtScvp002DQp8OdP1AgPO+l
   747  o5N3M38Fftapwg0pCtJ5Zq0NRWIXEonXiTEMA6zy3gEZVOmDxoIFUWnmrqlMJLFy
   748  5S6LDrHSdqJhCxDK6WRZj43X9j8spktk3eGhMwIDAQABAoIBAAem8ID/BOi9x+Tw
   749  LFi2rhGQWqimH4tmrEQ3HGnjlKBY+d1MrUjZ1MMFr1nP5CgF8pqGnfA8p/c3Sz8r
   750  K5tp5T6+EZiDZ2WrrOApxg5ox0MAsQKO6SGO40z6o3wEQ6rbbTaGOrraxaWQIpyu
   751  AQanU4Sd6ZGqByVBaS1GnklZO+shCHqw73b7g1cpLEmFzcYnKHYHlUUIsstMe8E1
   752  BaCY0CH7JbWBjcbiTnBVwIRZuu+EjGiQuhTilYL2OWqoMVg1WU0L2IFpR8lkf/2W
   753  SBx5J6xhwbBGASOpM+qidiN580GdPzGhWYSqKGroHEzBm6xPSmV1tadNA26WFG4p
   754  pthLiAECgYEA5BsPRpNYJAQLu5B0N7mj9eEp0HABVEgL/MpwiImjaKdAwp78HM64
   755  IuPvJxs7r+xESiIz4JyjR8zrQjYOCKJsARYkmNlEuAz0SkHabCw1BdEBwUhjUGVB
   756  efoERK6GxfAoNqmSDwsOvHFOtsmDIlbHmg7G2rUxNVpeou415BSB0B8CgYEAqR4J
   757  YHKk2Ibr9rU+rBU33TcdTGw0aAkFNAVeqM9j0haWuFXmV3RArgoy09lH+2Ha6z/g
   758  fTX2xSDAWV7QUlLOlBRIhurPAo2jO2yCrGHPZcWiugstrR2hTTInigaSnCmK3i7F
   759  6sYmL3S7K01IcVNxSlWvGijtClT92Cl2WUCTfG0CgYAiEjyk4QtQTd5mxLvnOu5X
   760  oqs5PBGmwiAwQRiv/EcRMbJFn7Oupd3xMDSflbzDmTnWDOfMy/jDl8MoH6TW+1PA
   761  kcsjnYhbKWwvz0hN0giVdtOZSDO1ZXpzOrn6fEsbM7T9/TQY1SD9WrtUKCNTNL0Z
   762  sM1ZC6lu+7GZCpW4HKwLJwKBgQCRT0yxQXBg1/UxwuO5ynV4rx2Oh76z0WRWIXMH
   763  S0MyxdP1SWGkrS/SGtM3cg/GcHtA/V6vV0nUcWK0p6IJyjrTw2XZ/zGluPuTWJYi
   764  9dvVT26Vunshrz7kbH7KuwEICy3V4IyQQHeY+QzFlR70uMS0IVFWAepCoWqHbIDT
   765  CYhwNQKBgGPcLXmjpGtkZvggl0aZr9LsvCTckllSCFSI861kivL/rijdNoCHGxZv
   766  dfDkLTLcz9Gk41rD9Gxn/3sqodnTAc3Z2PxFnzg1Q/u3+x6YAgBwI/g/jE2xutGW
   767  H7CurtMwALQ/n/6LUKFmjRZjqbKX9SO2QSaC3grd6sY9Tu+bZjLe
   768  -----END RSA PRIVATE KEY-----
   769  `
   770  	BadPrivateKey = `
   771  -----BEGIN RSA PRIVATE KEY-----
   772  MIIEowIBAAKCAQEAgUElV5mwqkloIrM8ZNZ72gSCcnSJt7+/Usa5G+D15YQUAdf9
   773  c1zEekTfHgDP+04nw/uFNFaE5v1RbHaPxhZYVg5ZErNCa/hzn+x10xzcepeS3KPV
   774  Xcxae4MR0BEegvqZqJzN9loXsNL/c3H/B+2Gle3hTxjlWFb3F5qLgR+4Mf4ruhER
   775  1v6eHQa/nchi03MBpT4UeJ7MrL92hTJYLdpSyCqmr8yjxkKJDVC2uRrr+sTSxfh7
   776  r6v24u/vp/QTmBIAlNPgadVAZw17iNNb7vjV7Gwl/5gHXonCUKURaV++dBNLrHIZ
   777  pqcAM8wHRph8mD1EfL9hsz77pHewxolBATV+7QIDAQABAoIBAC1rK+kFW3vrAYm3
   778  +8/fQnQQw5nec4o6+crng6JVQXLeH32qXShNf8kLLG/Jj0vaYcTPPDZw9JCKkTMQ
   779  0mKj9XR/5DLbBMsV6eNXXuvJJ3x4iKW5eD9WkLD4FKlNarBRyO7j8sfPTqXW7uat
   780  NxWdFH7YsSRvNh/9pyQHLWA5OituidMrYbc3EUx8B1GPNyJ9W8Q8znNYLfwYOjU4
   781  Wv1SLE6qGQQH9Q0WzA2WUf8jklCYyMYTIywAjGb8kbAJlKhmj2t2Igjmqtwt1PYc
   782  pGlqbtQBDUiWXt5S4YX/1maIQ/49yeNUajjpbJiH3DbhJbHwFTzP3pZ9P9GHOzlG
   783  kYR+wSECgYEAw/Xida8kSv8n86V3qSY/I+fYQ5V+jDtXIE+JhRnS8xzbOzz3v0WS
   784  Oo5H+o4nJx5eL3Ghb3Gcm0Jn46dHrxinHbm+3RjXv/X6tlbxIYjRSQfHOTSMCTvd
   785  qcliF5vC6RCLXuc7R+IWR1Ky6eDEZGtrvt3DyeYABsp9fRUFR/6NluUCgYEAqNsw
   786  1aSl7WJa27F0DoJdlU9LWerpXcazlJcIdOz/S9QDmSK3RDQTdqfTxRmrxiYI9LEs
   787  mkOkvzlnnOBMpnZ3ZOU5qIRfprecRIi37KDAOHWGnlC0EWGgl46YLb7/jXiWf0AG
   788  BhXoKvjI2HjYP21z/EyZ+PFPzur/lNaZhIUlMnUfibbwE9pFggQzzf8scM7c7Sf+
   789  mLoVSdoQ/Rujz7CqvQzi2nKSsM7t0curUIb3lJWee5/UeEaxZcmIufoNUrzohAWH
   790  BJOIPDM4ssUTLRq7wYM9uQKBgHCBau5OP8gE6mjKuXsZXWUoahpFLKwwwmJUp2vQ
   791  pOFPJ/6WZOlqkTVT6QPAcPUbTohKrF80hsZqZyDdSfT3peFx4ZLocBrS56m6NmHR
   792  UYHMvJ8rQm76T1fryHVidz85g3zRmfBeWg8yqT5oFg4LYgfLsPm1gRjOhs8LfPvI
   793  OLlRAoGBAIZ5Uv4Z3s8O7WKXXUe/lq6j7vfiVkR1NW/Z/WLKXZpnmvJ7FgxN4e56
   794  RXT7GwNQHIY8eDjDnsHxzrxd+raOxOZeKcMHj3XyjCX3NHfTscnsBPAGYpY/Wxzh
   795  T8UYnFu6RzkixElTf2rseEav7rkdKkI3LAeIZy7B0HulKKsmqVQ7
   796  -----END RSA PRIVATE KEY-----
   797  `
   798  )