public byte[] sign() throws Exception { byte[] sig = signature.sign(); /* System.err.print("sign["+sig.length+"] "); for(int i=0; i<sig.length;i++){ System.err.print(Integer.toHexString(sig[i]&0xff)+":"); } System.err.println(""); */ // sig is in ASN.1 // SEQUENCE::={ r INTEGER, s INTEGER } int len = 0; int index = 3; len = sig[index++] & 0xff; // System.err.println("! len="+len); byte[] r = new byte[len]; System.arraycopy(sig, index, r, 0, r.length); index = index + len + 1; len = sig[index++] & 0xff; // System.err.println("!! len="+len); byte[] s = new byte[len]; System.arraycopy(sig, index, s, 0, s.length); byte[] result = new byte[40]; // result must be 40 bytes, but length of r and s may not be 20 bytes System.arraycopy( r, (r.length > 20) ? 1 : 0, result, (r.length > 20) ? 0 : 20 - r.length, (r.length > 20) ? 20 : r.length); System.arraycopy( s, (s.length > 20) ? 1 : 0, result, (s.length > 20) ? 20 : 40 - s.length, (s.length > 20) ? 20 : s.length); // System.arraycopy(sig, (sig[3]==20?4:5), result, 0, 20); // System.arraycopy(sig, sig.length-20, result, 20, 20); return result; }
public byte[] sign() throws Exception { byte[] sig = signature.sign(); return sig; }