JavaでeTokenを使う(その1)

eTokenを使用するJavaのプログラムを作ってみる。eTokenを使用するには、eTokenを使用できるPKCS11のプロバイダーを経由して行う。たぶん。

import java.security.Provider;

public class AladdinTool {
    private static Provider provider;
    static {
        InputStream is = getConfigStream();
        try {
            provider = new sun.security.pkcs11.SunPKCS11(is);
            Security.addProvider(provider);
        }
        finally {
            try {
                is.close();
            }
            catch (Exception ex) {
            }
        }
    }
    private static InputStream getConfigStream() throws Exception {
        Map<String, String> env = System.getenv();
        String sysRoot = env.get("SystemRoot");
        String pkcsDll = null;
        if (sysRoot != null) {
            // Windows
            pkcsDll = sysRoot + "\\system32\\eTpkcs11.dll";
        }
        else {
            throw    new UnsupportedOperationException(
                            "This type of OS or JRE is not supported yet.");
        }
        String content =
                "library=" + pkcsDll + "\n" +
                "name=eToken\n" +
                "description=eToken PKCS#11 Dynamic Link Library\n" +
                "attributes=compatibility\n"
                ;
        return	new ByteArrayInputStream(content.getBytes());
    }
    public static KeyStore login(String pin) throws Exception {
        char[] pinarry = pin.toCharArray();
        KeyStore ks = KeyStore.getInstance("PKCS11", provider);
        ks.load(null, pin);
        return ks;
    }
}

面倒くさいので、getConfigStream()でeTokenのプロパティの内容を内部で作成するようにしてみた(Windowsでしか使えないけど)。内容はkeytoolでeTokenを使用するときに指定するプロパティファイルの中身と同じものとした。
後は、login()でパスワードを指定してKeyStoreを取得した後にエントリを取得すればいい。