Пример #1
0
        public static string GetGlobalAddress(IMicheline value)
        {
            var bytes = LocalForge.ForgeMicheline(value);
            var hash  = Blake2b.GetDigest(bytes);

            return(Base58.Convert(hash, Prefix.expr));
        }
Пример #2
0
        public string GetKeyHash(IMicheline key)
        {
            var optimized = Key.Optimize(Micheline.FromBytes(key.ToBytes()));
            var packed = new byte[] { 5 }.Concat(LocalForge.ForgeMicheline(optimized));
            var hash = Blake2b.GetDigest(packed);

            return(Base58.Convert(hash, Prefix.expr));
        }
Пример #3
0
        public bool Verify(byte[] msg, byte[] sig, byte[] pubKey)
        {
            var keyedHash = Blake2b.GetDigest(msg);
            var publicKey = new Ed25519PublicKeyParameters(pubKey, 0);
            var verifier  = new Ed25519Signer();

            verifier.Init(false, publicKey);
            verifier.BlockUpdate(keyedHash, 0, keyedHash.Length);

            return(verifier.VerifySignature(sig));
        }
Пример #4
0
        public Signature Sign(byte[] msg, byte[] prvKey)
        {
            var digest     = Blake2b.GetDigest(msg);
            var privateKey = new Ed25519PrivateKeyParameters(prvKey, 0);
            var signer     = new Ed25519Signer();

            signer.Init(true, privateKey);
            signer.BlockUpdate(digest, 0, digest.Length);

            return(new Signature(signer.GenerateSignature(), _SignaturePrefix));
        }
Пример #5
0
        public static string GetContractAddress(int index)
        {
            var hash = new byte[32]
            {
                72, 1, 189, 111, 8, 152, 13, 214, 38, 163, 228, 90, 249, 51, 127, 242,
                206, 198, 138, 55, 219, 134, 18, 158, 128, 96, 185, 73, 180, 9, 86, 229
            };
            var address = Blake2b.GetDigest(hash.Concat(GetBytes(index)).ToArray(), 160);

            return(Base58.Convert(address, new byte[] { 2, 90, 121 }));
        }
Пример #6
0
        public override bool Verify(byte[] msg, byte[] sig, byte[] pubKey)
        {
            var digest = Blake2b.GetDigest(msg);
            var r      = sig.GetBytes(0, 32);
            var s      = sig.GetBytes(32, 32);

            var curve      = SecNamedCurves.GetByName("secp256k1");
            var parameters = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());
            var publicKey  = new ECPublicKeyParameters(curve.Curve.DecodePoint(pubKey), parameters);
            var signer     = new ECDsaSigner();

            signer.Init(false, publicKey);
            return(signer.VerifySignature(digest, new BigInteger(1, r), new BigInteger(1, s)));
        }
Пример #7
0
        public Signature Sign(byte[] msg, byte[] prvKey)
        {
            var keyedHash  = Blake2b.GetDigest(msg);
            var curve      = SecNamedCurves.GetByName("secp256r1");
            var parameters = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());
            var key        = new ECPrivateKeyParameters(new BigInteger(prvKey), parameters);
            var signer     = new ECDsaSigner(new HMacDsaKCalculator(new Blake2bDigest(256)));

            signer.Init(true, parameters: key);
            var rs = signer.GenerateSignature(keyedHash);

            var r = rs[0].ToByteArrayUnsigned();
            var s = rs[1].ToByteArrayUnsigned();

            return(new Signature(r.Concat(s), _SignaturePrefix));
        }
Пример #8
0
        public override Signature Sign(byte[] msg, byte[] prvKey)
        {
            var curve      = SecNamedCurves.GetByName("secp256k1");
            var parameters = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());
            var privateKey = new ECPrivateKeyParameters(new BigInteger(1, prvKey), parameters);
            var signer     = new ECDsaSigner(new HMacDsaKCalculator(new Blake2bDigest(256)));

            signer.Init(true, privateKey);
            var rs = signer.GenerateSignature(Blake2b.GetDigest(msg));

            if (rs[1].CompareTo(curve.N.Divide(BigInteger.Two)) > 0)
            {
                rs[1] = curve.N.Subtract(rs[1]);
            }

            var r = rs[0].ToByteArrayUnsigned().Align(32);
            var s = rs[1].ToByteArrayUnsigned().Align(32);

            return(new Signature(r.Concat(s), SignaturePrefix));
        }
Пример #9
0
        public static int GetHash(byte[] bytes)
        {
            var hash = Blake2b.GetDigest(bytes, 32);

            return((hash[0] << 24) | (hash[1] << 16) | (hash[2] << 8) | (hash[3]));
        }
Пример #10
0
        public bool TryAuthenticate(AuthHeaders headers, string json, out string error)
        {
            error = null;

            if (string.IsNullOrEmpty(headers.User))
            {
                error = $"The X-TZKT-USER header is required";
                return(false);
            }

            if (headers.Nonce == null)
            {
                error = $"The X-TZKT-NONCE header is required";
                return(false);
            }

            if (string.IsNullOrEmpty(headers.Signature))
            {
                error = $"The X-TZKT-SIGNATURE header is required";
                return(false);
            }

            if (string.IsNullOrEmpty(json))
            {
                error = $"The body is empty";
                return(false);
            }

            if (!Config.Credentials.TryGetValue(headers.User, out var pubKey))
            {
                error = $"User {headers.User} doesn't exist";
                return(false);
            }

            var nonce     = (long)headers.Nonce;
            var nonceTime = DateTime.UnixEpoch.AddMilliseconds(nonce);

            if (nonceTime < DateTime.UtcNow.AddSeconds(-Config.NonceLifetime))
            {
                error = $"Nonce too old. Server time: {DateTime.UtcNow}, nonce: {nonceTime}";
                return(false);
            }

            if (nonce <= Nonces[headers.User])
            {
                error = $"Nonce {nonce} has already used";
                return(false);
            }

            var hash = Hex.Convert(Blake2b.GetDigest(Utf8.Parse(json)));

            var key = PubKey.FromBase58(pubKey);

            if (!key.Verify($"{headers.Nonce}{hash}", headers.Signature))
            {
                error = $"Invalid signature";
                return(false);
            }

            Nonces[headers.User] = nonce;
            return(true);
        }