You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@poi.apache.org by Juha Rantanen <ju...@reaktor.com.INVALID> on 2022/05/11 09:58:05 UTC

java.io.IOException: javax.crypto.BadPaddingException: Given final block not properly padded.

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

Re: java.io.IOException: javax.crypto.BadPaddingException: Given final block not properly padded.

Posted by Juha Rantanen <ju...@reaktor.com.INVALID>.
Hi,

wb.write(tempData.getOutputStream)
tempData.getOutputStream.close()

Closing the outputStream like above removes the file content and causes
following error (the error comes from val opc =
OPCPackage.open(tempData.getInputStream).

Caused by: org.apache.poi.EmptyFileException: The supplied file was empty
(zero bytes long)
at org.apache.poi.util.IOUtils.peekFirstNBytes(IOUtils.java:144)
at org.apache.poi.poifs.filesystem.FileMagic.valueOf(FileMagic.java:209)
at
org.apache.poi.openxml4j.opc.internal.ZipHelper.verifyZipHeader(ZipHelper.java:143)
at
org.apache.poi.openxml4j.opc.internal.ZipHelper.openZipStream(ZipHelper.java:175)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:130)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:312)
at fi.oph.koski.raportit.ExcelWriter$.writeExcel(ExcelWriter.scala:57)
at
fi.oph.koski.raportit.ExcelWriterSpec.withExcel(ExcelWriterSpec.scala:382)
at
fi.oph.koski.raportit.ExcelWriterSpec.$anonfun$new$18(ExcelWriterSpec.scala:60)
at org.scalatest.SuperEngine.registerNestedBranch(Engine.scala:609)
at
org.scalatest.freespec.AnyFreeSpecLike$FreeSpecStringWrapper.$minus(AnyFreeSpecLike.scala:284)
... 21 more


I debugged what happens to the temporary file after the
tempData.getOutputStream.close() and it seems that the file contents is
cleared or something at that point, at least the size of the temporary file
drops from 6336 bytes to 16 bytes.

ls -la

-rw-------    1 xxxxx  yyyyy  6336 May 17 08:54
poi-temp-data130676899731199660.tmp


ls -la

-rw-------    1 xxxxx  yyyyy    16 May 17 08:54
poi-temp-data130676899731199660.tmp


Any ideas what to try out next?

Br,
Juha

On Wed, May 11, 2022 at 3:39 PM PJ Fanning <fa...@yahoo.com.invalid>
wrote:

> You should close the output stream immediately
>
>  wb.write(tempData.getOutputStream)
>
> You should not leave the output stream open while then turning around and
> trying to read from the tempData.
>
>
>
>
>
>
> On Wednesday 11 May 2022, 11:58:25 GMT+2, Juha Rantanen <
> juha.rantanen@reaktor.com.invalid> wrote:
>
>
>
>
>
> 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
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@poi.apache.org
> For additional commands, e-mail: user-help@poi.apache.org
>
>

Re: java.io.IOException: javax.crypto.BadPaddingException: Given final block not properly padded.

Posted by PJ Fanning <fa...@yahoo.com.INVALID>.
You should close the output stream immediately

 wb.write(tempData.getOutputStream)

You should not leave the output stream open while then turning around and trying to read from the tempData.






On Wednesday 11 May 2022, 11:58:25 GMT+2, Juha Rantanen <ju...@reaktor.com.invalid> wrote: 





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

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@poi.apache.org
For additional commands, e-mail: user-help@poi.apache.org