public async Task CreateBreachProofPassword_Should_ThrowAnException_IfProofIsNotValid()
        {
            var password = "******";

            var crypto = Substitute.For <IPythiaCrypto>();

            crypto.Blind(password).Returns(Builder <BlindingResult> .CreateNew().Build());
            crypto.GenerateSalt().Returns(GetRandom.Bytes());
            crypto.Verify(Arg.Any <PythiaProofParams>()).Returns(false);

            var accessToken = Substitute.For <IAccessToken>();
            var provider    = Substitute.For <IAccessTokenProvider>();

            provider.GetTokenAsync(null).Returns(Task.FromResult(accessToken));

            var client = Substitute.For <IPythiaClient>();
            var model  = Builder <TransformResultModel> .CreateNew()
                         .With(it => it.Proof = Builder <ProofModel> .CreateNew().Build())
                         .Build();

            client.TransformPasswordAsync(Arg.Any <TransformModel>(), Arg.Any <string>()).Returns(Task.FromResult(model));

            var proofKeys = new[] { "PK.1.AgwhFXaYR7EWiTxeCCj269+cZKcRiT7x2Ifbyi4HrMnpSCapaoUzoK8rIJSNJC++jA==" };
            var protocol  = new PythiaProtocol(client, crypto, provider, proofKeys);
            var result    = await protocol.CreateBreachProofPasswordAsync(password);
        }
        public async Task CreateBreachProofPassword_Should_SelectProofKeyWithLatestVersion()
        {
            var password = "******";

            var crypto = Substitute.For <IPythiaCrypto>();

            crypto.Blind(password).Returns(Builder <BlindingResult> .CreateNew().Build());
            crypto.GenerateSalt().Returns(GetRandom.Bytes());
            crypto.Verify(Arg.Any <PythiaProofParams>()).Returns(true);

            var accessToken = Substitute.For <IAccessToken>();
            var provider    = Substitute.For <IAccessTokenProvider>();

            provider.GetTokenAsync(null).Returns(Task.FromResult(accessToken));

            var client = Substitute.For <IPythiaClient>();
            var model  = Builder <TransformResultModel> .CreateNew()
                         .With(it => it.Proof = Builder <ProofModel> .CreateNew().Build())
                         .Build();

            client.TransformPasswordAsync(Arg.Any <TransformModel>(), Arg.Any <string>()).Returns(Task.FromResult(model));

            var proofKeys = AppSettings.Get.ProtocolTestData.ProofKeys;
            var protocol  = new PythiaProtocol(client, crypto, provider, proofKeys);
            var result    = await protocol.CreateBreachProofPasswordAsync(password);

            var tm = (TransformModel)client.ReceivedCalls().Single().GetArguments().First();

            tm.Version.Should().Be(5);
        }
        public async Task CreateBreachProofPassword_Should_AlwaysRequestProofFromService()
        {
            var password = "******";

            var crypto = Substitute.For <IPythiaCrypto>();

            crypto.Blind(password).Returns(Builder <BlindingResult> .CreateNew().Build());
            crypto.GenerateSalt().Returns(GetRandom.Bytes());
            crypto.Verify(Arg.Any <PythiaProofParams>()).Returns(true);

            var accessToken = Substitute.For <IAccessToken>();
            var provider    = Substitute.For <IAccessTokenProvider>();

            provider.GetTokenAsync(null).Returns(Task.FromResult(accessToken));

            var client = Substitute.For <IPythiaClient>();
            var model  = Builder <TransformResultModel> .CreateNew()
                         .With(it => it.Proof = Builder <ProofModel> .CreateNew().Build())
                         .Build();

            client.TransformPasswordAsync(Arg.Any <TransformModel>(), Arg.Any <string>()).Returns(Task.FromResult(model));

            var proofKeys = new[] { "PK.1.AgwhFXaYR7EWiTxeCCj269+cZKcRiT7x2Ifbyi4HrMnpSCapaoUzoK8rIJSNJC++jA==" };
            var protocol  = new PythiaProtocol(client, crypto, provider, proofKeys);
            var result    = await protocol.CreateBreachProofPasswordAsync(password);

            var tm = (TransformModel)client.ReceivedCalls().Single().GetArguments().First();

            tm.IncludeProof.Should().BeTrue();
        }
