Hi,
I'm trying to upgrade poi-ooxml version 3.17. I encountered an error:
"java.io.IOException: javax.crypto.BadPaddingException: Given final block
not properly padded. Such issues can arise if a bad key is used during
decryption." I have tried to upgrade to all possible versions starting from
4.0.0, also versions 5.0.0 and 5.2.2 without success. All versions above
4.0.0 causes same error. The code we use has not changed, it has been
working properly with version 3.17 and below. Below is the code we use. The
failure happens at "val opc = OPCPackage.open(tempData.getInputStream)". I
have commented out all data writing to see that this is not data related.
def writeExcel(workbookSettings: WorkbookSettings, sheets: Seq[Sheet],
out: OutputStream): Unit = {
val wb = if (workbookSettings.password.isEmpty) new SXSSFWorkbook else
new SXSSFWorkbookWithCustomZipEntrySource
try {
val coreProps = wb.getXSSFWorkbook.getProperties.getCoreProperties
coreProps.setTitle(workbookSettings.title)
coreProps.setCreator("Koski")
// sheets.foreach { sheet =>
// val sh = createSheet(sheet, wb)
// sheet match {
// case ds: SheetWithColumnSettings => writeDataSheet(wb, sh, ds)
// case ds: DocumentationSheet => writeDocumentationSheet(wb, sh,
ds)
// }
// }
if (workbookSettings.password.isEmpty) {
wb.write(out)
} else {
// based on
https://github.com/apache/poi/blob/f509d1deae86866ed531f10f2eba7db17e098473/src/examples/src/org/apache/poi/xssf/streaming/examples/SavePasswordProtectedXlsx.java
val tempData = new EncryptedTempData
try {
wb.write(tempData.getOutputStream)
* val opc = OPCPackage.open(tempData.getInputStream) //FAILURE
HAPPENS HERE*
val fs = new POIFSFileSystem
val enc = Encryptor.getInstance(new
EncryptionInfo(EncryptionMode.agile))
enc.confirmPassword(workbookSettings.password.get)
opc.save(enc.getDataStream(fs))
fs.writeFilesystem(out)
} finally {
tempData.dispose()
}
}
out.close()
} finally {
// deletes temporary files from disk
wb.dispose()
}
}
To see the whole code you can checkout our public repository and the file
above:
https://github.com/Opetushallitus/koski/blob/snyk-fix-892cc871099e9787cbc96ed1b5c58ba4/src/main/scala/fi/oph/koski/raportit/ExcelWriter.scala
And the branch is here including the code change I made to try to simplify
the error: https://github.com/Opetushallitus/koski/pull/1100
The error can be reproduced with the test found in here:
https://github.com/Opetushallitus/koski/blob/snyk-fix-892cc871099e9787cbc96ed1b5c58ba4/src/test/scala/fi/oph/koski/raportit/ExcelWriterSpec.scala
The full stacktrace of the error is:
An unexpected java.io.IOException was thrown.
ScalaTestFailureLocation: org.scalatest.matchers.MatchersHelper$ at
(ExcelWriterSpec.scala:21)
org.scalatest.exceptions.TestFailedException: An unexpected
java.io.IOException was thrown.
at
org.scalatest.matchers.MatchersHelper$.indicateFailure(MatchersHelper.scala:402)
at
org.scalatest.matchers.dsl.NoExceptionWord.shouldBe(NoExceptionWord.scala:58)
at
fi.oph.koski.raportit.ExcelWriterSpec.$anonfun$new$2(ExcelWriterSpec.scala:22)
at org.scalatest.OutcomeOf.outcomeOf(OutcomeOf.scala:85)
at org.scalatest.OutcomeOf.outcomeOf$(OutcomeOf.scala:83)
at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
at org.scalatest.Transformer.apply(Transformer.scala:22)
at org.scalatest.Transformer.apply(Transformer.scala:20)
at
org.scalatest.freespec.AnyFreeSpecLike$$anon$1.apply(AnyFreeSpecLike.scala:430)
at org.scalatest.TestSuite.withFixture(TestSuite.scala:196)
at org.scalatest.TestSuite.withFixture$(TestSuite.scala:195)
at org.scalatest.freespec.AnyFreeSpec.withFixture(AnyFreeSpec.scala:1739)
at
org.scalatest.freespec.AnyFreeSpecLike.invokeWithFixture$1(AnyFreeSpecLike.scala:428)
at
org.scalatest.freespec.AnyFreeSpecLike.$anonfun$runTest$1(AnyFreeSpecLike.scala:440)
at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
at org.scalatest.freespec.AnyFreeSpecLike.runTest(AnyFreeSpecLike.scala:440)
at
org.scalatest.freespec.AnyFreeSpecLike.runTest$(AnyFreeSpecLike.scala:422)
at org.scalatest.freespec.AnyFreeSpec.runTest(AnyFreeSpec.scala:1739)
at
org.scalatest.freespec.AnyFreeSpecLike.$anonfun$runTests$1(AnyFreeSpecLike.scala:499)
at org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Engine.scala:413)
at scala.collection.immutable.List.foreach(List.scala:431)
at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
at org.scalatest.SuperEngine.runTestsInBranch(Engine.scala:390)
at org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Engine.scala:427)
at scala.collection.immutable.List.foreach(List.scala:431)
at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
at org.scalatest.SuperEngine.runTestsInBranch(Engine.scala:396)
at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:475)
at
org.scalatest.freespec.AnyFreeSpecLike.runTests(AnyFreeSpecLike.scala:499)
at
org.scalatest.freespec.AnyFreeSpecLike.runTests$(AnyFreeSpecLike.scala:498)
at org.scalatest.freespec.AnyFreeSpec.runTests(AnyFreeSpec.scala:1739)
at org.scalatest.Suite.run(Suite.scala:1112)
at org.scalatest.Suite.run$(Suite.scala:1094)
at org.scalatest.freespec.AnyFreeSpec.org
$scalatest$freespec$AnyFreeSpecLike$$super$run(AnyFreeSpec.scala:1739)
at
org.scalatest.freespec.AnyFreeSpecLike.$anonfun$run$1(AnyFreeSpecLike.scala:543)
at org.scalatest.SuperEngine.runImpl(Engine.scala:535)
at org.scalatest.freespec.AnyFreeSpecLike.run(AnyFreeSpecLike.scala:543)
at org.scalatest.freespec.AnyFreeSpecLike.run$(AnyFreeSpecLike.scala:542)
at org.scalatest.freespec.AnyFreeSpec.run(AnyFreeSpec.scala:1739)
at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:45)
at
org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13(Runner.scala:1322)
at
org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13$adapted(Runner.scala:1316)
at scala.collection.immutable.List.foreach(List.scala:431)
at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1316)
at
org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$24(Runner.scala:993)
at
org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$24$adapted(Runner.scala:971)
at
org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1482)
at
org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:971)
at org.scalatest.tools.Runner$.run(Runner.scala:798)
at org.scalatest.tools.Runner.run(Runner.scala)
at
org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:133)
at
org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:27)
Caused by: java.io.IOException: javax.crypto.BadPaddingException: Given
final block not properly padded. Such issues can arise if a bad key is used
during decryption.
at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:128)
at javax.crypto.CipherInputStream.read(CipherInputStream.java:246)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at java.io.PushbackInputStream.read(PushbackInputStream.java:139)
at
org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.readOneByte(ZipArchiveInputStream.java:1213)
at
org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.findEocdRecord(ZipArchiveInputStream.java:1149)
at
org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.skipRemainderOfArchive(ZipArchiveInputStream.java:1127)
at
org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.getNextZipEntry(ZipArchiveInputStream.java:293)
at
org.apache.poi.openxml4j.util.ZipArchiveThresholdInputStream.getNextEntry(ZipArchiveThresholdInputStream.java:152)
at
org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:94)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:132)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:312)
at fi.oph.koski.raportit.ExcelWriter$.writeExcel(ExcelWriter.scala:45)
at fi.oph.koski.raportit.ExcelWriterSpec.withExcel(ExcelWriterSpec.scala:48)
at
fi.oph.koski.raportit.ExcelWriterSpec.$anonfun$new$3(ExcelWriterSpec.scala:22)
at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
at
org.scalatest.matchers.should.Matchers.$anonfun$thrownBy$1(Matchers.scala:3029)
at
org.scalatest.matchers.dsl.ResultOfThrownByApplication.execute(ResultOfThrownByApplication.scala:30)
at
org.scalatest.matchers.dsl.NoExceptionWord.shouldBe(NoExceptionWord.scala:52)
... 50 more
Caused by: javax.crypto.BadPaddingException: Given final block not properly
padded. Such issues can arise if a bad key is used during decryption.
at com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:975)
at com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1056)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:853)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
at javax.crypto.Cipher.doFinal(Cipher.java:2051)
at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:125)
... 70 more
Any ideas what goes wrong in here?
Br,
Juha