Exemple #1
0
        public void RecoverSanity()
        {
            H256       messageHash = "0xce7df6b1b2852c5c156b683a9f8d4a8daeda2f35f025cb0cf34943dcac70d6a3";
            PrivateKey key         = "0x97ddae0f3a25b92268175400149d65d6887b9cefaf28ea2c078e05cdc15a3c0a";

            string sPublicKey    = "0x7b83ad6afb1209f3c82ebeb08c0c5fa9bf6724548506f2fb4f991e2287a77090177316ca82b0bdf70cd9dee145c3002c0da1d92626449875972a27807b73b42e";
            string compressedKey = "0x027b83ad6afb1209f3c82ebeb08c0c5fa9bf6724548506f2fb4f991e2287a77090";
            string expectedR     = "0x6f0156091cbe912f2d5d1215cc3cd81c0963c8839b93af60e0921b61a19c5430";
            string expectedS     = "0x0c71006dd93f3508c432daca21db0095f4b16542782b7986f48a5d0ae3c583d4";
            byte   expectedV     = 1;

            Assert.Equal(sPublicKey, Hex.ToString(key.PublicKey.Key));
            Assert.Equal(compressedKey, Hex.ToString(key.PublicKey.CompressedKey));

            Signature sig = key.Sign(messageHash);

            Assert.Equal(expectedR, Hex.ToString(sig.R));
            Assert.Equal(expectedS, Hex.ToString(sig.S));
            Assert.Equal(expectedV, sig.V);

            PublicKey recovered = sig.GetPublicKey(messageHash);

            Assert.Equal(sPublicKey, Hex.ToString(recovered.Key));
            Assert.True(recovered.Verify(sig, messageHash));
        }
Exemple #2
0
        public void TrieShouldUpdatable(int repeats)
        {
            const string path = "data1";

            // leveldb
            FileDB.Destroy(path);
            FileDB db = new FileDB(path, true);

            // 랜덤 키 생성 : 키의 길이는 1 - 64
            List <byte[]> keys = new List <byte[]>();

            for (int i = 0; i < repeats; i++)
            {
                keys.Add(SecureRandom.GetBytes(SecureRandom.Next(1, 65)));
            }

            ITrie trie = new Trie(db);

            // put
            foreach (var key in keys)
            {
                trie.Put(key, key.Hash256());
            }

            // update
            foreach (var key in keys)
            {
                trie.Put(key, key.Hash512());
            }

            H256 root = trie.Commit();

            trie.Dispose();

            // update된 내용이 맞는지 확인
            trie = new Trie(db, root);
            foreach (var key in keys)
            {
                Assert.Equal(key.Hash512(), trie.Get(key));
            }

            // 모든 키 삭제
            foreach (var key in keys)
            {
                trie.Del(key);
            }

            root = trie.Commit();
            trie.Dispose();

            // 키에 해당하는 내용이 있는지 확인
            trie = new Trie(db, root);
            foreach (var key in keys)
            {
                Assert.Null(trie.Get(key));
            }
        }
Exemple #3
0
        public void TrieShouldWorksWithLevelDB(int repeats)
        {
            const string path = "data";

            // leveldb
            FileDB.Destroy(path);
            FileDB db = new FileDB(path, true);

            // 랜덤 키 생성 : 키의 길이는 1 - 64
            List <byte[]> keys = new List <byte[]>();

            for (int i = 0; i < repeats; i++)
            {
                keys.Add(SecureRandom.GetBytes(SecureRandom.Next(1, 65)));
            }

            // for BaseTrie
            {
                ITrie trie = new Trie(db);
                foreach (var key in keys)
                {
                    trie.Put(key, key.Hash256());
                }

                H256 root = trie.Commit();
                trie.Dispose();

                ITrie trie2 = new Trie(db, root);
                foreach (var key in keys)
                {
                    Assert.Equal(key.Hash256(), trie2.Get(key));
                }
            }

            // for SecureTrie
            {
                ITrie trie = new SecureTrie(db);
                foreach (var key in keys)
                {
                    trie.Put(key, key.Hash256());
                }

                H256 root = trie.Commit();
                trie.Dispose();

                ITrie trie2 = new SecureTrie(db, root);
                foreach (var key in keys)
                {
                    Assert.Equal(key.Hash256(), trie2.Get(key));
                }
            }
        }
