(t *testing.T)
| 25 | ) |
| 26 | |
| 27 | func TestEncrypt(t *testing.T) { |
| 28 | // Test decrypt spreadsheet with incorrect password |
| 29 | _, err := OpenFile(filepath.Join("test", "encryptSHA1.xlsx"), Options{Password: "passwd"}) |
| 30 | assert.EqualError(t, err, ErrWorkbookPassword.Error()) |
| 31 | // Test decrypt spreadsheet with password |
| 32 | f, err := OpenFile(filepath.Join("test", "encryptSHA1.xlsx"), Options{Password: "password"}) |
| 33 | assert.NoError(t, err) |
| 34 | cell, err := f.GetCellValue("Sheet1", "A1") |
| 35 | assert.NoError(t, err) |
| 36 | assert.Equal(t, "SECRET", cell) |
| 37 | assert.NoError(t, f.Close()) |
| 38 | // Test decrypt spreadsheet with unsupported encrypt mechanism |
| 39 | raw, err := os.ReadFile(filepath.Join("test", "encryptAES.xlsx")) |
| 40 | assert.NoError(t, err) |
| 41 | raw[2050] = 3 |
| 42 | _, err = Decrypt(raw, &Options{Password: "password"}) |
| 43 | assert.Equal(t, ErrUnsupportedEncryptMechanism, err) |
| 44 | |
| 45 | // Test encrypt spreadsheet with invalid password |
| 46 | assert.EqualError(t, f.SaveAs(filepath.Join("test", "Encryption.xlsx"), Options{Password: strings.Repeat("*", MaxFieldLength+1)}), ErrPasswordLengthInvalid.Error()) |
| 47 | // Test encrypt spreadsheet with new password |
| 48 | assert.NoError(t, f.SaveAs(filepath.Join("test", "Encryption.xlsx"), Options{Password: "passwd"})) |
| 49 | assert.NoError(t, f.Close()) |
| 50 | f, err = OpenFile(filepath.Join("test", "Encryption.xlsx"), Options{Password: "passwd"}) |
| 51 | assert.NoError(t, err) |
| 52 | cell, err = f.GetCellValue("Sheet1", "A1") |
| 53 | assert.NoError(t, err) |
| 54 | assert.Equal(t, "SECRET", cell) |
| 55 | // Test remove password by save workbook with options |
| 56 | assert.NoError(t, f.Save(Options{Password: ""})) |
| 57 | assert.NoError(t, f.Close()) |
| 58 | |
| 59 | doc, err := mscfb.New(bytes.NewReader(raw)) |
| 60 | assert.NoError(t, err) |
| 61 | encryptionInfoBuf, encryptedPackageBuf, err := extractPart(doc) |
| 62 | assert.NoError(t, err) |
| 63 | binary.LittleEndian.PutUint64(encryptionInfoBuf[20:32], uint64(0)) |
| 64 | _, err = standardDecrypt(encryptionInfoBuf, encryptedPackageBuf, &Options{Password: "password"}) |
| 65 | assert.NoError(t, err) |
| 66 | _, err = decrypt(nil, nil, nil) |
| 67 | assert.EqualError(t, err, "crypto/aes: invalid key size 0") |
| 68 | _, err = agileDecrypt(encryptionInfoBuf, MacintoshCyrillicCharset, &Options{Password: "password"}) |
| 69 | assert.EqualError(t, err, "XML syntax error on line 1: invalid character entity &0 (no semicolon)") |
| 70 | _, err = convertPasswdToKey("password", nil, Encryption{ |
| 71 | KeyEncryptors: KeyEncryptors{KeyEncryptor: []KeyEncryptor{ |
| 72 | {EncryptedKey: EncryptedKey{KeyData: KeyData{SaltValue: "=="}}}, |
| 73 | }}, |
| 74 | }) |
| 75 | assert.EqualError(t, err, "illegal base64 data at input byte 0") |
| 76 | _, err = createIV([]byte{0}, Encryption{KeyData: KeyData{SaltValue: "=="}}) |
| 77 | assert.EqualError(t, err, "illegal base64 data at input byte 0") |
| 78 | // Test error handling for EncryptionInfo parse failure |
| 79 | compoundFile := &cfb{ |
| 80 | paths: []string{"Root Entry/"}, |
| 81 | sectors: []sector{{name: "Root Entry", typeID: 5}}, |
| 82 | } |
| 83 | compoundFile.put("EncryptionInfo", []byte{}) |
| 84 | _, err = OpenReader(bytes.NewReader(compoundFile.write())) |
nothing calls this directly
no test coverage detected