public async Task TestIndexHasBeenWrittenFromAnotherSourceShouldSkipIndex() { var seed = Seed.Random(); // Publish a message as if it was published from another app var tempProvider = new InMemoryDeterministicSeedManager( new InMemoryResourceTracker(), new IssSigningHelper(new Curl(), new Curl(), new Curl()), new AddressGenerator(), IotaResourceProvider.Repository); var credentials = await tempProvider.CreateChannelCredentialsAsync(seed); var channel = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, IotaResourceProvider.Repository).Create( Mode.Restricted, credentials.Seed, IotaFhirRepository.SecurityLevel, credentials.ChannelKey); var message = channel.CreateMessage(TryteString.FromAsciiString("Test")); await channel.PublishAsync(message, 14, 1); // Create credentials that should skip the first index var provider = new InMemoryDeterministicSeedManager( new InMemoryResourceTracker(), new IssSigningHelper(new Curl(), new Curl(), new Curl()), new AddressGenerator(), IotaResourceProvider.Repository); await provider.CreateChannelCredentialsAsync(seed); Assert.AreEqual(1, provider.CurrentIndex); }
public async Task TestResourceUpdateAddsAndUpdatesInformation() { var iotaRepository = IotaResourceProvider.Repository; var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var tracker = new SqlLiteResourceTracker(channelFactory, subscriptionFactory, new RijndaelEncryption(Seed.Random().Value, Seed.Random().Value)); // fhir id will only be 64 chars long var resourceId = Seed.Random().Value.Substring(0, 64); await tracker.AddEntryAsync( new ResourceEntry { Channel = channelFactory.Create(Mode.Restricted, Seed.Random(), SecurityLevel.Medium, Seed.Random().Value, true), Subscription = subscriptionFactory.Create(new Hash(Seed.Random().Value), Mode.Restricted, Seed.Random().Value, true), ResourceRoots = new List <string> { resourceId } }); var resource = await tracker.GetEntryAsync(resourceId); resource.ResourceRoots.Add(Seed.Random().Value.Substring(0, 64)); await tracker.UpdateEntryAsync(resource); Assert.AreEqual(2, (await tracker.GetEntryAsync(resourceId)).ResourceRoots.Count); }
public void TestRestrictedMessageCreation32Bit() { var expectedPayload = new Bundle(); expectedPayload.AddTransfer(new Transfer { Address = new Address(), Message = new TryteString("AQRAQLYEXHTXQUVYAXBDJZFWM9QPHXNQRVVGEODVNZAQMPXIHVYDFLHKDBFLSEUDGHVGNYFLEBQTJORJ9BDWXYUBYQDBKYHXGCIRVRJLLRQCBFSYYFTRVRPYJTHIIOOFDISBILGHQCWXSNLRXRKPTBSBO9ENPHHCSTPGFEVK9GVOWCBTJKVRANFBPHEOQNTJJQNYWQSYYRXZMFHADWUQJVBOLP9BUV9PXUIAKDUGRICOLQXXSXNGNMUMBWJRJDBSUJWSPGLXMHBLUUSSWSQUTSWKRRPWURYJYHRHSRCLBEBMHKVFJMLYDDEIHHBCAZYLLNGMFTUSUZA9VAWSSFSKLDIFYDDZJXJZ9VRIADVEAPMRBBUAOJCWCWMBUEVGBFMXPHQEE9JNPLLSDBDJSLXZXISGDOAMGQSVMOMKOWTWJPYCDKXRRBBKLPJRJMN9LJZQZADQQYXNBNFQDBITXBXPSMWDNNJAODPSEJRQZCKTLSOLUIMOWXZHYXJOXAGRJC9NNGWLYY9VQYW9IYFCQWDZQJDNWHVIXEIYSHTSOGRHMPQZ9YUTWDCRUEZGJTKVDRFNZVRBVAJBBNHILDFSBPNJKBUVXW9CDOEGVFPAWUZROYEBYT9NHI9DNGLHWPSKMJELJSMVTRNGEJNAMNEWUQ9GSRANMRIEB9GWXJD9GX9EHTRNYEYZJFKALYJVPUITHKGMM9QJDOKHWXQ9YN9ZBBCRNESWWBPWZIQVGWDQSRVROIRTPK9STFWRDDUFDKSLQQOXRWSSQCOHIJUJLPOBUVNWLOGGXDMEFOQHXSGQOZVQGYLUABLBJHXZRRIB9ZTLAXHHSRHAODYTSDTJUGRWVDJAJNRNDL9YVEPKLVAQFPAONMKOHHCLAZWFTAZTMEQKGNMNBYHBGNNOV99HCMQDRZEGGPAWA9FFO9SESTP9TSFXLCYPJJ9JKROY99VVHENCHSSSXKDAFRGOKAKIWCOHXYNFPKKWCBSGENRBX9FQFBITIO9999USHGAMQMBYPYPQANDGZXIPYVFZCTRGALNR9XGZBYAKQYIJDSBTWHIJQMOVOVBVCRUXZD9IGMODZPXLGTKYOWRVQC9YYVVBVMDRSUUPJDJUMLNCPGZJLTGQPQOXKGKUWASQQ9AER9JLWMQA9GLPATMVRDFIWLC9GBIKRXGJSZLPZVKGTWIIDCGXIDKMLQTCWTPICN9UZZXEOFFCQSJPOXFSCEHJNGIGOYIFZFMPWHJOFZGIYRFWOZCSSHKPWHDEELMN9ZWULHRMRHVNGTNUEZEMRINSVYEGBOJMNYFWNLFSIHHRIFXZRLEGFIEOT9WYZQXFTKXRAYRRKDV9VYUBSZAKARAIZYDWBEDLLOCAXQZIXSIRFGCGZWVRRCME9TXPTDUYLYUGLIBENQ99SDQLYFBJZHGQYQBLJMLFZLQLPHYMCFMTOSDA99DXAMCEAMBGNFFDJIKTUCBHSYKH9KLRVBYXOJJYKZYXJLIKIZFQHNFWWNCQACXZIXDLJXNU9UNZQJMFLJJXGSEPXIFRDKSUENGGELMFPVQKHAYPHMIPHVKZTNFTWMERRTVFHJLKILHRX9XSVYJZQKQXIMIMPDGCNXZKXUBNZOVXMCZXGXZTVBTIQUZ9GDQJGIHFKFXYZHDNGPIUXLIKSDBQQNMJCVRJUKQVJWGOFOBTXDSFLM9BGYZJREIBUBEVCOME9NNKHFEKWGJRTMZFDHFZY9YHTFJNCNZBGMVEEKUYPZBYQQFVVZEFSQDXOWTNUSU9GUTS9ITJAYYELPZYITWELVOAKMPTUIL9UJD9TN9HVLIYWAHMQBIHLUSBRSAGXQRAOOKGIBYMM9AOLC9DQVMNFMPGDSQUTWMRKVKE9FRZNCQJDVDKBINILRFKBEEDZTWI9UUCNLIMT9MLQRMBRJQLKHJXEKWJDEK9WAKXUJVWMUNLBUSVYSUZDOIEJAKZZOWPQFNKDLPDICGTQKOSBPWKHGPBUWYXWYVPIOIELDLIBPI9FJRSHVEKRNMQ9VPOCCCASWKL99TZCFNHLHVMOOFNBGSRXYKCKJOLNEBYAFCRMDHOVWUZ9MIFDSRRFSHSIWIN9WLLXMOKCXYTTESFZUNMQAHYVOVQQH9YZVOQATUPEPGCCGTPBAAOSPJ9ALPYXONR9OCODZDJPNPMQIREEXICFQIWRZ99OPS9ALP9GLPTTWGRJHATSJJTEKFZDJYEUKBIAACLOALTSXWCCL9GBUTWIXVEW9HYLVKRRRAATNYMGSAKLUN9HJQPIMXJOYIDXNONMHXZUGXOFIQIFBTPYDXXMKOAUUNOJU9IIXFLSSWKOCRJKXNWKKAMJRMFYSMAOWSCI9NTRQKT99CIDHJMZWSDKAIKOYWHSCJZRQWWDZOC9TKXHXCDN9GTMMGXXHXIJFMTCQFTDAKPEPQLNVCIE9UMIYXHDQUGPJSHPMRFCHMPGOYHVATXBIGOCZAFDNTVMJRJIVQDLNQYNSASMLXPSFUMYBGHXTCFYDLOGOCDTWPZMVPKMP9EEXEKNMSTEQKFZIVU9DKHSEQA9XQNOKUK9ABSTZ9XRPDMDECMYRRGSYHEZDAWEDGTQSMRC9DQ9FUWS9QELTDYZCRFYABZKVLCFGVKYGYIWJGNQKI9ONMXWFJNFIEPZRSSLNUUQOXK9YXQYMWR9B9UAUXYYONKYUG9JAJOUMLKQOXBD9JBLAQHXBJINNLBXKYGYLPRLASOFISEFXG9KENN9YFFP9J9NVVYKAEFAUTIQRDTVKVHQYEWJOGQEUPSWEIMYWYYEZRGJUEDAHDYPQEGX9KTUODLORTCJZGJCKFGEJTWRGEACRRINEQBUWS9NUPP9BMONGQQABVGBLRQXZJYXDHS9DFWAWLOZVKSDZD9UGBPKDCHLYEAUOABXKMNWTSUZTHTZBYOALUHQHSEK9WPGWGVNQEGVDDFZJXLAYINRUQYQBROPB9RGAFWMPOBOANCGW9DJJ9NUIHLQE9RNZOHLPYAIACONJXYFRBAOVJEWOTO9HZCZOVJGHQOGGJAB9QUWDRI9KLX9EGOHGTJIYQHTTMAAETKGBLDQXGRTJOEHRIAPXACPFTVGIXUJFZXUCX9EHUESMGQN9EHXEQTSKJHWDIR9OJYP9USDPWECONYRTFZREIZHOBAOXK9FCEOWCLUNKEWKE9JPQGDZ9PWAVQUMNBLVMESODMGJAIVNVJSFTQFL9RTTCJAFIMIGXASIREOXLNVEHMHPQZIKIPRQWFGYLQHVPMBNIWTWINSKW9WIWVDKHAIHNMBOCETYLNTJMA9XMEVQBPUFPKXJHXHPQCFKF9UYQQFKBBPPZMNAKPMMHPLBPDAOACLZ9HKVFGGMQHHHQLWYWYYGNXPEITKTVNURENFBAOBXITZDYCUSASIYEVJBYDLBIMUF9HILXKYH9IDYOFEQMBHJJBFDTNPDXSNSXCPUFGRIOXNYOSKHBILRWEFWZELL9GLNQOMPLMAPTOIJXSQXNPIW9XLMYEYVTNM9BVLVAIPZSYTCHHXGBQXHCBOQAUHZXKDWUREOOGKK9S9ZTKHGIQWHZOOFCGXBBCSYPGOGNRJLGVNWAGJZWKKLTHCJG9FJVRXMHQARRAHGUTITDDIMTIZAYARKJMQFCEAAOTHSHXDQKSNGMN99YGWRNLNMJXXFIQD9THOIHINYIEJMWRCZTAHJC9QIAKDIHIELNIMDKHFFWVCAHGMITJYNZ9XZSLFCGFFEQLONULNTQAJLOJTWO9BJQEBGTY9OCJBXKXNDEJWCDRYCNFDKYODHPAHQBGDXHMLVETVNRLRIJDHKAHZBAOFGMQFSTHPHBXKRAJFVIUDCKGNCDD9XTFDVNW9RLRNN9QRRUGOTMRRSVISCWE9ALTXCOCYHIQGXLGDB9RGICVSTUHJFWMWQCUICLJZCACGYCUHMGTGEJGAACGEXKJNJWKUGXRNBTEKIYUNXZZHXASCBPRDJAVXWESHU9DW9UVPJLWBKUXPDAIQ9JQPAHPMGVRUY9RLAMRTOKDVVUAZAPMNBSHRNNYDGC9BKAKKBPGHFDOHXCFWNSH9FZUMQHXMIUYKQLKHAYXPNEDYDUXTZXUKTBRJGBSZFMCNRZIQQLOLPRZPZBCX9EZBRUFGHGHBLYBLYYWZACGWGYRGV9IGZLTXOIMSCOTBNIGUXMOPVOFKIEUZASTZAHKXLYECJFLVZCORRFYDNVCYSKFCREQXXMDEHPSQFDERBICWFMOJS9PPSQYTVEXYSYGHWIWITZHRBZLHJWUYWQCAPLSBYJTJGCUXQPITAUJX9WEUVJDNUNKSDLHWDWKDQARSRKSLGLUCDNCERMKOJXCRXWCCYIAQZVGJLYTYQNGUDYYMXXL9XDBLEWPRMAY9DMMUHYUPMNBRRXJDIFDWEFJBRPYMPDPIPGXGXBMZ9JHAOISUMCNGUNCCPWKFJNBR9ZATRMDTOFDKMBQEZSCDSBNNEIUUCDHPHFBOBXLNGPOVZCATQRKVYSQHSHIVFZTW9BHPTPXUJGNNUBHWLZF9TBA9JONTWZRWHGHFIQGHAKSWBAHB99"), Tag = new Tag("ASDF"), Timestamp = Timestamp.UnixSecondsTimestamp }); expectedPayload.Finalize(); expectedPayload.Sign(); var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository()); var channelKey = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC"); var channel = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey); var message = channel.CreateMessage(new TryteString("IREALLYWANTTHISTOWORKINCSHARPASWELLPLEASEMAKEITHAPPEN")); Assert.AreEqual("RRPXQHDJY9BKXC9NGHDCSHRIDYORSUUEPFHXPQVDGSQTVYPCGVIZRWQINOUYFDUXTHFTKHLBOLYLHMKE9", message.Root.Value); Assert.AreEqual("BAVSMNXFTVBBEPXVROQYWBFHAELANDS9UFLDEOERJGKMXOGTL9UBEJF9WUDNGKUEDFZYAAFACRRRACDHV", message.Address.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", message.NextRoot.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", channel.NextRoot.Value); for (var i = 0; i < expectedPayload.Transactions.Count; i++) { Assert.AreEqual(expectedPayload.Transactions[i].Fragment.Value, message.Payload.Transactions[i].Fragment.Value); } }
static DependencyResolver() { var iotaRepository = new CachedIotaRestRepository( new FallbackIotaClient(new List <string> { "https://nodes.devnet.thetangle.org:443" }, 5000), new PoWSrvService()); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var encryption = new RijndaelEncryption("somenicekey", "somenicesalt"); var resourceTracker = new SqlLiteResourceTracker(channelFactory, subscriptionFactory, encryption); var fhirRepository = new IotaFhirRepository( iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, new SqlLiteDeterministicSeedManager( resourceTracker, new IssSigningHelper(new Curl(), new Curl(), new Curl()), new AddressGenerator(), iotaRepository, encryption)); var fhirParser = new FhirJsonParser(); var searchRepository = new SqlLiteSearchRepository(fhirParser); CreateResourceInteractor = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository); ReadResourceInteractor = new ReadResourceInteractor(fhirRepository, searchRepository); ValidateResourceInteractor = new ValidateResourceInteractor(fhirRepository, fhirParser); SearchResourcesInteractor = new SearchResourcesInteractor(fhirRepository, searchRepository); ResourceTracker = resourceTracker; }
public void TestPublicChannelCreation() { var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository()); var channel = channelFactory.Create(Mode.Public, seed); Assert.AreEqual(seed.Value, channel.Seed.Value); Assert.AreEqual(Mode.Public, channel.Mode); Assert.AreEqual(SecurityLevel.Medium, channel.SecurityLevel); }
public ClaimsService(ILogger <ClaimsService> logger) { m_logger = logger; // Connect to a node on one of the main networks. var iotaRepositoryUrl = Environment.GetEnvironmentVariable("IOTA_REPOSITORY"); m_logger.LogInformation($"Using IOTA_REPOSITORY={iotaRepositoryUrl}"); m_restIotaRepository = new RestIotaRepository(new RestClient(iotaRepositoryUrl)); m_mamChannelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, m_restIotaRepository); m_mamChannelSubscriptionFactory = new MamChannelSubscriptionFactory(m_restIotaRepository, CurlMamParser.Default, CurlMask.Default); }
public ResourceEntry ToResourceEntry(IEncryption encryption, MamChannelFactory channelFactory, MamChannelSubscriptionFactory subscriptionFactory) { var decryptedChannel = encryption.Decrypt(this.Channel); var decryptedSubscription = encryption.Decrypt(this.Subscription); return(new ResourceEntry { ResourceRoots = this.Roots.Split(';').ToList(), Channel = string.IsNullOrEmpty(decryptedChannel) ? null : channelFactory.CreateFromJson(decryptedChannel), Subscription = subscriptionFactory.CreateFromJson(decryptedSubscription) }); }
public ResourceTracker( MamChannelFactory channelFactory, MamChannelSubscriptionFactory subscriptionFactory, IEncryption encryption, string databaseFilename = "iotafhir.sqlite") { this.ChannelFactory = channelFactory; this.SubscriptionFactory = subscriptionFactory; this.Encryption = encryption; this.ConnectionString = databaseFilename; this.Init(databaseFilename); }
/// <inheritdoc /> protected override void Load(ContainerBuilder builder) { var connectionSupplier = new DefaultDbConnectionSupplier(); var iotaRepository = new CachedIotaRestRepository( new FallbackIotaClient(new List <string> { "https://nodes.devnet.thetangle.org:443" }, 5000), new PoWSrvService(), null, connectionSupplier, $"{DependencyResolver.LocalStoragePath}\\iotacache.sqlite"); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var encryption = new RijndaelEncryption("somenicekey", "somenicesalt"); var resourceTracker = new SqlLiteResourceTracker( channelFactory, subscriptionFactory, encryption, connectionSupplier, $"{DependencyResolver.LocalStoragePath}\\iotafhir.sqlite"); var seedManager = new SqlLiteDeterministicSeedManager( resourceTracker, new IssSigningHelper(new Curl(), new Curl(), new Curl()), new AddressGenerator(), iotaRepository, encryption, connectionSupplier, $"{DependencyResolver.LocalStoragePath}\\iotafhir.sqlite"); var fhirRepository = new IotaFhirRepository(iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, seedManager); var fhirParser = new FhirJsonParser(); var searchRepository = new SqlLiteSearchRepository(fhirParser, connectionSupplier, $"{DependencyResolver.LocalStoragePath}\\resources.sqlite"); var createInteractor = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository); var readInteractor = new ReadResourceInteractor(fhirRepository, searchRepository); var validationInteractor = new ValidateResourceInteractor(fhirRepository, fhirParser); var searchInteractor = new SearchResourcesInteractor(fhirRepository, searchRepository); var resourceImporter = new ResourceImporter(searchRepository, fhirRepository, seedManager); builder.RegisterInstance(createInteractor); builder.RegisterInstance(readInteractor); builder.RegisterInstance(validationInteractor); builder.RegisterInstance(searchInteractor); builder.RegisterInstance(resourceImporter); builder.RegisterInstance(seedManager).As <ISeedManager>(); builder.RegisterInstance(subscriptionFactory); }
private void InjectDependencies(IServiceCollection services) { var iotaRepository = new CachedIotaRestRepository( new FallbackIotaClient(new List <string> { "https://nodes.devnet.thetangle.org:443" }, 5000), new PoWService(new CpuPearlDiver())); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var encryption = new RijndaelEncryption("somenicekey", "somenicesalt"); var resourceTracker = new SqlLiteResourceTracker(channelFactory, subscriptionFactory, encryption); var seedManager = new SqlLiteDeterministicSeedManager( resourceTracker, new IssSigningHelper(new Curl(), new Curl(), new Curl()), new AddressGenerator(), iotaRepository, encryption); var fhirRepository = new IotaFhirRepository(iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, seedManager); var fhirParser = new FhirJsonParser(); var searchRepository = new SqlLiteSearchRepository(fhirParser); var createInteractor = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository); var readInteractor = new ReadResourceInteractor(fhirRepository, searchRepository); var readVersionInteractor = new ReadResourceVersionInteractor(fhirRepository); var readHistoryInteractor = new ReadResourceHistoryInteractor(fhirRepository); var capabilitiesInteractor = new GetCapabilitiesInteractor(fhirRepository, new AppConfigSystemInformation(this.Configuration)); var validationInteractor = new ValidateResourceInteractor(fhirRepository, fhirParser); var searchInteractor = new SearchResourcesInteractor(fhirRepository, searchRepository); var deleteInteractor = new DeleteResourceInteractor(fhirRepository, searchRepository); var resourceImporter = new ResourceImporter(searchRepository, fhirRepository, seedManager); services.AddScoped(provider => createInteractor); services.AddScoped(provider => readInteractor); services.AddScoped(provider => capabilitiesInteractor); services.AddScoped(provider => validationInteractor); services.AddScoped(provider => searchInteractor); services.AddScoped(provider => resourceImporter); services.AddScoped(provider => readVersionInteractor); services.AddScoped(provider => readHistoryInteractor); services.AddScoped(provider => deleteInteractor); services.AddScoped <ISeedManager>(provider => seedManager); services.AddSingleton <IMemoryCache>(new Microsoft.Extensions.Caching.Memory.MemoryCache(new MemoryCacheOptions())); }
public SqlLiteResourceTracker( MamChannelFactory channelFactory, MamChannelSubscriptionFactory subscriptionFactory, IEncryption encryption, IDbConnectionSupplier connectionSupplier = null, string databaseFilename = "iotafhir.sqlite") { this.ChannelFactory = channelFactory; this.SubscriptionFactory = subscriptionFactory; this.Encryption = encryption; this.ConnectionSupplier = connectionSupplier ?? new DefaultDbConnectionSupplier(); this.ConnectionString = $"Data Source={databaseFilename};Version=3;"; DatabaseInitializer.InitFhirDatabase(this.ConnectionSupplier, databaseFilename); }
public void TestRestrictedMessageCreation32Bit() { var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository()); var channelKey = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC"); var channel = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey.Value); var message = channel.CreateMessage(new TryteString("IREALLYWANTTHISTOWORKINCSHARPASWELLPLEASEMAKEITHAPPEN")); Assert.AreEqual("RRPXQHDJY9BKXC9NGHDCSHRIDYORSUUEPFHXPQVDGSQTVYPCGVIZRWQINOUYFDUXTHFTKHLBOLYLHMKE9", message.Root.Value); Assert.AreEqual("BAVSMNXFTVBBEPXVROQYWBFHAELANDS9UFLDEOERJGKMXOGTL9UBEJF9WUDNGKUEDFZYAAFACRRRACDHV", message.Address.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", message.NextRoot.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", channel.NextRoot.Value); }
public void TestPublicMessageCreation() { var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var curlMask = new CurlMask(); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository()); var channel = channelFactory.Create(Mode.Private, seed); var message = channel.CreateMessage(new TryteString("IREALLYWANTTHISTOWORKINCSHARPASWELLPLEASEMAKEITHAPPEN")); var expectedAddress = curlMask.Hash(message.Root); Assert.AreEqual("RRPXQHDJY9BKXC9NGHDCSHRIDYORSUUEPFHXPQVDGSQTVYPCGVIZRWQINOUYFDUXTHFTKHLBOLYLHMKE9", message.Root.Value); Assert.AreEqual(expectedAddress.Value, message.Address.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", message.NextRoot.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", channel.NextRoot.Value); }
public async Task TestRestrictedMamCreationAndDecryption() { var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var mask = new CurlMask(); var iotaRepository = new InMemoryIotaRepository(); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var channelKey = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC"); var channel = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey); var message = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone!")); await channel.PublishAsync(message); var messageTwo = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the second!")); await channel.PublishAsync(messageTwo); var messageThree = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the third!")); await channel.PublishAsync(messageThree); var subcriptionFactory = new MamChannelSubscriptionFactory( iotaRepository, CurlMamParser.Default, mask); var subscription = subcriptionFactory.Create(message.Root, Mode.Restricted, channelKey); var unmaskedMessages = await subscription.FetchAsync(); Assert.AreEqual("Hello everyone!", unmaskedMessages[0].Message.ToUtf8String()); Assert.AreEqual(message.NextRoot.Value, unmaskedMessages[0].NextRoot.Value); Assert.AreEqual(message.Root.Value, unmaskedMessages[0].Root.Value); Assert.AreEqual("Hello everyone the second!", unmaskedMessages[1].Message.ToUtf8String()); Assert.AreEqual("Hello everyone the third!", unmaskedMessages[2].Message.ToUtf8String()); var messageFour = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the fourth!")); await channel.PublishAsync(messageFour); unmaskedMessages = await subscription.FetchNext(); Assert.AreEqual(1, unmaskedMessages.Count); Assert.AreEqual("Hello everyone the fourth!", unmaskedMessages[0].Message.ToUtf8String()); var unmaskedSingleMessage = await subscription.FetchSingle(messageTwo.Root); Assert.AreEqual("Hello everyone the second!", unmaskedSingleMessage.Message.ToUtf8String()); }
public void TestRestrictedChannelCreation() { var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository()); var channelKey = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC"); var channel = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey); Assert.AreEqual(seed.Value, channel.Seed.Value); Assert.AreEqual(Mode.Restricted, channel.Mode); Assert.AreEqual(SecurityLevel.Medium, channel.SecurityLevel); Assert.AreEqual(channelKey.Value, channel.Key.Value); Assert.AreEqual(Hash.Empty.Value, channel.NextRoot.Value); Assert.AreEqual(0, channel.Index); Assert.AreEqual(0, channel.Start); Assert.AreEqual(1, channel.Count); Assert.AreEqual(1, channel.NextCount); }
public void TestRestrictedMessageCreation64Bit() { var expectedPayload = new Bundle(); expectedPayload.AddTransfer(new Transfer { Address = new Address(), Message = new TryteString("AQRAQLYEXHTXQUVYAXBDJZFWM9QPHXNQRVVGEODVNZAQMPXIHVYDFLHKDBFLSEUDGHVGNYFLEBQTJORJ9BDWXYUBYQDBKYHXGCIRVRJLLRQCBFSYYFTRVRPYJTHIIOOFDISBILGHQCEWSNLRXRKPTBSBO9ENPHHCSTPGFEMQEWXEZ9BZIX9ICPGKLXKRGBFGUVVAUEJLXIXMDUOTZREGMSDVULQDHGQSLIHOAXHHXOZZDJUKDA9PBIXS9VAQVWVBYYMOGTCRXWSGIPAWRVVMDFLC9ZWARUVVGAHOTV9CBKAWZOLABYTYWRHPGYRIEOVCASDPBNXPVEQ9EASXF9IACICBBDBGGBQ9TXMMRGU9FFFWJEREBQTVXRRYTXG9HTKVNQPCJGEWIPKKPUETECNQFVDJOXNAHVGQKRWJLTQMHGZRWMCIIXVEPQGKYUINQB9ZVBORKPIVV9NXLFZVSBPDDYRCISBASVZJBBNXYARAOANTKCQNEZBAATBWSVBVVISHCYBBLJLYQUCRZVKASMHWTEFRKSQNUZ9YOFNWMZUJ9ZWGZYLVDBIOIUQKHLPEQHIF9FISNHLR9TDCBPQNUHM9RTGMVARZKKHISYKXTV9BSHDJNGUJY9OLMSKBFWPCOXJHAFAMRBIN9UXRKRLNODKIDLXRWFMQF9OWRYADJLEUQTAYYOLHQFFOWIYNMAG9NI9MKDMTDCKUGKJDPLWDWDRWWGCHYTKMTBPWYVBYYJXEHHLDZXOCGWSAFCAJDDIG9CLVRYGBQTBWXDFUJIXHODHT9INSECIDTNFXFLIZTFCYKAMMJGQPHNHYNBESVPSHXNYAVICPWEWGMT9RC9DXXALHMBPVKRPOXHOZVPKXPOKTPZLBWSUNXOHIKTICJDZVGLREREL9TDGAOMHRBZTZXKTIUFRPVY9SGQZZKPAHPZJEQJ9VF9EVOJHIXEPANATJVJVONHQK9XF9PDZSILBRXIYWVBGBMROQGI9AOCW9RVFXCOQCKJBMUWPOYAXDRC9G9XWRVJTMO9ZHDJTYKRQUJGMOTSUTVXOPYZK9KOZZNWNCNSWOSF9DLHPLSALNLZIU9KLXABKIQXNHHEOLRJN9HVTEXWPH9C9OTOCETMHJVQKHBFQEFJRBSYIZEUTRXHQJJYMCCURTSWAMDEASTTFVRYCDYDDUVKVHUVZPYSNEOXVXUEGENTIDFITOYTZEHLAARKPZBDXMUAWGOLRERABFSNFUHWIHQSBNKCFPCVRRIFOCYYSRVGEXYT9DKLWDMICVPQLZGFELCGKQLLBNRIXGUQBSLAKKWJUQKZNTPPQPHNSDHEYMWPIOSWTYWPSCAAQAYYIQ9LXXEBN9FSYFJTLHGZTDOSXFXAQLUNVS9IAJZOMXFRLWRLACPHXCUGARGBACABDUUXFHPURNAKQDDYUCQMQLGOEYDUEULPFVP9WBWFZYSXQOSHZQTEGBMTXBNFDOSMSNUQ9MHCPMINTTBWZKHUTSTDAXMJJNJZABAHLZVVLNIOAZQLUA9NQGGFBKO9GECCVFFLCUCOBIRMBXWWRWMPOVHNDFN9LG9BQJMWLVYFPCMO9HQTU9ZVXGKVVHQHDWYLAIRVUBCSFBGOGLP9DMNYKHLBSF9ZRICQSN9EBDCPUVYWSKZBNJYZECKC9GCRTZAL9NPWOFJUADDBGSKJIIDTLDJLQSGQDGA9QZGLABGXYVHLYVFATWOQHAVS9UWAMEU9VZTNFMDUZPMYRYPECPY9NTSS9QMSAJCLWCXOQZCHQFJOMW9FHUWKEPTZV9KCTWZTBGOWFFHOBSEIIQZ9FXEFPPVQRZLASCEAVVJWCZNUQMJEZCFO9UVOLPAPNJPOEEXYBAGGGUXOB9QUTCVAGDSYIKLDOAFNXSLHJST9QLOITR9RDWIBYNZVH9P9GGH9EJGUUAITTNCJCAPRLSFLUVEHVGNEF9QILNTUMYAFCZMMNLDTHKPJZAYUXNLIRSRIPELTXVBDNKTAEIETHHAMWLDORDRGQTRTBXKRYESYOWCID9NPUKCHXYORUIDMPUDVUWZVLYSIIAPTTTHYRWLGJIYHMKAU9PXGMXT9PFEWXXNXEXYRGUPVQ9ZVREQHHQMFJWJSFLVORIVDAVDRENFMZHYHDJSYCOLWB9RTAFXVKBWMSRGVLMHVHQJDNHPIVRDUSRKSYBZWBULB9QPFDEXQNLX9INXGLDQIJCAVSLNNRJSHOLQASBZTQF9QXV9QLHIPXLACEEEDEXTBJF9HNRWDLNQUIONKWXFST9NNXOAPNYHFOJWFTLFJEPTABUVUMVSGFQFANEKMVTGGFINNJSSWDXNJEVYBAPRLQQKOOJBDWSEMSUHXRCFBJTFFAKIYAMGAXCGAXWPFPUGCTWOPOMWJFGPKKYRYLWLVENOWPPNUQZEBLXEYAFQXTANUDHXYPZMXMMICYEZ9VONFTMYHMBWCJWW9HFSKZMPLOIHMTAXZGBNPEMDHYZHYLGYCJFYBYFGZILZPQ9UETUKNVPLISIALLJSRJNOAKFTL9DYDWNFBYSOBOCTCAVJGXTTLGLQ9SCMCHSFTDJXSKGHHZAEGGJUMYGB9IIELEGDSBLZKMTJJSYJWZCJWEKNGDX9PAQAOPHWRUIOTELQGTFEOQBZOYWMJHAQZMCEPQRKZGPVDVKPD9HMJWVJVQRJK9JKKB9OP9IQBRSAIFVGAIWQJYPXMYGIXAYXQTLDW9OTRPKRJAPFPPNPWQKSPUZORGCLJA9YJZJ9GTGP99DCSSGN9WT9WQAVTJBAZZASKTSFZSDLKXEJDSXTMGQMLWWZSDDWSPBZEZOERBQZFDYFKFQLWOOXDSKTVJALTYRMFAHVZFGVNHR9JQUNXYCC9ZBHGBVQLEQQFYXIFMGZRHKZM9XYFNU9JFHOZPHZPITFOLQZOVEJWQVP9JBIVQJKGUVSGADFYGSIZNAWWGZMDDGNS9FVROUFLLLOFFSRQIFMIHWOSCSDGDVA9XKBYMHIPPHHTNJBSZJYHNVWMBOUW9RYNNSJERIRCEAZGFREYUMZXGYCCWVGPUWQLZUVVZEUJG9KBYILXFRZRTCIUJMOMEEZHCNOYRVYQVCMGMWOHRDERKZETUNHZNEQWNUJNLBNXDVPYHNIZWOTXU9ASXOOSXUDYGG9BOORBKMTXBRRLKKOZSU9JTNXAFIU9IRRXEMQYQVFJISEXPTTCUBM9NJBDXARCHEWDQTGUVIGVKEHHHAZWVIVKPUWUGFW9KHXDGIKLOCLEATBNHYOCZXEFQKQUOVRNVHMGXJIBLNFETCYPZMRBBMLMKWBOWWLYXVEUYSNKSWTLPBDVWJDLKCUJVTORYLGRZZXDBQHBFLOAXVVRCSNCDGPDLQMNMWWJSXEHSVINRKCBBENJHJRIMXVGMQJDUROBI9YMIQDTLSUHETANLIALPSDTTAJWQKNLWKUOCUEKYRCUODUMABILWL9YP9KZEONKRHBLJFAVEVWTZDFICLLFMUFZVPWKYLCLFQKS9JFOCJC9LRJESEPMWYHDC9ELBQLPDKVEFMGEL9TBDAAYUMGRZ9YCGXALWJZX9MNHBSRJYNP9IARGKIZCCYKLNSMUB9AZWHSINIMPFCTSMMPKVHYHRRENSZZXVBIKMVPMTKSOBPQ9PMALTOV9GDPKTWAE9KTDYOA9NNANSQQOJECKEQ9ZBRDISIUZCAWSJGYCOPEIGMJBVBVQGWTGPAHADULEPFM9ALNCIXWVSCBVQRHQANTLDVEXMAOXFQDDUQYNZOHHFBIAEENWZWJXVQICBNZTCQUNW9AQRGAQXINGXBXOYVE9JNXYGUHSUFLPADVPJUFMECKHQSIRRDNBYSOOZK9GKCK9HTDLANJUAJZQVLNVGZRLXBIYLGUVGCZDY9OCBIOPPTBZMGV9OUCKGREHCVXDCZBSU9IXKONSZFKDQBWUFDEEZVBPMFKOTPFLBGPMSMZVGBRHOQHNMGUN9I9GQEBAPXBFLPNBBSP9MCVEDSOCVIDEZCNQUEHZVJTDMEOVFUFYRGCPBOOVQGUYQYCBMRJBTLVXRSVIKJQRPOPNOOGUFGHGYW9QDLPVRYRDTEDICCLR9WEZXFLVUNMAEMFLHHNHDSXVHPLBLGOQTVKDAHUCMDTFYTJATAEZRYEDIBJPOFTFCIAEUL9XAUUIBQCRBDTMEPWVGTSBODMHBYRWLBJIRVIDDXAKDHSQFIXYBHMHNLQLNYPDQFCMETQZNJCJZZYAJCBDUYXMXBPVQJZCXNGFXOSLDHJSZY9CHNXVDEJHRCIAPJRZUQ9FJHJBPYFDDGMJRQMNZY9YTAEOHRFOFKNTPWSPWPIAGWZZBM9OVRYQ9PDMSFFNWVX9ONILLWBDFXKGOBMHLWNDCXXUGFDJRMNRRHBNPKIVP9NKNBEKLIOFCNGVBTWVQ9GMPEUATEAGWMITUAZCMOGFFVTDWCFTVONROHASJHYFSXMDYDOCVRXZBUMKDZICCQFYBVDPYSABNKTUPADTWJZGKLBQWUPSEOJIITYTNYXMGBQSSUPYMTSCYLSLIZCVJTJPHBETOROBNA99"), Tag = new Tag("ASDF"), Timestamp = Timestamp.UnixSecondsTimestamp }); expectedPayload.Finalize(); expectedPayload.Sign(); var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var mamFactory = new CurlMamFactory( new Curl(CurlMode.CurlP27), new CurlMask(), new IssSigningHelper(new Curl(CurlMode.CurlP27), new Curl(CurlMode.CurlP27), new Curl(CurlMode.CurlP27)), new HammingNonceDiver(CurlMode.CurlP27, ProofOfWork.HammingNonce.Mode._64bit)); var channelFactory = new MamChannelFactory(mamFactory, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository()); var channelKey = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC"); var channel = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey); var message = channel.CreateMessage(new TryteString("IREALLYWANTTHISTOWORKINCSHARPASWELLPLEASEMAKEITHAPPEN")); Assert.AreEqual("RRPXQHDJY9BKXC9NGHDCSHRIDYORSUUEPFHXPQVDGSQTVYPCGVIZRWQINOUYFDUXTHFTKHLBOLYLHMKE9", message.Root.Value); Assert.AreEqual("BAVSMNXFTVBBEPXVROQYWBFHAELANDS9UFLDEOERJGKMXOGTL9UBEJF9WUDNGKUEDFZYAAFACRRRACDHV", message.Address.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", message.NextRoot.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", channel.NextRoot.Value); for (var i = 0; i < expectedPayload.Transactions.Count; i++) { Assert.AreEqual(expectedPayload.Transactions[i].Fragment.Value, message.Payload.Transactions[i].Fragment.Value); } }
public async Task TestPrivateMamCreationAndDecryption() { var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var mask = new CurlMask(); var iotaRepository = new InMemoryIotaRepository(); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var channel = channelFactory.Create(Mode.Private, seed); var message = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone!")); await channel.PublishAsync(message); var messageTwo = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the second!")); await channel.PublishAsync(messageTwo); var messageThree = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the third!")); await channel.PublishAsync(messageThree); var subcriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, mask); var subscription = subcriptionFactory.Create(message.Root, Mode.Private); var unmaskedMessages = await subscription.FetchAsync(); Assert.AreEqual("Hello everyone!", unmaskedMessages[0].Message.ToUtf8String()); Assert.AreEqual(message.NextRoot.Value, unmaskedMessages[0].NextRoot.Value); Assert.AreEqual(message.Root.Value, unmaskedMessages[0].Root.Value); Assert.AreEqual("Hello everyone the second!", unmaskedMessages[1].Message.ToUtf8String()); Assert.AreEqual("Hello everyone the third!", unmaskedMessages[2].Message.ToUtf8String()); var messageFour = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone the fourth!")); await channel.PublishAsync(messageFour); unmaskedMessages = await subscription.FetchNext(); Assert.AreEqual(1, unmaskedMessages.Count); Assert.AreEqual("Hello everyone the fourth!", unmaskedMessages[0].Message.ToUtf8String()); }
public async Task TestNoMessagesAreOnMamStreamShouldThrowException() { var iotaRepository = IotaResourceProvider.Repository; var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var resourceTracker = new InMemoryResourceTracker(); await resourceTracker.AddEntryAsync( new ResourceEntry { Channel = channelFactory.Create(Mode.Restricted, Seed.Random(), SecurityLevel.Medium, Seed.Random().Value, true), Subscription = subscriptionFactory.Create(new Hash(Seed.Random().Value), Mode.Restricted, Seed.Random().Value, true), ResourceRoots = new List <string> { "SOMEID" } }); var repository = new IotaFhirRepository( iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, new RandomSeedManager()); await repository.ReadResourceAsync("SOMEID"); }
public async Task TestEntryCanBeWrittenAndRead() { var iotaRepository = IotaResourceProvider.Repository; var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var tracker = new SqlLiteResourceTracker(channelFactory, subscriptionFactory, new RijndaelEncryption(Seed.Random().Value, Seed.Random().Value)); // fhir id will only be 64 chars long var resourceId = Seed.Random().Value.Substring(0, 64); await tracker.AddEntryAsync( new ResourceEntry { Channel = channelFactory.Create(Mode.Restricted, Seed.Random(), SecurityLevel.Medium, Seed.Random().Value, true), Subscription = subscriptionFactory.Create(new Hash(Seed.Random().Value), Mode.Restricted, Seed.Random().Value, true), ResourceRoots = new List <string> { resourceId } }); var resource = await tracker.GetEntryAsync(resourceId); Assert.IsTrue(resource.ResourceRoots.FirstOrDefault(h => h == resourceId) != null); }
public async Task TestMamChannelRecreation() { var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository()); var channelKey = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC"); var channel = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey); var message = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone!")); await channel.PublishAsync(message); var serializedChannel = channel.ToJson(); var unserializedChannel = channelFactory.CreateFromJson(serializedChannel); Assert.AreEqual(channel.Index, unserializedChannel.Index); Assert.AreEqual(channel.Start, unserializedChannel.Start); Assert.AreEqual(channel.NextCount, unserializedChannel.NextCount); Assert.AreEqual(channel.Count, unserializedChannel.Count); Assert.AreEqual(channel.NextRoot.Value, unserializedChannel.NextRoot.Value); Assert.AreEqual(channel.Seed.Value, unserializedChannel.Seed.Value); Assert.AreEqual(channel.SecurityLevel, unserializedChannel.SecurityLevel); Assert.AreEqual(channel.Key.Value, unserializedChannel.Key.Value); Assert.AreEqual(channel.Mode, unserializedChannel.Mode); }
public async Task TestInvalidMessageOnMamStreamShouldBeIgnored() { var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var mask = new CurlMask(); var iotaRepository = new InMemoryIotaRepository(); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var channelKey = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC"); var channel = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey); var message = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone!")); await channel.PublishAsync(message); var bundle = new Bundle(); bundle.AddTransfer(new Transfer { Address = message.Address, Message = TryteString.FromUtf8String("I do not belong here and should be ignored!"), Tag = Tag.Empty, Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); await iotaRepository.SendTrytesAsync(bundle.Transactions, 27, 14); var subcriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, mask); var subscription = subcriptionFactory.Create(message.Root, Mode.Restricted, channelKey); var unmaskedMessages = await subscription.FetchAsync(); Assert.AreEqual(1, unmaskedMessages.Count); Assert.AreEqual("Hello everyone!", unmaskedMessages[0].Message.ToUtf8String()); }
/// <inheritdoc /> protected override void Load(ContainerBuilder builder) { var iotaRepository = new RestIotaRepository( new FallbackIotaClient(new List <string> { "https://nodes.devnet.thetangle.org:443" }, 5000), new PoWService(new CpuPearlDiver())); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var encryption = new RijndaelEncryption("somenicekey", "somenicesalt"); var resourceTracker = new ResourceTracker( channelFactory, subscriptionFactory, encryption, $"{DependencyResolver.LocalStoragePath}\\resources.sqlite"); var seedManager = new SeedManager( resourceTracker, new IssSigningHelper(new Curl(), new Curl(), new Curl()), new AddressGenerator(), iotaRepository, encryption, $"{DependencyResolver.LocalStoragePath}\\seedmanager.sqlite"); var fhirRepository = new IotaFhirRepository(iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, seedManager); var fhirParser = new FhirJsonParser(); var searchRepository = new SearchRepository($"{DependencyResolver.LocalStoragePath}\\search.sqlite"); var createInteractor = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository); var readInteractor = new ReadResourceInteractor(fhirRepository, searchRepository); var validationInteractor = new ValidateResourceInteractor(fhirRepository, fhirParser); var searchInteractor = new SearchResourcesInteractor(fhirRepository, searchRepository); var resourceImporter = new ResourceImporter(searchRepository, fhirRepository, seedManager); builder.RegisterInstance(searchRepository).As <ISearchRepository>(); builder.RegisterInstance(resourceTracker).As <IResourceTracker>(); builder.RegisterInstance(createInteractor); builder.RegisterInstance(readInteractor); builder.RegisterInstance(validationInteractor); builder.RegisterInstance(searchInteractor); builder.RegisterInstance(resourceImporter); builder.RegisterInstance(seedManager).As <ISeedManager>(); builder.RegisterInstance(subscriptionFactory); builder.RegisterInstance(fhirRepository).As <IFhirRepository>(); builder.RegisterInstance(new AndroidLogout()).As <ILogout>(); var backgroundWorker = new BackgroundWorkerService(); var glucoseService = new FhirGlucoseService( new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository), new UpdateResourceInteractor(fhirRepository, fhirParser), new ReadResourceInteractor(fhirRepository, searchRepository), searchRepository); var glucoseRepository = new DexcomGlucoseManagementRepository(new RestClient("https://sandbox-api.dexcom.com")); //backgoundWorker.RegisterTaskWorker(new ContinuousGlucoseTaskWorker(glucoseService, glucoseRepository)); backgroundWorker.RegisterTaskWorker(new AggregateGlucoseTaskWorker(glucoseService, glucoseRepository)); }