package com.duosecurity.duokit.crypto; import org.spongycastle.util.encoders.Base64; import org.spongycastle.util.encoders.Hex; import java.io.UnsupportedEncodingException; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PublicKey; import java.security.Security; import java.security.spec.X509EncodedKeySpec; public class Crypto { private static final String PROVIDER = "SC"; private static final String KEGEN_ALG = "ECDH"; private static Crypto instance; static { Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider()); } private KeyFactory kf; public static synchronized Crypto getInstance() { if (instance == null) { instance = new Crypto(); } return instance; } private Crypto() { try { kf = KeyFactory.getInstance(KEGEN_ALG, PROVIDER); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } catch (NoSuchProviderException e) { throw new RuntimeException(e); } } public static String hex(byte[] bytes) { try { return new String(Hex.encode(bytes), "ASCII"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } public static byte[] base64Decode(String str) { return Base64.decode(str); } public synchronized PublicKey readPublicKey(String keyStr) throws Exception { X509EncodedKeySpec x509ks = new X509EncodedKeySpec( Base64.decode(keyStr)); return kf.generatePublic(x509ks); } }