/// <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); }
/// <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)); }
/// <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); }
/// <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)); }
/// <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); }
/// <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); }