Esempio n. 1
0
        /// <summary>
        /// Change partial ownership.
        /// </summary>
        /// <returns>The partial one.</returns>
        /// <param name="password">Password.</param>
        /// <param name="coin">Coin.</param>
        /// <param name="redemptionKey">Redemption key.</param>
        public CoinDto SwapPartialOne(SecureString password, CoinDto coin, RedemptionKeyDto redemptionKey)
        {
            if (password == null)
            {
                throw new ArgumentNullException(nameof(password));
            }

            if (coin == null)
            {
                throw new ArgumentNullException(nameof(coin));
            }

            if (redemptionKey == null)
            {
                throw new ArgumentNullException(nameof(redemptionKey));
            }

            var v1 = coin.Version + 1;
            var v2 = coin.Version + 2;
            var v3 = coin.Version + 3;

            coin.Keeper    = DeriveKey(v2, coin.Stamp, DeriveKey(v3, coin.Stamp, DeriveKey(v3, coin.Stamp, password).ToSecureString()).ToSecureString());
            coin.Version   = v1;
            coin.Principle = redemptionKey.Key1;
            coin.Stamp     = coin.Stamp;
            coin.Envelope  = coin.Envelope;
            coin.Hint      = redemptionKey.Key2;

            return(coin);
        }
Esempio n. 2
0
        /// <summary>
        /// Partial release one secret key for escrow.
        /// </summary>
        /// <returns>The release.</returns>
        /// <param name="version">Version.</param>
        /// <param name="stamp">Stamp.</param>
        /// <param name="memo">Memo.</param>
        /// <param name="password">Password.</param>
        public string PartialRelease(int version, string stamp, string memo, SecureString password)
        {
            if (string.IsNullOrEmpty(stamp))
            {
                throw new ArgumentNullException(nameof(stamp));
            }

            if (memo == null)
            {
                throw new ArgumentNullException(nameof(memo));
            }

            if (password == null)
            {
                throw new ArgumentNullException(nameof(password));
            }

            var subKey1    = DeriveKey(version + 1, stamp, password);
            var subKey2    = DeriveKey(version + 2, stamp, password).ToSecureString();
            var mix        = DeriveKey(version + 2, stamp, subKey2);
            var redemption = new RedemptionKeyDto()
            {
                Key1 = subKey1, Key2 = mix, Memo = memo, Stamp = stamp
            };

            return(JsonConvert.SerializeObject(redemption));
        }
Esempio n. 3
0
        /// <summary>
        /// Change ownership.
        /// </summary>
        /// <returns>The swap.</returns>
        /// <param name="password">Password.</param>
        /// <param name="coin">Coin.</param>
        /// <param name="redemptionKey">Redemption key.</param>
        public (CoinDto, CoinDto) CoinSwap(SecureString password, CoinDto coin, RedemptionKeyDto redemptionKey)
        {
            if (password == null)
            {
                throw new ArgumentNullException(nameof(password));
            }

            if (coin == null)
            {
                throw new ArgumentNullException(nameof(coin));
            }

            if (redemptionKey == null)
            {
                throw new ArgumentNullException(nameof(redemptionKey));
            }

            if (!redemptionKey.Stamp.Equals(coin.Stamp))
            {
                throw new Exception("Redemption stamp is not equal to the coins stamp!");
            }

            var v1 = coin.Version + 1;
            var v2 = coin.Version + 2;
            var v3 = coin.Version + 3;
            var v4 = coin.Version + 4;

            var c1 = new CoinDto()
            {
                Keeper    = DeriveKey(v2, redemptionKey.Stamp, DeriveKey(v3, redemptionKey.Stamp, DeriveKey(v3, redemptionKey.Stamp, password).ToSecureString()).ToSecureString()),
                Version   = v1,
                Principle = redemptionKey.Key1,
                Stamp     = redemptionKey.Stamp,
                Envelope  = coin.Envelope,
                Hint      = DeriveKey(v2, redemptionKey.Stamp, redemptionKey.Key2.ToSecureString())
            };

            c1.Hash = Hash(c1).ToHex();

            var c2 = new CoinDto()
            {
                Keeper    = DeriveKey(v3, redemptionKey.Stamp, DeriveKey(v4, redemptionKey.Stamp, DeriveKey(v4, redemptionKey.Stamp, password).ToSecureString()).ToSecureString()),
                Version   = v2,
                Principle = redemptionKey.Key2,
                Stamp     = redemptionKey.Stamp,
                Envelope  = coin.Envelope,
                Hint      = DeriveKey(v3, redemptionKey.Stamp, DeriveKey(v3, redemptionKey.Stamp, password).ToSecureString())
            };

            c2.Hash = Hash(c2).ToHex();

            return(c1, c2);
        }