Пример #4
0
        public async Task YTC13()
        {
            var config = new PythiaProtocolConfig
            {
                AppId     = AppSettings.Get.AppId,
                ApiKey    = AppSettings.Get.ApiKey,
                ApiKeyId  = AppSettings.Get.ApiKeyId,
                ProofKeys = new[] { AppSettings.Get.ProofKeys[0] }
            };

            var protocol = PythiaProtocol.Initialize(config);

            var bpp1 = await protocol.CreateBreachProofPasswordAsync("some password");

            await Task.Delay(TimeSpan.FromSeconds(1));

            var bpp2 = await protocol.CreateBreachProofPasswordAsync("some password");

            await Task.Delay(TimeSpan.FromSeconds(1));

            bpp1.Salt.Should().HaveCount(32);
            bpp2.Salt.Should().HaveCount(32);

            bpp1.DeblindedPassword.Should().HaveCountGreaterThan(300);
            bpp2.DeblindedPassword.Should().HaveCountGreaterThan(300);

            bpp1.Version.Should().Be(1);
            bpp2.Version.Should().Be(1);

            bpp1.Salt.Should().NotBeEquivalentTo(bpp2.Salt);
            bpp1.DeblindedPassword.Should().NotBeEquivalentTo(bpp2.DeblindedPassword);
        }
Пример #5
0
        public async Task YTC17()
        {
            var config1 = new PythiaProtocolConfig
            {
                AppId     = AppSettings.Get.AppId,
                ApiKey    = AppSettings.Get.ApiKey,
                ApiKeyId  = AppSettings.Get.ApiKeyId,
                ProofKeys = AppSettings.Get.ProofKeys.Take(2)
            };

            var protocol1 = PythiaProtocol.Initialize(config1);

            var config2 = new PythiaProtocolConfig
            {
                AppId     = AppSettings.Get.AppId,
                ApiKey    = AppSettings.Get.ApiKey,
                ApiKeyId  = AppSettings.Get.ApiKeyId,
                ProofKeys = AppSettings.Get.ProofKeys
            };

            var protocol2 = PythiaProtocol.Initialize(config2);
            var bpp1      = await protocol1.CreateBreachProofPasswordAsync("some password");

            var bpp2 = protocol2.UpdateBreachProofPassword(AppSettings.Get.UpdateToken, bpp1);

            bpp1.Version.Should().Be(2);

            bpp2.Salt.Should().BeEquivalentTo(bpp1.Salt);
            bpp2.DeblindedPassword.Should().NotBeEquivalentTo(bpp1.DeblindedPassword);
            bpp2.Version.Should().Be(3);
        }
        public async Task CreateBreachProofPassword_Should_ThrowAnException_IfGivenPasswordIsNullOrEmpty()
        {
            var client    = Substitute.For <IPythiaClient>();
            var crypto    = Substitute.For <IPythiaCrypto>();
            var provider  = Substitute.For <IAccessTokenProvider>();
            var proofKeys = new[] { "PK.1.AgwhFXaYR7EWiTxeCCj269+cZKcRiT7x2Ifbyi4HrMnpSCapaoUzoK8rIJSNJC++jA==" };

            var protocol = new PythiaProtocol(client, crypto, provider, proofKeys);
            var result   = await protocol.CreateBreachProofPasswordAsync("");
        }
        public void Initialize_Should_ThrowAnException_IfProofKeysAreEmpty()
        {
            var config = new PythiaProtocolConfig
            {
                AppId     = "cc420fcbe7ec442359f7a9f37dd84ea3",
                ApiKeyId  = "4cb31d32a58899fc968ac12573229789",
                ApiKey    = "MC4CAQAwBQYDK2VwBCIEIOBZP2yyDaGzHnZB5+PWtsshs0goN2RCSSNEuBtlg2DN",
                ProofKeys = new string[] { }
            };

            PythiaProtocol.Initialize(config);
        }
