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);
}
}