On the example given at ECDSA sign with BouncyCastle and verify with Crypto++, the DSAConvertSignatureFormat()
needs byte[]
as arguments. But what I got from my Java code, I got a signature like this which is a String
:
302e021500f16529dcaddd3cec7616a3f94e157d1c28df8ea9021500997de4ae5497268c4f8eb3129abb11ca2abea9c1
How do I use the Java signature in the Crypto++ code?
Here is the Crypto++ code in the question:
bool VerifyMessage( const ECDSA<ECP, SHA256>::PublicKey& key, const string& message, const string& signature )
{
bool result = false;
string signatureFromJava("302e021500cb3333768bbe3f26d7a58388015d6110c1dbad5f021500dc2ee848c72deee1542939b3e5eb2816e71bf895");
SecByteBlock signatureFromJavaByte((byte *)signatureFromJava.data(), signatureFromJava.size());
byte finalSignature[0x40];
DSAConvertSignatureFormat(finalSignature, sizeof(finalSignature), DSA_P1363,
signatureFromJavaByte, sizeof(signatureFromJavaByte), DSA_DER);
// TODO convert finalSignature to std::string
// Hexa encoding version, more readable
std::string decodedSignature;
StringSource(signature, true,
new HexDecoder(
new StringSink(decodedSignature)));
StringSource(decodedSignature+message, true,
new SignatureVerificationFilter(ECDSA<ECP,SHA256>::Verifier(key),
new ArraySink((byte*)&result,
sizeof(result))));
return result;
}
Here is the Java code in question:
public static String sign(String data) throws Exception {
KeyPair keyPair = loadKeyPair(System.getProperty("user.dir"),"ECDSA");
Signature signature = Signature.getInstance("SHA256withECDSA", "BC");
signature.initSign(keyPair.getPrivate(), new SecureRandom());
byte[] message = data.getBytes();
signature.update(message);
byte[] sigBytes = signature.sign();
//verify("TEST", sigBytes);
String signatureStr = new BigInteger(1, sigBytes).toString(16);
return signatureStr;
}