Пример #8
0
        public async Task YTC16()
        {
            var correnctPassword = "******";
            var wrongPassword    = "******";

            var crypto = Substitute.For <IPythiaCrypto>();

            crypto.Blind(correnctPassword).Returns(new PythiaCrypto().Blind(correnctPassword));
            crypto.Blind(wrongPassword).Returns(new PythiaCrypto().Blind(wrongPassword));
            crypto.Deblind(Arg.Any <byte[]>(), Arg.Any <byte[]>())
            .Returns((arg) => new PythiaCrypto().Deblind((byte[])arg[0], (byte[])arg[1]));
            crypto.GenerateSalt().Returns(new PythiaCrypto().GenerateSalt());
            crypto.Verify(Arg.Any <PythiaProofParams>()).Returns(true, false, false, false, false);

            var virgilCrypto = new VirgilCrypto();
            var signer       = new VirgilAccessTokenSigner();

            var apiKey    = virgilCrypto.ImportPrivateKey(Bytes.FromString(AppSettings.Get.ApiKey, StringEncoding.BASE64));
            var generator = new JwtGenerator(AppSettings.Get.AppId, apiKey, AppSettings.Get.ApiKeyId, TimeSpan.FromDays(1), signer);
            var jwt       = generator.GenerateToken("PYTHIA-CLIENT");

            var connection    = new ServiceConnection(AppSettings.Get.ApiURL);
            var tokenProvider = new ConstAccessTokenProvider(jwt);

            var client = new PythiaClient(connection, new NewtonsoftJsonSerializer());

            var protocol = new PythiaProtocol(client, crypto, tokenProvider, AppSettings.Get.ProofKeys.Skip(1));
            var bpp      = await protocol.CreateBreachProofPasswordAsync(correnctPassword);

            await Task.Delay(TimeSpan.FromSeconds(2));

            var verifyResult1 = await protocol.VerifyBreachProofPasswordAsync(correnctPassword, bpp, false);

            verifyResult1.Should().BeTrue();
            await Task.Delay(TimeSpan.FromSeconds(2));

            Func <Task> verifyResult2 = async() => { await protocol.VerifyBreachProofPasswordAsync(correnctPassword, bpp, true); };

            verifyResult2.Should().Throw <Exception>();
            await Task.Delay(TimeSpan.FromSeconds(2));

            var verifyResult3 = await protocol.VerifyBreachProofPasswordAsync(wrongPassword, bpp, false);

            verifyResult3.Should().BeFalse();
            await Task.Delay(TimeSpan.FromSeconds(2));

            Func <Task> verifyResult4 = async() => { await protocol.VerifyBreachProofPasswordAsync(wrongPassword, bpp, true); };

            verifyResult4.Should().Throw <Exception>();
            await Task.Delay(TimeSpan.FromSeconds(2));
        }
        public void Initialize_Should_ThrowAnException_IfProofKeyHasNotThreeSeporatingDots()
        {
            var config = new PythiaProtocolConfig
            {
                AppId     = "cc420fcbe7ec442359f7a9f37dd84ea3",
                ApiKeyId  = "4cb31d32a58899fc968ac12573229789",
                ApiKey    = "MC4CAQAwBQYDK2VwBCIEIOBZP2yyDaGzHnZB5+PWtsshs0goN2RCSSNEuBtlg2DN",
                ProofKeys = new[] {
                    "PK.1.test.AgwhFXaYR7EWiTxeCCj269+cZKcRiT7x2Ifbyi4HrMnpSCapaoUzoK8rIJSNJC++jA=="
                }
            };

            PythiaProtocol.Initialize(config);
        }
        public void Initialize_Should_ThrowAnException_IfApiKeyIsNullOrEmpty()
        {
            var config = new PythiaProtocolConfig
            {
                AppId     = "cc420fcbe7ec442359f7a9f37dd84ea3",
                ApiKeyId  = "4cb31d32a58899fc968ac12573229789",
                ApiKey    = string.Empty,
                ProofKeys = new string[] {
                    "PK.1.AgY1HeqcosokoAiZQ/vO28cubQej3BChFg51FkVXe3vGdCEAMiEUVhO0jPIE0bUGGA=="
                }
            };

            PythiaProtocol.Initialize(config);
        }
        public void Initialize_Should_ThrowAnException_IfApiKeyIdIsNullOrEmpty()
        {
            var config = new PythiaProtocolConfig
            {
                AppId     = "cc420fcbe7ec442359f7a9f37dd84ea3",
                ApiKeyId  = string.Empty,
                ApiKey    = "MC4CAQAwBQYDK2VwBCIEIOBZP2yyDaGzHnZB5+PWtsshs0goN2RCSSNEuBtlg2DN",
                ProofKeys = new string[] {
                    "PK.1.AgY1HeqcosokoAiZQ/vO28cubQej3BChFg51FkVXe3vGdCEAMiEUVhO0jPIE0bUGGA=="
                }
            };

            PythiaProtocol.Initialize(config);
        }