Exemple #4
0
        public void SignerShouldBeDeterministic()
        {
            for (int i = 0; i < repeats; i++)
            {
                H256 messageHash = SecureRandom.GetBytes(H256.BYTE_LENGTH);

                PrivateKey privateKey = PrivateKey.CreateKey();

                Signature sig1 = privateKey.Sign(messageHash);
                Signature sig2 = privateKey.Sign(messageHash);

                Assert.Equal(sig1, sig2);
            }
        }
Exemple #5
0
        public void SignerShouldRecoverableWithValidRecoverId()
        {
            for (int i = 0; i < repeats; i++)
            {
                H256 messageHash = SecureRandom.GetBytes(H256.BYTE_LENGTH);

                PrivateKey privateKey = PrivateKey.CreateKey();

                Signature sig = privateKey.Sign(messageHash);

                Assert.True(sig.V < 4);
                Assert.Equal(privateKey.PublicKey, sig.GetPublicKey(messageHash));

                byte[] bytes = sig;
                bytes[64] = 99;

                Signature wrong = Signature.Parse(bytes);
                Assert.NotEqual(privateKey.PublicKey, wrong.GetPublicKey(messageHash));
            }
        }
Exemple #6
0
        public void SignerShouldGenerateValidKey()
        {
            for (int i = 0; i < repeats; i++)
            {
                H256 messageHash = SecureRandom.GetBytes(H256.BYTE_LENGTH);

                PrivateKey secKey = PrivateKey.CreateKey();
                PublicKey  pubKey = secKey.PublicKey;
                Signature  sig    = secKey.Sign(messageHash);

                // private key verify
                Assert.True(Secp256k1Helper.SecretKeyVerify(secKey.Key));

                // private key, public key, signature length verify
                Assert.Equal(PrivateKey.KEY_LENGTH, secKey.Key.Length);
                Assert.Equal(PublicKey.KEY_LENGTH, pubKey.Length);
                Assert.Equal(Signature.LENGTH, sig.Length);

                // verify signature
                Assert.True(pubKey.Verify(sig, messageHash));
                Assert.Equal(pubKey, sig.GetPublicKey(messageHash));
            }
        }
Exemple #7
0
        public static PrivateKey CreateKey(byte[] seed)
        {
            H256 key = seed.IsNullOrEmpty() ? SecureRandom.GetBytes(KEY_LENGTH) : seed.Hash256();

            return(CheckPrivateKey(key) ? new PrivateKey(key) : CreateKey(key));
        }
Exemple #8
0
 public static bool CheckPrivateKey(H256 key)
 {
     return(Secp256k1Helper.SecretKeyVerify(key));
 }
Exemple #9
0
 public SecureTrie(ITrieDB db, H256 rootHash) : base(db, rootHash)
 {
 }
Exemple #10
0
 public byte[] Read(H256 hash)
 {
     return(!ReferenceEquals(hash, null) ? db.Get(hash) : null);
 }
Exemple #11
0
 public Trie(ITrieDB db, H256 rootHash) : this(db)
 {
     this.rootHash = rootHash;
     RootNode      = GetNodeByHash(rootHash);
 }
Exemple #12
0
 protected TrieNode GetNodeByHash(H256 hash)
 {
     byte[] rlp = Read(hash);
     return(rlp.IsNullOrEmpty() ? null : new TrieNode(this, rlp));
 }
Exemple #13
0
 public bool Remove(H256 txid)
 {
     lock (txs)
         return(txs.Remove(txid));
 }
Exemple #14
0
 public Tx Get(H256 txid)
 {
     lock (txs)
         return(txs.TryGetValue(txid, out Tx tx) ? tx : null);
 }