public bool SetMetadata(UnicastClue UnicastClue) { lock (_lockObject) { var now = DateTime.UtcNow; if (UnicastClue == null || UnicastClue.Type == null || UnicastClue.Signature == null || UnicastClue.Signature.Hash.Value.Length == 0 || string.IsNullOrWhiteSpace(UnicastClue.Signature.Name) || (UnicastClue.CreationTime.ToDateTime() - now).TotalMinutes > 30 || UnicastClue.Certificate == null) { return(false); } if (!_UnicastClues.TryGetValue(UnicastClue.Type, out var dic)) { dic = new Dictionary <OmniSignature, Dictionary <OmniSignature, HashSet <UnicastClue> > >(); _UnicastClues[UnicastClue.Type] = dic; } if (!dic.TryGetValue(UnicastClue.Signature, out var dic2)) { dic2 = new Dictionary <OmniSignature, HashSet <UnicastClue> >(); dic[UnicastClue.Signature] = dic2; } var signature = UnicastClue.Certificate.GetOmniSignature(); if (!dic2.TryGetValue(signature, out var hashset)) { hashset = new HashSet <UnicastClue>(); dic2[signature] = hashset; } if (!hashset.Contains(UnicastClue)) { if (!UnicastClue.VerifyCertificate()) { return(false); } hashset.Add(UnicastClue); } return(true); } }
public bool VerifyCertificate() { var hub = new Hub(); try { var target = new UnicastClue(this.Type, this.Signature, this.CreationTime, this.Clue, null); target.Export(hub.Writer, BufferPool.Shared); hub.Writer.Complete(); var result = this.Certificate.Verify(hub.Reader.GetSequence()); hub.Reader.Complete(); return(result); } finally { hub.Reset(); } }
public static UnicastClue Create(string type, OmniSignature signature, Timestamp creationTime, Clue clue, OmniDigitalSignature digitalSignature) { var hub = new Hub(); try { var target = new UnicastClue(type, signature, creationTime, clue, null); target.Export(hub.Writer, BufferPool.Shared); hub.Writer.Complete(); var certificate = OmniCertificate.Create(digitalSignature, hub.Reader.GetSequence()); hub.Reader.Complete(); return(new UnicastClue(type, signature, creationTime, clue, certificate)); } finally { hub.Reset(); } }