Пример #12
0
        public async Task YTC14()
        {
            var config = new PythiaProtocolConfig
            {
                AppId     = AppSettings.Get.AppId,
                ApiKey    = AppSettings.Get.ApiKey,
                ApiKeyId  = AppSettings.Get.ApiKeyId,
                ProofKeys = AppSettings.Get.ProofKeys
            };

            var protocol = PythiaProtocol.Initialize(config);

            var bpp = await protocol.CreateBreachProofPasswordAsync("some password");

            await Task.Delay(TimeSpan.FromSeconds(1));

            bpp.Version.Should().Be(3);
        }
Пример #13
0
        public async Task YTC18()
        {
            var config = new PythiaProtocolConfig
            {
                AppId     = AppSettings.Get.AppId,
                ApiKey    = AppSettings.Get.ApiKey,
                ApiKeyId  = AppSettings.Get.ApiKeyId,
                ProofKeys = AppSettings.Get.ProofKeys.Take(3)
            };

            var protocol = PythiaProtocol.Initialize(config);

            var bpp1 = await protocol.CreateBreachProofPasswordAsync("some password");

            Action result = () => protocol.UpdateBreachProofPassword(AppSettings.Get.UpdateToken, bpp1);

            result.Should().Throw <Exception>();
        }
Пример #14
0
        public async Task YTC15()
        {
            var config = new PythiaProtocolConfig
            {
                AppId     = AppSettings.Get.AppId,
                ApiKey    = AppSettings.Get.ApiKey,
                ApiKeyId  = AppSettings.Get.ApiKeyId,
                ProofKeys = AppSettings.Get.ProofKeys.Skip(1)
            };

            var protocol = PythiaProtocol.Initialize(config);
            var bpp      = await protocol.CreateBreachProofPasswordAsync("some password");

            await Task.Delay(TimeSpan.FromSeconds(2));

            var verifyResult1 = await protocol.VerifyBreachProofPasswordAsync("some password", bpp, false);

            await Task.Delay(TimeSpan.FromSeconds(2));

            var verifyResult2 = await protocol.VerifyBreachProofPasswordAsync("some password", bpp, true);

            await Task.Delay(TimeSpan.FromSeconds(2));

            var verifyResult3 = await protocol.VerifyBreachProofPasswordAsync("other password", bpp, false);

            await Task.Delay(TimeSpan.FromSeconds(2));

            var verifyResult4 = await protocol.VerifyBreachProofPasswordAsync("other password", bpp, true);

            await Task.Delay(TimeSpan.FromSeconds(2));

            verifyResult1.Should().BeTrue();
            verifyResult2.Should().BeTrue();
            verifyResult3.Should().BeFalse();
            verifyResult4.Should().BeFalse();
        }