github.com/aavshr/aws-sdk-go@v1.41.3/service/s3/s3crypto/aes_cbc_test.go (about)

     1  package s3crypto
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/hex"
     6  	"fmt"
     7  	"io"
     8  	"testing"
     9  )
    10  
    11  func TestAESCBCEncryptDecrypt(t *testing.T) {
    12  	var testCases = []struct {
    13  		key        string
    14  		iv         string
    15  		plaintext  string
    16  		ciphertext string
    17  		decodeHex  bool
    18  		padder     Padder
    19  	}{
    20  		// Test vectors from RFC 3602: https://tools.ietf.org/html/rfc3602
    21  		{
    22  			"06a9214036b8a15b512e03d534120006",
    23  			"3dafba429d9eb430b422da802c9fac41",
    24  			"Single block msg",
    25  			"e353779c1079aeb82708942dbe77181a",
    26  			false,
    27  			NoPadder,
    28  		},
    29  		{
    30  			"c286696d887c9aa0611bbb3e2025a45a",
    31  			"562e17996d093d28ddb3ba695a2e6f58",
    32  			"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
    33  			"d296cd94c2cccf8a3a863028b5e1dc0a7586602d253cfff91b8266bea6d61ab1",
    34  			true,
    35  			NoPadder,
    36  		},
    37  		{
    38  			"6c3ea0477630ce21a2ce334aa746c2cd",
    39  			"c782dc4c098c66cbd9cd27d825682c81",
    40  			"This is a 48-byte message (exactly 3 AES blocks)",
    41  			"d0a02b3836451753d493665d33f0e8862dea54cdb293abc7506939276772f8d5021c19216bad525c8579695d83ba2684",
    42  			false,
    43  			NoPadder,
    44  		},
    45  		{
    46  			"56e47a38c5598974bc46903dba290349",
    47  			"8ce82eefbea0da3c44699ed7db51b7d9",
    48  			"a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf",
    49  			"c30e32ffedc0774e6aff6af0869f71aa0f3af07a9a31a9c684db207eb0ef8e4e35907aa632c3ffdf868bb7b29d3d46ad83ce9f9a102ee99d49a53e87f4c3da55",
    50  			true,
    51  			NoPadder,
    52  		},
    53  		{
    54  			"11111111111111111111111111111111",
    55  			"22222222222222222222222222222222",
    56  			"",
    57  			"B012949BA07D1A6DCE9DEE67274D41AB",
    58  			true,
    59  			AESCBCPadder,
    60  		},
    61  		{
    62  			"11111111111111111111111111111111",
    63  			"22222222222222222222222222222222",
    64  			"41",
    65  			"8A11ABA68A566132FFE04DB336621D41",
    66  			true,
    67  			AESCBCPadder,
    68  		},
    69  		{
    70  			"11111111111111111111111111111111",
    71  			"22222222222222222222222222222222",
    72  			"4141",
    73  			"97D0896E41DFDB5CEA4A9EB70A938CFD",
    74  			true,
    75  			AESCBCPadder,
    76  		},
    77  		{
    78  			"11111111111111111111111111111111",
    79  			"22222222222222222222222222222222",
    80  			"414141",
    81  			"8464EAD45FA2D8790E8741E32C28083F",
    82  			true,
    83  			AESCBCPadder,
    84  		},
    85  		{
    86  			"11111111111111111111111111111111",
    87  			"22222222222222222222222222222222",
    88  			"41414141",
    89  			"1E656D6E2745BA9F154FAF136B2BC73D",
    90  			true,
    91  			AESCBCPadder,
    92  		},
    93  		{
    94  			"11111111111111111111111111111111",
    95  			"22222222222222222222222222222222",
    96  			"4141414141",
    97  			"0B6031C4B230DAC6BD6D3F195645B287",
    98  			true,
    99  			AESCBCPadder,
   100  		},
   101  		{
   102  			"11111111111111111111111111111111",
   103  			"22222222222222222222222222222222",
   104  			"414141414141",
   105  			"5D09FEB6462BB489489A7E18FD341D9D",
   106  			true,
   107  			AESCBCPadder,
   108  		},
   109  		{
   110  			"11111111111111111111111111111111",
   111  			"22222222222222222222222222222222",
   112  			"41414141414141",
   113  			"85745E398F2FD1050C2CE8F8614DA369",
   114  			true,
   115  			AESCBCPadder,
   116  		},
   117  		{
   118  			"11111111111111111111111111111111",
   119  			"22222222222222222222222222222222",
   120  			"4141414141414141",
   121  			"7BE52933970BA7B0FC6FB3FC37648205",
   122  			true,
   123  			AESCBCPadder,
   124  		},
   125  		{
   126  			"11111111111111111111111111111111",
   127  			"22222222222222222222222222222222",
   128  			"414141414141414141",
   129  			"ED3A1E134EF36CCFE60C8123B4272F89",
   130  			true,
   131  			AESCBCPadder,
   132  		},
   133  		{
   134  			"11111111111111111111111111111111",
   135  			"22222222222222222222222222222222",
   136  			"41414141414141414141",
   137  			"C3B7C9E177E1052FC736F65FC1E74209",
   138  			true,
   139  			AESCBCPadder,
   140  		},
   141  		{
   142  			"11111111111111111111111111111111",
   143  			"22222222222222222222222222222222",
   144  			"4141414141414141414141",
   145  			"C3A8B53F7F57F0B9D346FA99810A3C28",
   146  			true,
   147  			AESCBCPadder,
   148  		},
   149  		{
   150  			"11111111111111111111111111111111",
   151  			"22222222222222222222222222222222",
   152  			"414141414141414141414141",
   153  			"D16B1ECE5BF00AF919E139E99775FF06",
   154  			true,
   155  			AESCBCPadder,
   156  		},
   157  		{
   158  			"11111111111111111111111111111111",
   159  			"22222222222222222222222222222222",
   160  			"41414141414141414141414141",
   161  			"B258F4DF57FFCA1EFCF8D76140F05139",
   162  			true,
   163  			AESCBCPadder,
   164  		},
   165  		{
   166  			"11111111111111111111111111111111",
   167  			"22222222222222222222222222222222",
   168  			"4141414141414141414141414141",
   169  			"3CD2282DE24A2CF9E23326CC3DC9077A",
   170  			true,
   171  			AESCBCPadder,
   172  		},
   173  		{
   174  			"11111111111111111111111111111111",
   175  			"22222222222222222222222222222222",
   176  			"414141414141414141414141414141",
   177  			"3010232E7C752A3B4C9EE428B4C4FE88",
   178  			true,
   179  			AESCBCPadder,
   180  		},
   181  		{
   182  			"11111111111111111111111111111111",
   183  			"22222222222222222222222222222222",
   184  			"41414141414141414141414141414141",
   185  			"C3304FA46097CBBA59085416764A217A22BC4E6D03BFD2418DD412D1ED1B31AF",
   186  			true,
   187  			AESCBCPadder,
   188  		},
   189  		{
   190  			"11111111111111111111111111111111",
   191  			"22222222222222222222222222222222",
   192  			"4141414141414141414141414141414141",
   193  			"C3304FA46097CBBA59085416764A217A5427BBD4A4D50776989441370E3B5B16",
   194  			true,
   195  			AESCBCPadder,
   196  		},
   197  		{
   198  			"11111111111111111111111111111111",
   199  			"22222222222222222222222222222222",
   200  			"414141414141414141414141414141414141",
   201  			"C3304FA46097CBBA59085416764A217A7FF985F55567D1B25EA40E23BB4CB1FE",
   202  			true,
   203  			AESCBCPadder,
   204  		},
   205  		{
   206  			"11111111111111111111111111111111",
   207  			"22222222222222222222222222222222",
   208  			"41414141414141414141414141414141414141",
   209  			"C3304FA46097CBBA59085416764A217A0835E548C7370D8F8D9925C0E6B54727",
   210  			true,
   211  			AESCBCPadder,
   212  		},
   213  		{
   214  			"11111111111111111111111111111111",
   215  			"22222222222222222222222222222222",
   216  			"4141414141414141414141414141414141414141",
   217  			"C3304FA46097CBBA59085416764A217ADC0CF1436399E67BC1122B31CB596649",
   218  			true,
   219  			AESCBCPadder,
   220  		},
   221  		{
   222  			"11111111111111111111111111111111",
   223  			"22222222222222222222222222222222",
   224  			"414141414141414141414141414141414141414141",
   225  			"C3304FA46097CBBA59085416764A217A3D096F0DEAFF91938B82E5D404B0B065",
   226  			true,
   227  			AESCBCPadder,
   228  		},
   229  		{
   230  			"11111111111111111111111111111111",
   231  			"22222222222222222222222222222222",
   232  			"41414141414141414141414141414141414141414141",
   233  			"C3304FA46097CBBA59085416764A217AD56ABA897A355CF307CCB74226243192",
   234  			true,
   235  			AESCBCPadder,
   236  		},
   237  		{
   238  			"11111111111111111111111111111111",
   239  			"22222222222222222222222222222222",
   240  			"4141414141414141414141414141414141414141414141",
   241  			"C3304FA46097CBBA59085416764A217A151284F950B1B1DBCAD6D9E7900DF4E6",
   242  			true,
   243  			AESCBCPadder,
   244  		},
   245  		{
   246  			"11111111111111111111111111111111",
   247  			"22222222222222222222222222222222",
   248  			"414141414141414141414141414141414141414141414141",
   249  			"C3304FA46097CBBA59085416764A217AEF85A612514121C299A1D87116C4A182",
   250  			true,
   251  			AESCBCPadder,
   252  		},
   253  		{
   254  			"11111111111111111111111111111111",
   255  			"22222222222222222222222222222222",
   256  			"41414141414141414141414141414141414141414141414141",
   257  			"C3304FA46097CBBA59085416764A217A67F157569BFB4013EA3AD16DB8C69AD6",
   258  			true,
   259  			AESCBCPadder,
   260  		},
   261  		{
   262  			"11111111111111111111111111111111",
   263  			"22222222222222222222222222222222",
   264  			"4141414141414141414141414141414141414141414141414141",
   265  			"C3304FA46097CBBA59085416764A217AF8520D191F6ACBD88B2140588B91C697",
   266  			true,
   267  			AESCBCPadder,
   268  		},
   269  		{
   270  			"11111111111111111111111111111111",
   271  			"22222222222222222222222222222222",
   272  			"414141414141414141414141414141414141414141414141414141",
   273  			"C3304FA46097CBBA59085416764A217ADD8BBAA71745669B96F2683E2F5AEC35",
   274  			true,
   275  			AESCBCPadder,
   276  		},
   277  		{
   278  			"11111111111111111111111111111111",
   279  			"22222222222222222222222222222222",
   280  			"41414141414141414141414141414141414141414141414141414141",
   281  			"C3304FA46097CBBA59085416764A217AFB2D4282817D7EC6B33EFAD7AA14A3C5",
   282  			true,
   283  			AESCBCPadder,
   284  		},
   285  		{
   286  			"11111111111111111111111111111111",
   287  			"22222222222222222222222222222222",
   288  			"4141414141414141414141414141414141414141414141414141414141",
   289  			"C3304FA46097CBBA59085416764A217A459B89E7E0DAF3DA654576B60B2DA7CE",
   290  			true,
   291  			AESCBCPadder,
   292  		},
   293  		{
   294  			"11111111111111111111111111111111",
   295  			"22222222222222222222222222222222",
   296  			"414141414141414141414141414141414141414141414141414141414141",
   297  			"C3304FA46097CBBA59085416764A217A65759F23F9789D05B23D5DBAA9E32036",
   298  			true,
   299  			AESCBCPadder,
   300  		},
   301  		{
   302  			"11111111111111111111111111111111",
   303  			"22222222222222222222222222222222",
   304  			"41414141414141414141414141414141414141414141414141414141414141",
   305  			"C3304FA46097CBBA59085416764A217A03C78FBD5E2CB08B3B6D181E23FBDE79",
   306  			true,
   307  			AESCBCPadder,
   308  		},
   309  		{
   310  			"11111111111111111111111111111111",
   311  			"22222222222222222222222222222222",
   312  			"4141414141414141414141414141414141414141414141414141414141414141",
   313  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA013D941FBBDE56C106C482CD022F290F",
   314  			true,
   315  			AESCBCPadder,
   316  		},
   317  		{
   318  			"11111111111111111111111111111111",
   319  			"22222222222222222222222222222222",
   320  			"414141414141414141414141414141414141414141414141414141414141414141",
   321  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA0645D313AC3C29B79DB1AA2E00A5B393",
   322  			true,
   323  			AESCBCPadder,
   324  		},
   325  		{
   326  			"11111111111111111111111111111111",
   327  			"22222222222222222222222222222222",
   328  			"41414141414141414141414141414141414141414141414141414141414141414141",
   329  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA2ED0FD8048053BF22EBE501D82C4B3F1",
   330  			true,
   331  			AESCBCPadder,
   332  		},
   333  		{
   334  			"11111111111111111111111111111111",
   335  			"22222222222222222222222222222222",
   336  			"4141414141414141414141414141414141414141414141414141414141414141414141",
   337  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CAC57D706C7866A01D6E913F98AE57EE54",
   338  			true,
   339  			AESCBCPadder,
   340  		},
   341  		{
   342  			"11111111111111111111111111111111",
   343  			"22222222222222222222222222222222",
   344  			"414141414141414141414141414141414141414141414141414141414141414141414141",
   345  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CAB7FC1241FAFDFE45C4FF982D5DC1DAEF",
   346  			true,
   347  			AESCBCPadder,
   348  		},
   349  		{
   350  			"11111111111111111111111111111111",
   351  			"22222222222222222222222222222222",
   352  			"41414141414141414141414141414141414141414141414141414141414141414141414141",
   353  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA7063EA296922DE8BDFD3B29D786C5F91",
   354  			true,
   355  			AESCBCPadder,
   356  		},
   357  		{
   358  			"11111111111111111111111111111111",
   359  			"22222222222222222222222222222222",
   360  			"4141414141414141414141414141414141414141414141414141414141414141414141414141",
   361  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA3A4603475F4AFDBFADC6E7FA908188B1",
   362  			true,
   363  			AESCBCPadder,
   364  		},
   365  		{
   366  			"11111111111111111111111111111111",
   367  			"22222222222222222222222222222222",
   368  			"414141414141414141414141414141414141414141414141414141414141414141414141414141",
   369  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA3365C63C2AF2A6C8FB4D0E9ED3C6FDA3",
   370  			true,
   371  			AESCBCPadder,
   372  		},
   373  		{
   374  			"11111111111111111111111111111111",
   375  			"22222222222222222222222222222222",
   376  			"41414141414141414141414141414141414141414141414141414141414141414141414141414141",
   377  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA78BCC1874C0B7EB52645FC8F03B9C9CF",
   378  			true,
   379  			AESCBCPadder,
   380  		},
   381  		{
   382  			"11111111111111111111111111111111",
   383  			"22222222222222222222222222222222",
   384  			"4141414141414141414141414141414141414141414141414141414141414141414141414141414141",
   385  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA9B7A31397718EECB89B9E9CCCD729326",
   386  			true,
   387  			AESCBCPadder,
   388  		},
   389  		{
   390  			"11111111111111111111111111111111",
   391  			"22222222222222222222222222222222",
   392  			"414141414141414141414141414141414141414141414141414141414141414141414141414141414141",
   393  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CAB15EA8A67E9E9FADB4249710277F3D4F",
   394  			true,
   395  			AESCBCPadder,
   396  		},
   397  		{
   398  			"11111111111111111111111111111111",
   399  			"22222222222222222222222222222222",
   400  			"41414141414141414141414141414141414141414141414141414141414141414141414141414141414141",
   401  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA94641D6A076193C660632CEA3F9CB02C",
   402  			true,
   403  			AESCBCPadder,
   404  		},
   405  		{
   406  			"11111111111111111111111111111111",
   407  			"22222222222222222222222222222222",
   408  			"4141414141414141414141414141414141414141414141414141414141414141414141414141414141414141",
   409  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CAB2170A08417BE77F0EAA9110F4790E12",
   410  			true,
   411  			AESCBCPadder,
   412  		},
   413  		{
   414  			"11111111111111111111111111111111",
   415  			"22222222222222222222222222222222",
   416  			"414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141",
   417  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA4E30F1CD7B2256ABD57DC3DAB05376C9",
   418  			true,
   419  			AESCBCPadder,
   420  		},
   421  		{
   422  			"11111111111111111111111111111111",
   423  			"22222222222222222222222222222222",
   424  			"41414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141",
   425  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA9909B7B93D01BDAAC22D15AF34DF1EEF",
   426  			true,
   427  			AESCBCPadder,
   428  		},
   429  		{
   430  			"11111111111111111111111111111111",
   431  			"22222222222222222222222222222222",
   432  			"4141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141",
   433  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CAD97F5D1206F00E5C7225CAD81CCD4027",
   434  			true,
   435  			AESCBCPadder,
   436  		},
   437  		{
   438  			"11111111111111111111111111111111",
   439  			"22222222222222222222222222222222",
   440  			"414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141",
   441  			"C3304FA46097CBBA59085416764A217ACEF79EE1163A2F52888F87A3979EB3CA570CBB001A0C87558906B60C884AB5F41DA97CEF2A9401BC6DD0D22A54DBAD6D",
   442  			true,
   443  			AESCBCPadder,
   444  		},
   445  	}
   446  
   447  	for i, testCase := range testCases {
   448  		key, _ := hex.DecodeString(testCase.key)
   449  		iv, _ := hex.DecodeString(testCase.iv)
   450  		cd := CipherData{
   451  			Key: key,
   452  			IV:  iv,
   453  		}
   454  
   455  		cbc, err := newAESCBC(cd, testCase.padder)
   456  		if err != nil {
   457  			t.Fatal(fmt.Sprintf("Case %d: Expected no error for cipher creation, but received: %v", i, err.Error()))
   458  		}
   459  
   460  		plaintext := []byte(testCase.plaintext)
   461  		if testCase.decodeHex {
   462  			plaintext, _ = hex.DecodeString(testCase.plaintext)
   463  		}
   464  
   465  		cipherdata := cbc.Encrypt(bytes.NewReader(plaintext))
   466  		ciphertext := []byte{}
   467  		b := make([]byte, 19)
   468  		err = nil
   469  		n := 0
   470  		for err != io.EOF {
   471  			n, err = cipherdata.Read(b)
   472  			ciphertext = append(ciphertext, b[:n]...)
   473  		}
   474  
   475  		if err != io.EOF {
   476  			t.Fatal(fmt.Sprintf("Case %d: Expected no error during io reading, but received: %v", i, err.Error()))
   477  		}
   478  
   479  		expectedData, _ := hex.DecodeString(testCase.ciphertext)
   480  		if bytes.Compare(expectedData, ciphertext) != 0 {
   481  			t.Log("\n", ciphertext, "\n", expectedData)
   482  			t.Fatal(fmt.Sprintf("Case %d: AES CBC encryption fails. Data is not the same", i))
   483  		}
   484  
   485  		plaindata := cbc.Decrypt(bytes.NewReader(ciphertext))
   486  		plaintextDecrypted := []byte{}
   487  		err = nil
   488  		for err != io.EOF {
   489  			n, err = plaindata.Read(b)
   490  			plaintextDecrypted = append(plaintextDecrypted, b[:n]...)
   491  		}
   492  		if err != io.EOF {
   493  			t.Fatal(fmt.Sprintf("Case %d: Expected no error during io reading, but received: %v", i, err.Error()))
   494  		}
   495  
   496  		if bytes.Compare(plaintext, plaintextDecrypted) != 0 {
   497  			t.Log("\n", plaintext, "\n", plaintextDecrypted)
   498  			t.Fatal(fmt.Sprintf("Case %d: AES CBC decryption fails. Data is not the same", i))
   499  		}
   500  	}
   501  }