public void TestNewSig()
        {
            var b   = new GoSlice();
            var err = SKY_cipher_RandByte(64, b);
            var s   = new cipher_Sig();

            err = SKY_cipher_NewSig(b, s);
            Assert.AreEqual(err, SKY_ErrInvalidLengthSig);
            err = SKY_cipher_RandByte(66, b);
            err = SKY_cipher_NewSig(b, s);
            Assert.AreEqual(err, SKY_ErrInvalidLengthSig);
            err = SKY_cipher_RandByte(67, b);
            err = SKY_cipher_NewSig(b, s);
            Assert.AreEqual(err, SKY_ErrInvalidLengthSig);
            err = SKY_cipher_RandByte(0, b);
            err = SKY_cipher_NewSig(b, s);
            Assert.AreEqual(err, SKY_ErrInvalidLengthSig);
            err = SKY_cipher_RandByte(100, b);
            err = SKY_cipher_NewSig(b, s);
            Assert.AreEqual(err, SKY_ErrInvalidLengthSig);
            s   = new cipher_Sig();
            b   = new GoSlice();
            err = SKY_cipher_RandByte(65, b);
            err = SKY_cipher_NewSig(b, s);
            Assert.AreEqual(err, SKY_OK);
            var b1 = new GoSlice();

            err = SKY_cipher_RandByte(65, b1);
            var s1 = new cipher_Sig();

            err = SKY_cipher_NewSig(b1, s1);
            Assert.AreEqual(err, SKY_OK);
        }
        public void TestSignHash()
        {
            var p = new cipher_PubKey();
            var s = new cipher_SecKey();
            var a = new cipher__Address();

            SKY_cipher_GenerateKeyPair(p, s);
            var err = SKY_cipher_AddressFromPubKey(p, a);

            Assert.AreEqual(err, SKY_OK);
            var b_temp = new GoSlice();

            SKY_cipher_RandByte(256, b_temp);
            var h = new cipher_SHA256();

            SKY_cipher_SumSHA256(b_temp, h);
            var sig = new cipher_Sig();

            SKY_cipher_SignHash(h, s, sig);
            Assert.AreEqual(sig.isEqual(new cipher_Sig()), 0);
        }
        public void TestPubKeyFromSig()
        {
            var p   = new cipher_PubKey();
            var s   = new cipher_SecKey();
            var b   = new GoSlice();
            var h   = new cipher_SHA256();
            var err = SKY_cipher_GenerateKeyPair(p, s);

            err = SKY_cipher_RandByte(256, b);
            err = SKY_cipher_SumSHA256(b, h);
            var sig = new cipher_Sig();

            err = SKY_cipher_SignHash(h, s, sig);
            var p2 = new cipher_PubKey();

            err = SKY_cipher_PubKeyFromSig(sig, h, p2);
            Assert.AreEqual(err, SKY_OK);
            Assert.AreEqual(p2.isEqual(p), 1);
            p2  = new cipher_PubKey();
            err = SKY_cipher_PubKeyFromSig(new cipher_Sig(), h, p2);
            Assert.AreEqual(err, SKY_ErrInvalidSigPubKeyRecovery);
        }
示例#4
0
        public void TestTransactionHashInner()
        {
            var handle = new_Transaction__Handlep();

            makeTransaction(handle);
            var h   = new cipher_SHA256();
            var err = SKY_coin_Transaction_HashInner(handle, h);

            Assert.AreEqual(err, SKY_OK);
            Assert.AreEqual(h.isEqual(new cipher_SHA256()), 0);

            // If tx.In is changed, hash should change
            var handle2 = transutils.copyTransaction(handle);

            Assert.AreEqual(err, SKY_OK);
            var ux = new coin__UxOut();

            makeUxOut(ux);
            h = new cipher_SHA256();
            var h1 = new cipher_SHA256();

            err = SKY_coin_UxOut_Hash(ux, h);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_coin_Transaction_SetInputAt(handle2, 0, h);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_coin_UxOut_Hash(ux, h1);
            Assert.AreEqual(err, SKY_OK);
            Assert.AreEqual(h.isEqual(h1), 1);
            err = SKY_coin_Transaction_HashInner(handle, h);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_coin_Transaction_HashInner(handle2, h1);
            Assert.AreEqual(err, SKY_OK);
            Assert.AreEqual(h.isEqual(h1), 0);

            // If tx.Out is changed, hash should change
            handle2 = transutils.copyTransaction(handle);
            var a    = transutils.makeAddress();
            var pOut = new coin__TransactionOutput();

            err = SKY_coin_Transaction_GetOutputAt(handle2, 0, pOut);
            Assert.AreEqual(err, SKY_OK);
            pOut.Address = a;
            err          = SKY_coin_Transaction_SetOutputAt(handle2, 0, pOut);
            Assert.AreEqual(err, SKY_OK);
            var sha1 = new cipher_SHA256();
            var sha2 = new cipher_SHA256();

            err = SKY_coin_Transaction_HashInner(handle, sha1);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_coin_Transaction_HashInner(handle2, sha2);
            Assert.AreEqual(err, SKY_OK);
            Assert.AreEqual(sha1.isEqual(sha2), 0);

            // If tx.Head is changed, hash should not change
            handle2 = transutils.copyTransaction(handle);
            var sig = new cipher_Sig();

            err = SKY_coin_Transaction_PushSignature(handle, sig);
            Assert.AreEqual(err, SKY_OK);
            sha1 = new cipher_SHA256();
            sha2 = new cipher_SHA256();
            err  = SKY_coin_Transaction_HashInner(handle, sha1);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_coin_Transaction_HashInner(handle2, sha2);
            Assert.AreEqual(err, SKY_OK);
            Assert.AreEqual(sha1.isEqual(sha2), 1);
        }
