Opensc - java

2 respostas
K

Alguém já utilizou a lib OpenSC for Java?

Estou com um problema. Tenho um código teste e tentei realizar o login do repositório de chaves utilizando o provider PKCS11Provider do OpenSC.

Só que em todos os casos onde existe a chave privada no smartcard, ocorre o seguinte erro:

Exception in thread main org.opensc.pkcs11.wrap.PKCS11Exception: C_GetAttributeValue failed for attribute 289. (CKR_ATTRIBUTE_TYPE_INVALID)

at org.opensc.pkcs11.wrap.PKCS11Object.getULongAttributeNative(Native Method)

at org.opensc.pkcs11.wrap.PKCS11Object.getULongAttribute(PKCS11Object.java:109)

at org.opensc.pkcs11.wrap.PKCS11Key.(PKCS11Key.java:90)

at org.opensc.pkcs11.wrap.PKCS11PrivateKey.(PKCS11PrivateKey.java:57)

at org.opensc.pkcs11.wrap.PKCS11NeRSAPrivateKey.(PKCS11NeRSAPrivateKey.java:52)

at org.opensc.pkcs11.wrap.PKCS11PrivateKey.makePrivateKey(PKCS11PrivateKey.java:89)

at org.opensc.pkcs11.wrap.PKCS11PrivateKey.getPrivateKeys(PKCS11PrivateKey.java:124)

at org.opensc.pkcs11.spi.PKCS11KeyStoreSpi.engineLoad(PKCS11KeyStoreSpi.java:510)

at org.opensc.pkcs11.spi.PKCS11KeyStoreSpi.engineLoad(PKCS11KeyStoreSpi.java:478)

at java.security.KeyStore.load(Unknown Source)

Segue um trecho do código:

PKCS11Provider p = new PKCS11Provider("aetpkss1.dll");
KeyStore ks = KeyStore.getInstance("PKCS11", p);
ks.load(null, "1234".toCharArray()); //aqui ocorre o erro

Para o conhecimento de vocês, a dll mencionada acima está no system32 do windows e a dll do opensc também está no path.

Estou utilizando a versão 0.2 desta dll que é a última versão para o Java.

Atenciosamente,

2 Respostas

E

Por algum motivo, ele não consegue obter o valor do atributo CKA_MODULUS_BITS, cujo valor é 289.

Infelizmente você terá de consultar alguém que saiba melhor PKCS#11 que eu. Não tenho idéia de porque o OpenSC ele precisa de tal atributo. (Ele deveria talvez tentar pegar o valor de CKA_MODULUS que é 288, mas isso é apenas um chute.

ironman_br

Eu estou usando esse projeto, pois o código da DLL que interage com o leitor/cartão é multiplataforma.

Eu uso esse código:

String aPKCS11LibraryFileName = 
			"C:\\Program Files\\Smart card bundle\\opensc-pkcs11.dll";
		//aPKCS11LibraryFileName = "C:\\OpenSC\\bin\\opensc-pkcs11.dll";
		String pkcs11ConfigSettings =
            "name = SmartCard\n" + "library = " + aPKCS11LibraryFileName ;
        byte[] pkcs11ConfigBytes = pkcs11ConfigSettings.getBytes();
        ByteArrayInputStream confStream = new ByteArrayInputStream(pkcs11ConfigBytes);
        Provider pkcs11Provider = null;

        // Instantiate the provider dynamically with Java reflection
        try {
            pkcs11Provider = new SunPKCS11(confStream);
            Security.addProvider(pkcs11Provider);
        } catch (Exception e) {
            e.printStackTrace();
            throw new KeyStoreException("Não foi possivel inicializar a API Sun PKCS#11 security " +
                ". Motivo: " + e.getCause().getMessage());
        }

        // Read the keystore form the smart card
        char[] pin = "1234".toCharArray();
        Security.getProviders();
        KeyStore keyStore = KeyStore.getInstance(PKCS11_KEYSTORE_TYPE, pkcs11Provider);
        keyStore.load(null, pin);
        System.out.println(keyStore);

Nesse codigo, ele usa a API da Sun e a Dll do OpenSC

[]'s

Criado 21 de outubro de 2009
Ultima resposta 23 de nov. de 2009
Respostas 2
Participantes 3