package freenet.crypt;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.PublicKey;
import java.security.Security;
import freenet.crypt.ECDSA.Curves;
import freenet.node.FSParseException;
import freenet.support.SimpleFieldSet;
import junit.framework.TestCase;
public class ECDSATest extends TestCase {
ECDSA.Curves curveToTest;
ECDSA ecdsa;
protected void setUp() throws Exception {
super.setUp();
curveToTest = Curves.P256;
ecdsa = new ECDSA(curveToTest);
}
public void testGetPublicKey() {
PublicKey pub = ecdsa.getPublicKey();
assertNotNull(pub);
assertTrue(pub.getEncoded().length <= curveToTest.modulusSize);
}
public void testSign() {
byte[] sig= ecdsa.sign("test".getBytes());
assertNotNull(sig);
assertTrue(sig.length > 0);
}
public void testSignToNetworkFormat() {
byte[] toSign = "test".getBytes();
byte[] sig= ecdsa.signToNetworkFormat(toSign);
assertNotNull(sig);
assertEquals(sig.length, curveToTest.maxSigSize);
}
public void testVerify() {
String toSign = "test";
byte[] sig= ecdsa.sign(toSign.getBytes());
assertTrue(ecdsa.verify(sig, toSign.getBytes()));
assertFalse(ecdsa.verify(sig, "".getBytes()));
}
public void testAsFieldSet() throws FSParseException {
SimpleFieldSet privSFS = ecdsa.asFieldSet(true);
assertNotNull(privSFS.getSubset(curveToTest.name()));
assertNotNull(privSFS.get(curveToTest.name()+".pub"));
assertNotNull(privSFS.get(curveToTest.name()+".pri"));
// Ensure we don't leak the privkey when we don't intend to
SimpleFieldSet pubSFS = ecdsa.asFieldSet(false);
assertNotNull(pubSFS.getSubset(curveToTest.name()));
assertNotNull(pubSFS.get(curveToTest.name()+".pub"));
assertNull(pubSFS.get(curveToTest.name()+".pri"));
}
public void testSerializeUnserialize() throws FSParseException {
SimpleFieldSet sfs = ecdsa.asFieldSet(true);
ECDSA ecdsa2 = new ECDSA(sfs.getSubset(curveToTest.name()), curveToTest);
assertEquals(ecdsa.getPublicKey(), ecdsa2.getPublicKey());
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Curves curve = ECDSA.Curves.P256;
ECDSA ecdsa = new ECDSA(curve);
String toSign = "test";
byte[] signedBytes = toSign.getBytes("utf-8");
//byte[] sig = ecdsa.sign(signedBytes);
byte[] sig = ecdsa.signToNetworkFormat(signedBytes);
System.out.println("Curve in use : " + curve.toString());
System.out.println(ecdsa.getPublicKey().toString());
System.out.println("ToSign : "+toSign + " ("+toHex(signedBytes)+")");
System.out.println("Signature: "+ toHex(sig));
System.out.println("Verify? : "+ecdsa.verify(sig, signedBytes));
SimpleFieldSet sfs = ecdsa.asFieldSet(true);
System.out.println("\nSerialized to: ");
System.out.println(sfs.toString());
System.out.println("Restored to: ");
ECDSA ecdsa2 = new ECDSA(sfs.getSubset(curve.name()), curve);
System.out.println(ecdsa2.getPublicKey());
System.out.println("Verify? : "+ecdsa2.verify(sig, signedBytes));
System.out.println("Let's ensure that the signature always fits into "+ecdsa.curve.maxSigSize+" bytes.");
int max = 0;
for(int i=0; i<10000; i++) {
max = Math.max(max, ecdsa.sign(signedBytes).length);
}
System.out.println(max);
}
public static String toHex(byte[] arg) {
return String.format("%040x", new BigInteger(1,arg));
}
public static String toHex(String arg) throws UnsupportedEncodingException {
return toHex(arg.getBytes("utf-8"));
}
}