package org.limewire.security.id;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.interfaces.DHPrivateKey;
import org.limewire.io.BadGGEPBlockException;
import org.limewire.io.BadGGEPPropertyException;
import org.limewire.io.GGEP;
import org.limewire.io.GUID;
import org.limewire.io.InvalidDataException;
import org.limewire.util.ByteUtils;
import org.limewire.util.StringUtils;
public class PrivateIdentityImpl implements PrivateIdentity{
private PrivateKey signaturePrivateKey;
private DHPrivateKey dhPrivateKey;
private int multiInstallationMark;
private GUID id;
private PublicKey signaturePublicKey;
private BigInteger dhPublicComponent;
private byte[] signature;
public PrivateIdentityImpl(GUID id, PublicKey signatureKey, BigInteger dhPublicComponent, byte[] signature,
PrivateKey signaturePrivateKey, DHPrivateKey diffieHellmanPrivateKey, int multiInstallationMark) {
this.id = id;
this.signaturePublicKey = signatureKey;
this.dhPublicComponent = dhPublicComponent;
this.signature = signature;
this.signaturePrivateKey = signaturePrivateKey;
this.dhPrivateKey = diffieHellmanPrivateKey;
this.multiInstallationMark = multiInstallationMark;
}
public PrivateIdentityImpl(byte[] data) throws InvalidDataException {
try{
GGEP ggep = new GGEP(data);
id = new GUID(ggep.getBytes("ID"));
KeyFactory factory = KeyFactory.getInstance(SecureIdManager.SIG_KEY_ALGO);
signaturePublicKey = factory.generatePublic(new X509EncodedKeySpec(ggep.getBytes("SPU")));
signaturePrivateKey = factory.generatePrivate(new PKCS8EncodedKeySpec(ggep.getBytes("SPV")));
factory = KeyFactory.getInstance(SecureIdManager.AGREEMENT_ALGO);
dhPublicComponent = new BigInteger(ggep.getBytes("DHPU"));
dhPrivateKey = (DHPrivateKey) factory.generatePrivate(new PKCS8EncodedKeySpec(ggep.getBytes("DHPV")));
signature = ggep.getBytes("SIG");
multiInstallationMark = ByteUtils.beb2int(ggep.getBytes("MIM"), 0);
} catch (BadGGEPBlockException e) {
throw new InvalidDataException(e);
} catch (BadGGEPPropertyException e) {
throw new InvalidDataException(e);
} catch (NoSuchAlgorithmException e) {
throw new InvalidDataException(e);
} catch (InvalidKeySpecException e) {
throw new InvalidDataException(e);
}
}
@Override
public byte[] toByteArray() {
GGEP ggep = new GGEP();
ggep.put("ID", id.bytes());
ggep.put("SPU", signaturePublicKey.getEncoded());
ggep.put("DHPU", dhPublicComponent.toByteArray());
ggep.put("SIG", signature);
ggep.put("SPV", signaturePrivateKey.getEncoded());
ggep.put("DHPV", dhPrivateKey.getEncoded());
byte[] buf = new byte[4];
ByteUtils.int2beb(multiInstallationMark, buf, 0);
ggep.put("MIM", buf);
return ggep.toByteArray();
}
public GUID getGuid(){
return id;
}
public PublicKey getPublicSignatureKey(){
return signaturePublicKey;
}
public BigInteger getPublicDiffieHellmanComponent(){
return dhPublicComponent;
}
public byte[] getSignature(){
return signature;
}
public int getMultiInstallationMark() {
return multiInstallationMark;
}
public PrivateKey getPrivateDiffieHellmanKey() {
return dhPrivateKey;
}
public PrivateKey getPrivateSignatureKey() {
return signaturePrivateKey;
}
@Override
public String toString() {
return StringUtils.toString(this);
}
}