Error is on Windows 7 64bit with java 8:
Caused by: java.security.InvalidKeyException: Private keys must be instance of RSAPrivate(Crt)Key or have PKCS#8 encoding
at sun.security.rsa.RSAKeyFactory.translatePrivateKey(Unknown Source)
at sun.security.rsa.RSAKeyFactory.engineTranslateKey(Unknown Source)
at sun.security.rsa.RSAKeyFactory.toRSAKey(Unknown Source)
at sun.security.rsa.RSASignature.engineInitSign(Unknown Source)
at sun.security.rsa.RSASignature.engineInitSign(Unknown Source)
at java.security.Signature$Delegate.init(Unknown Source)
at java.security.Signature$Delegate.chooseProvider(Unknown Source)
at java.security.Signature$Delegate.engineInitSign(Unknown Source)
at java.security.Signature.initSign(Unknown Source)
public static void main(String[] args) throws Exception {
File tmpConfigFile = File.createTempFile("pkcs11-", "conf");
tmpConfigFile.deleteOnExit();
PrintWriter configWriter = new PrintWriter(new FileOutputStream(tmpConfigFile), true);
configWriter.println("name=SmartCard");
configWriter.println("library=c:\\Windows\\System32\\beidpkcs11.dll");
configWriter.println("slotListIndex=0");
sun.security.pkcs11.SunPKCS11 provider = new sun.security.pkcs11.SunPKCS11(tmpConfigFile.getAbsolutePath());
Security.addProvider(provider);
KeyStore keyStore = KeyStore.getInstance("PKCS11", provider);
keyStore.load(null, null);
PrivateKeyEntry privateKeyEntry = (PrivateKeyEntry) keyStore.getEntry("Signature", null);
PrivateKey privateKey = privateKeyEntry.getPrivateKey();
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(privateKey); // ERROR IS THROWN HERE
byte[] toBeSigned = "hello world".getBytes();
signature.update(toBeSigned);
byte[] signatureValue = signature.sign();
X509Certificate certificate = (X509Certificate) privateKeyEntry.getCertificate();
RSAPublicKey publicKey = (RSAPublicKey) certificate.getPublicKey();
BigInteger signatureValueBigInteger = new BigInteger(signatureValue);
BigInteger messageBigInteger =
signatureValueBigInteger.modPow(publicKey.getPublicExponent(), publicKey.getModulus());
System.out.println("original message: " + new String(Hex.encodeHex(messageBigInteger.toByteArray())));
}Thank you
Gregory
This issue should be fixed in the future release build (v410), which you can find on http://eid.belgium.be/en/using_your_eid/installing_the_eid_software/windows/Wkr,