示例#5
0
        public void TestTransactionSignInputs()
        {
            var handle = transutils.makeEmptyTransaction();
            //  Panics if txns already signed
            var sig = new cipher_Sig();
            var err = SKY_coin_Transaction_PushSignature(handle, sig);

            Assert.AreEqual(err, SKY_OK);
            var seckeys = new cipher_SecKeys();

            seckeys.allocate(1);
            seckeys.setAt(0, new cipher_SecKey());
            // Panics if not enough keys
            handle = transutils.makeEmptyTransaction();
            var s   = new cipher_SecKey();
            var s2  = new cipher_SecKey();
            var ux  = new coin__UxOut();
            var ux2 = new coin__UxOut();

            makeUxOutWithSecret(ux, s);
            var h = new cipher_SHA256();

            err = SKY_coin_UxOut_Hash(ux, h);
            Assert.AreEqual(err, SKY_OK);
            var r = new uint();

            r = SKY_coin_Transaction_PushInput(handle, h);
            Assert.AreEqual(r, SKY_OK);
            makeUxOutWithSecret(ux2, s2);
            err = SKY_coin_UxOut_Hash(ux2, h);
            Assert.AreEqual(err, SKY_OK);
            r = SKY_coin_Transaction_PushInput(handle, h);
            Assert.AreEqual(r, SKY_OK);
            err = SKY_coin_Transaction_PushOutput(handle, transutils.makeAddress(), 40, 80);
            Assert.AreEqual(err, SKY_OK);
            var count = new_Gointp();

            err = SKY_coin_Transaction_GetSignaturesCount(handle, count);
            Assert.AreEqual(err, SKY_OK);
            Assert.AreEqual(Gointp_value(count), 0);
            // Valid signing
            h = new cipher_SHA256();
            SKY_coin_Transaction_HashInner(handle, h);
            seckeys = new cipher_SecKeys();
            seckeys.allocate(2);
            seckeys.setAt(0, s);
            seckeys.setAt(1, s2);
            err = SKY_coin_Transaction_SignInputs(handle, seckeys);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_coin_Transaction_GetSignaturesCount(handle, count);
            Assert.AreEqual(err, SKY_OK);
            Assert.AreEqual(Gointp_value(count), 2);
            var h2 = new cipher_SHA256();

            err = SKY_coin_Transaction_HashInner(handle, h2);
            Assert.AreEqual(err, SKY_OK);
            Assert.AreEqual(h.isEqual(h2), 1);
            var p = new cipher_PubKey();

            err = SKY_cipher_PubKeyFromSecKey(s, p);
            Assert.AreEqual(err, SKY_OK);
            var a  = new cipher__Address();
            var a2 = new cipher__Address();

            err = SKY_cipher_AddressFromPubKey(p, a);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_cipher_PubKeyFromSecKey(s2, p);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_cipher_AddressFromPubKey(p, a2);
            Assert.AreEqual(err, SKY_OK);
            var sha1  = new cipher_SHA256();
            var sha2  = new cipher_SHA256();
            var txin0 = new cipher_SHA256();
            var txin1 = new cipher_SHA256();

            err = SKY_coin_Transaction_GetInputAt(handle, 0, txin0);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_coin_Transaction_GetInputAt(handle, 1, txin1);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_cipher_AddSHA256(h, txin0, sha1);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_cipher_AddSHA256(h, txin1, sha2);
            Assert.AreEqual(err, SKY_OK);
            var txsig0 = new cipher_Sig();
            var txsig1 = new cipher_Sig();

            err = SKY_coin_Transaction_GetSignatureAt(handle, 0, txsig0);
            Assert.AreEqual(err, SKY_OK);
            err = SKY_coin_Transaction_GetSignatureAt(handle, 1, txsig1);
            Assert.AreEqual(err, SKY_OK);
        }