Esempio n. 4
0
        /// <summary>
        /// Partial release one secret key for escrow.
        /// </summary>
        /// <returns>The release.</returns>
        /// <param name="version">Version.</param>
        /// <param name="stamp">Stamp.</param>
        /// <param name="memo">Memo.</param>
        /// <param name="secret">secret.</param>
        public string PartialRelease(int version, string stamp, string memo, SecureString secret, SecureString salt)
        {
            Guard.Argument(stamp, nameof(stamp)).NotNull().NotEmpty();
            Guard.Argument(secret, nameof(secret)).NotNull();

            var subKey1    = DeriveKey(version + 1, stamp, secret, salt);
            var subKey2    = DeriveKey(version + 2, stamp, secret, salt).ToSecureString();
            var mix        = DeriveKey(version + 2, stamp, subKey2, salt);
            var redemption = new RedemptionKeyDto {
                Key1 = subKey1, Key2 = mix, Memo = memo, Stamp = stamp
            };

            return(JsonConvert.SerializeObject(redemption));
        }
Esempio n. 5
0
        /// <summary>
        /// Change ownership.
        /// </summary>
        /// <returns>The swap.</returns>
        /// <param name="secret">secret.</param>
        /// <param name="coin">Coin.</param>
        /// <param name="redemptionKey">Redemption key.</param>
        public (CoinDto, CoinDto) CoinSwap(SecureString secret, CoinDto coin, RedemptionKeyDto redemptionKey)
        {
            Guard.Argument(secret, nameof(secret)).NotNull();
            Guard.Argument(coin, nameof(coin)).NotNull();
            Guard.Argument(redemptionKey, nameof(redemptionKey)).NotNull();

            try
            { coin = coin.FormatCoinFromBase64(); }
            catch (FormatException) { }

            if (!redemptionKey.Stamp.Equals(coin.Stamp))
            {
                throw new Exception("Redemption stamp is not equal to the coins stamp!");
            }

            var v1 = coin.Version + 1;
            var v2 = coin.Version + 2;
            var v3 = coin.Version + 3;
            var v4 = coin.Version + 4;

            var c1 = new CoinDto()
            {
                Keeper    = DeriveKey(v2, redemptionKey.Stamp, DeriveKey(v3, redemptionKey.Stamp, DeriveKey(v3, redemptionKey.Stamp, secret).ToSecureString()).ToSecureString()),
                Version   = v1,
                Principle = redemptionKey.Key1,
                Stamp     = redemptionKey.Stamp,
                Envelope  = coin.Envelope,
                Hint      = DeriveKey(v2, redemptionKey.Stamp, redemptionKey.Key2.ToSecureString())
            };

            c1.Hash = Hash(c1).ToHex();

            var c2 = new CoinDto()
            {
                Keeper    = DeriveKey(v3, redemptionKey.Stamp, DeriveKey(v4, redemptionKey.Stamp, DeriveKey(v4, redemptionKey.Stamp, secret).ToSecureString()).ToSecureString()),
                Version   = v2,
                Principle = redemptionKey.Key2,
                Stamp     = redemptionKey.Stamp,
                Envelope  = coin.Envelope,
                Hint      = DeriveKey(v3, redemptionKey.Stamp, DeriveKey(v3, redemptionKey.Stamp, secret).ToSecureString())
            };

            c2.Hash = Hash(c2).ToHex();

            return(c1, c2);
        }
Esempio n. 6
0
        /// <summary>
        /// Change partial ownership.
        /// </summary>
        /// <returns>The partial one.</returns>
        /// <param name="secret">secret.</param>
        /// <param name="coin">Coin.</param>
        /// <param name="redemptionKey">Redemption key.</param>
        public CoinDto SwapPartialOne(SecureString secret, CoinDto coin, RedemptionKeyDto redemptionKey)
        {
            Guard.Argument(secret, nameof(secret)).NotNull();
            Guard.Argument(coin, nameof(coin)).NotNull();
            Guard.Argument(redemptionKey, nameof(redemptionKey)).NotNull();

            var v1 = coin.Version + 1;
            var v2 = coin.Version + 2;
            var v3 = coin.Version + 3;

            coin.Keeper    = DeriveKey(v2, coin.Stamp, DeriveKey(v3, coin.Stamp, DeriveKey(v3, coin.Stamp, secret).ToSecureString()).ToSecureString());
            coin.Version   = v1;
            coin.Principle = redemptionKey.Key1;
            coin.Stamp     = coin.Stamp;
            coin.Envelope  = coin.Envelope;
            coin.Hint      = redemptionKey.Key2;

            return(coin);
        }