Skip to content

CardOS V5.3 fails with eu.europa.esig.dss.model.DSSException: Unable to sign : no such algorithm: SHA256withRSA for provider SunPKCS11-SmartCardXXXX #1

@saper

Description

@saper

Hello, cała Polska czekała na ten projekt 🇵🇱 💳 🇵🇱

I know you are working only with KIR card, but I have tried to use this with an EuroCert card and using opensc-pkcs11.so PKCS#11 driver that seem to support those cards just fine:

PKCS#15 Card [CardOS V5.3 | EC00XXXXXX]:
	Version        : 0
	Serial number  : 31
	Manufacturer ID: Atos IT Solutions and Services GmbH

An attempt to sign a login document from https://pz.gov.pl fails because the card does not support CKM_SHA256_RSA_PKCS and results in the following exception:

[qtp2121926899-17] INFO eu.europa.esig.dss.validation.CommonCertificateVerifier - + New CommonCertificateVerifier created.
[qtp2121926899-17] INFO eu.europa.esig.dss.token.AbstractSignatureTokenConnection - Signature algorithm : SHA256withRSA
[qtp2121926899-17] ERROR pl.podpisfree.api.Server - Can not process 'sign' api request.
pl.podpisfree.crypto.XMLSigner$XMLSignerException: Unable to sign
        at pl.podpisfree.crypto.XMLSigner.sign(XMLSigner.java:92)
        at pl.podpisfree.api.Server.lambda$run$5(Server.java:137)
        at spark.RouteImpl$1.handle(RouteImpl.java:72)
        at spark.http.matching.Routes.execute(Routes.java:61)
        at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:134)
        at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1598)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
        at org.eclipse.jetty.server.Server.handle(Server.java:516)
        at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
        at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:555)
        at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:410)
        at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:164)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
        at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
        at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: eu.europa.esig.dss.model.DSSException: Unable to sign : no such algorithm: SHA256withRSA for provider SunPKCS11-SmartCardXXX
        at eu.europa.esig.dss.token.AbstractSignatureTokenConnection.sign(AbstractSignatureTokenConnection.java:88)
        at eu.europa.esig.dss.token.AbstractSignatureTokenConnection.sign(AbstractSignatureTokenConnection.java:66)
        at eu.europa.esig.dss.token.AbstractSignatureTokenConnection.sign(AbstractSignatureTokenConnection.java:58)
        at pl.podpisfree.crypto.CryptoCard.sign(CryptoCard.java:85)
        at pl.podpisfree.crypto.XMLSigner.sign(XMLSigner.java:82)
        ... 28 more
Caused by: java.security.NoSuchAlgorithmException: no such algorithm: SHA256withRSA for provider SunPKCS11-SmartCardXXX
        at java.base/sun.security.jca.GetInstance.getService(GetInstance.java:101)
        at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:218)
        at java.base/java.security.Signature.getInstance(Signature.java:450)
        at eu.europa.esig.dss.token.Pkcs11SignatureToken.getSignatureInstance(Pkcs11SignatureToken.java:360)
        at eu.europa.esig.dss.token.AbstractSignatureTokenConnection.sign(AbstractSignatureTokenConnection.java:136)
        at eu.europa.esig.dss.token.AbstractSignatureTokenConnection.sign(AbstractSignatureTokenConnection.java:82)
        ... 32 more

Here is what my PKCS#11 driver reports:

> pkcs11-tool -M
Using slot 0 with a present token (0x0)
Supported mechanisms:
  SHA-1, digest
  SHA224, digest
  SHA256, digest
  SHA384, digest
  SHA512, digest
  MD5, digest
  RIPEMD160, digest
  GOSTR3411, digest
  RSA-X-509, keySize={512,4096}, hw, decrypt, sign, verify
  RSA-PKCS, keySize={512,4096}, hw, decrypt, sign, verify
  SHA1-RSA-PKCS, keySize={512,4096}, sign, verify
  RSA-PKCS-PSS, keySize={512,4096}, hw, sign, verify
  SHA1-RSA-PKCS-PSS, keySize={512,4096}, sign, verify
  RSA-PKCS-OAEP, keySize={512,4096}, hw, decrypt

In theory, the solution is easy - hash first in the software and use CKM_RSA_PKCS mechanism as a fall back.
But with Java, the questions is which layer should detect this and change the mechanism used.

Big thanks for putting this out - it's a new hope for me!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions