package TorJava;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import org.bouncycastle.crypto.params.RSAKeyParameters;
import org.bouncycastle.jce.provider.JCERSAPrivateKey;
import org.bouncycastle.jce.provider.JCERSAPublicKey;
import TorJava.Common.Encoding;
import TorJava.Common.Encryption;
public class HiddenServiceKeySet {
public JCERSAPublicKey jpub;
public JCERSAPrivateKey jpriv;
public RSAKeyParameters pub, priv; // keys
byte[] pubKeyHash;
private String url;
public HiddenServiceKeySet() {
// Generate
try {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA",
"BC");
generator.initialize(1024, new SecureRandom());
KeyPair keypair = generator.generateKeyPair();
jpub = (JCERSAPublicKey) keypair.getPublic();
jpriv = (JCERSAPrivateKey) keypair.getPrivate();
// generate service descriptor
} catch (NoSuchProviderException e) {
Logger.logTLS(Logger.ERROR,
"HiddenServiceProperties: Caught exception: "
+ e.getMessage());
} catch (NoSuchAlgorithmException e) {
Logger.logTLS(Logger.ERROR,
"HiddenServiceProperties: Caught exception: "
+ e.getMessage());
}
init();
}
public HiddenServiceKeySet(String publicKey, String privateKey) {
jpub = Encryption.getRSAPublicKeyFromPEMString(publicKey);
jpriv = Encryption.getRSAPrivateKeyFromPEMString(privateKey);
init();
}
private void init() {
pub = new RSAKeyParameters(false, jpub.getModulus(), jpub
.getPublicExponent());
priv = new RSAKeyParameters(true, jpriv.getModulus(), jpriv
.getPrivateExponent());
pubKeyHash = new byte[20];
pubKeyHash = Encryption.getHash(Encryption
.getPKCS1EncodingFromRSAPublicKey(Encryption
.getRSAPublicKeyStructureFromJCERSAPublicKey(jpub)));
updateURL();
}
private void updateURL() {
try {
// create hash of public key
byte[] hash = Encryption.getHash(Encryption.getPKCS1EncodingFromRSAPublicKey(Encryption.getRSAPublicKeyStructureFromJCERSAPublicKey(jpub)));
// take top 80-bits and convert to biginteger
byte[] h1 = new byte[10];
System.arraycopy(hash, 0, h1, 0, 10);
// return encoding
this.url = Encoding.toBase32(h1);
} catch (Exception e) {
Logger.logGeneral(Logger.ERROR, "ServiceDescriptor.updateURL(): "
+ e.getMessage());
e.printStackTrace();
this.url = null;
}
}
public String getPublicKey() {
return Encryption.getPEMStringFromRSAPublicKey(Encryption.getRSAPublicKeyStructureFromJCERSAPublicKey(jpub));
}
public String getPrivateKey() {
String str = Encryption.getPEMStringFromRSAPrivateKey(jpriv);
return str;
}
public String getUrl() {
return url;
}
}