From 5da79189280ac242b4f8432b8deacbebf9377acd Mon Sep 17 00:00:00 2001 From: fireduck64 Date: Tue, 3 Nov 2020 23:36:29 -0800 Subject: [PATCH] Working e2e tests --- BUILD | 4 ++ cli/test.json | 2 +- .../io/swagger/controllers/Construction.java | 6 +-- src/main/java/rosesnow/RoseUtil.java | 41 ++++++--------- test/integration/ConstructionE2E.java | 8 ++- test/unit/TestSigCoding.java | 50 +++++++++++++++++++ 6 files changed, 80 insertions(+), 31 deletions(-) diff --git a/BUILD b/BUILD index 98db221..aaeaa0b 100644 --- a/BUILD +++ b/BUILD @@ -51,6 +51,8 @@ java_library( "@maven//:com_fasterxml_jackson_core_jackson_databind", "@maven//:com_fasterxml_jackson_core_jackson_annotations", "@maven//:junit_junit", + "@maven//:org_bouncycastle_bcpkix_jdk15on", + "@maven//:org_bouncycastle_bcprov_jdk15on", ], ) @@ -74,6 +76,8 @@ java_test( "@com_google_protobuf//:protobuf_java", "@snowblossom//lib", "@snowblossom//protolib:protogrpc", + "@maven//:org_bouncycastle_bcpkix_jdk15on", + "@maven//:org_bouncycastle_bcprov_jdk15on", ], ) diff --git a/cli/test.json b/cli/test.json index 2b3293c..ed8b11b 100644 --- a/cli/test.json +++ b/cli/test.json @@ -4,7 +4,7 @@ "blockchain": "snowblossom", "network": "testnet" }, - "data_directory": "/data/snowblossom/cli-testnet_7", + "data_directory": "/data/snowblossom/cli-testnet_8", "http_timeout": 300, "max_retries": 5, "retry_elapsed_time": 0, diff --git a/src/main/java/io/swagger/controllers/Construction.java b/src/main/java/io/swagger/controllers/Construction.java index f426a82..f1c8706 100644 --- a/src/main/java/io/swagger/controllers/Construction.java +++ b/src/main/java/io/swagger/controllers/Construction.java @@ -71,7 +71,7 @@ public ResponseContext constructionCombine(RequestContext request , JsonNode bod for(Signature sig : req.getSignatures()) { - ByteString sig_bytes = RoseUtil.checkSignature(sig); + ByteString sig_bytes = RoseUtil.checkSignature(sig, s_tx.getTxHash()); AddressSpec spec = RoseUtil.getSpecForPublicKey(sig.getPublicKey()); int claim_idx = 0; @@ -269,8 +269,8 @@ else if (op.getType().equals("OUTPUT")) AddressSpecHash hash = RoseUtil.getSpecHashForPublicKey(pk); SigningPayload load = new SigningPayload(); - //ByteString hash_data = RoseUtil.hashSha256( tx.getTxHash() ); - ByteString hash_data = tx.getTxHash(); + ByteString hash_data = RoseUtil.hashSha1( tx.getTxHash() ); + //ByteString hash_data = tx.getTxHash(); System.out.println("LORK payload: " + HexUtil.getHexString( hash_data ) ); diff --git a/src/main/java/rosesnow/RoseUtil.java b/src/main/java/rosesnow/RoseUtil.java index 2cb86c0..7ceba83 100644 --- a/src/main/java/rosesnow/RoseUtil.java +++ b/src/main/java/rosesnow/RoseUtil.java @@ -124,7 +124,6 @@ public static AddressSpec getSpecForPublicKey(PublicKey pk) } String hex_str = pk.getHexBytes(); - System.out.println("LORK pubkey " + hex_str); ByteString hex = HexUtil.hexStringToBytes(hex_str); return AddressUtil.getSimpleSpecForKey(hex, SignatureUtil.SIG_TYPE_ECDSA_COMPRESSED); @@ -136,33 +135,16 @@ public static AddressSpecHash getSpecHashForPublicKey(PublicKey pk) return AddressUtil.getHashForSpec(getSpecForPublicKey(pk)); } - public static ByteString checkSignature(Signature sig) + public static ByteString checkSignature(Signature sig, ByteString tx_hash) throws ValidationException { AddressSpec spec = getSpecForPublicKey(sig.getPublicKey()); SigSpec sig_spec = spec.getSigSpecs(0); ByteString smash_sig = convertSig( HexUtil.hexStringToBytes( sig.getHexBytes() ) ); - ByteString data = HexUtil.hexStringToBytes(sig.getSigningPayload().getHexBytes()); + //ByteString data = HexUtil.hexStringToBytes(sig.getSigningPayload().getHexBytes()); - // TODO - remove - System.out.println("LORK Signature data: " + sig.getHexBytes()); - System.out.println("LORK Signature data smash: " + HexUtil.getHexString(smash_sig)); - System.out.println("LORK Signed data: " + sig.getSigningPayload().getHexBytes()); - - try - { - java.security.MessageDigest md = java.security.MessageDigest.getInstance("SHA-256"); - - ByteString hashed_data = hashSha256(data); - - System.out.println("LORK reg " + SignatureUtil.checkSignature(sig_spec, data, smash_sig)); - System.out.println("LORK sm " + SignatureUtil.checkSignature(sig_spec, hashed_data, smash_sig)); - System.out.println("LORK hex " + SignatureUtil.checkSignature(sig_spec, ByteString.copyFrom( sig.getSigningPayload().getHexBytes().getBytes()), smash_sig)); - } - catch(Exception e){throw new ValidationException(e);} - - if(!SignatureUtil.checkSignature(sig_spec, data, smash_sig)) + if(!SignatureUtil.checkSignature(sig_spec, tx_hash, smash_sig)) { throw new ValidationException("Signature check failed"); } @@ -179,10 +161,22 @@ public static ByteString hashSha256(ByteString in) } catch(Exception e){throw new RuntimeException(e);} + } + public static ByteString hashSha1(ByteString in) + { + try + { + java.security.MessageDigest md = java.security.MessageDigest.getInstance("SHA-1"); + return ByteString.copyFrom(md.digest(in.toByteArray())); - + } + catch(Exception e){throw new RuntimeException(e);} } + + /** + * Converts signature from raw R|S style (64 bytes) to DER encoded (72 to 70 bytes or so) + */ public static ByteString convertSig(ByteString raw_sig) { ByteString r = raw_sig.substring(0,32); @@ -205,9 +199,6 @@ public static ByteString convertSig(ByteString raw_sig) b[0]=(byte)s.size(); der_sig = der_sig.concat(ByteString.copyFrom(b)); der_sig = der_sig.concat(s); - System.out.println("LORK r " + HexUtil.getHexString(r)); - System.out.println("LORK s " + HexUtil.getHexString(s)); - return der_sig; } diff --git a/test/integration/ConstructionE2E.java b/test/integration/ConstructionE2E.java index afa1466..91598ce 100644 --- a/test/integration/ConstructionE2E.java +++ b/test/integration/ConstructionE2E.java @@ -155,9 +155,13 @@ public ConstructionE2E() ByteString sign_data = HexUtil.hexStringToBytes( payload.getHexBytes() ); - ByteString s = SignatureUtil.sign(wkp, sign_data); + java.security.PrivateKey priv_key = KeyUtil.decodePrivateKey(wkp.getPrivateKey(), "ECDSA"); - s = RoseUtil.convertSigDerToRaw(s); + java.security.Signature sig_engine = java.security.Signature.getInstance("NONEwithECDSA","BC"); + sig_engine.initSign(priv_key); + sig_engine.update( sign_data.toByteArray() ); + + ByteString s = RoseUtil.convertSigDerToRaw(ByteString.copyFrom(sig_engine.sign())); sig.setHexBytes( HexUtil.getHexString(s)); diff --git a/test/unit/TestSigCoding.java b/test/unit/TestSigCoding.java index f26e844..f92cbc9 100644 --- a/test/unit/TestSigCoding.java +++ b/test/unit/TestSigCoding.java @@ -7,10 +7,17 @@ import snowblossom.lib.KeyUtil; import snowblossom.lib.SignatureUtil; import snowblossom.proto.WalletKeyPair; +import snowblossom.proto.AddressSpec; +import snowblossom.proto.SigSpec; import snowblossom.lib.Globals; +import snowblossom.lib.AddressUtil; import snowblossom.lib.HexUtil; import org.snowblossom.rosesnow.RoseUtil; +import org.bouncycastle.asn1.DERObjectIdentifier; +import org.bouncycastle.asn1.x509.AlgorithmIdentifier; +import org.bouncycastle.asn1.x509.DigestInfo; + public class TestSigCoding { @@ -49,4 +56,47 @@ public void testConvert() } + + /** + * Sign something with ECDSA/NONE and verify with ECDSA/SHA1 + */ + @Test + public void testSigNoneSha1() throws Exception + { + WalletKeyPair wkp = KeyUtil.generateWalletStandardECKey(); + + AddressSpec addr_spec = AddressUtil.getSimpleSpecForKey( wkp ); + SigSpec sig_spec = addr_spec.getSigSpecs(0); + + java.security.PrivateKey priv_key = KeyUtil.decodePrivateKey(wkp.getPrivateKey(), "ECDSA"); + java.security.PublicKey pub_key = SignatureUtil.decodePublicKey(sig_spec); + + ByteString tx_hash = null; + { + byte[] b = new byte[32]; + Random rnd = new Random(); + rnd.nextBytes(b); + tx_hash = ByteString.copyFrom(b); + } + + java.security.Signature sig_engine = java.security.Signature.getInstance("NONEwithECDSA","BC"); + sig_engine.initSign(priv_key); + ByteString sha1_tx_hash = RoseUtil.hashSha1(tx_hash); + + /* + DigestInfo di = new DigestInfo(new AlgorithmIdentifier(new DERObjectIdentifier("1.3.14.3.2.26")), sha1_tx_hash.toByteArray()); + byte[] plain_sig = di.getEncoded("DER"); + + //sig_engine.update( plain_sig );*/ + sig_engine.update( sha1_tx_hash.toByteArray() ); + + ByteString signature = ByteString.copyFrom(sig_engine.sign()); + + Assert.assertTrue(SignatureUtil.checkSignature(sig_spec, tx_hash, signature)); + + + + } + + }