//////////////////////////////////////////////////////////////////////////////// // // Microsoft Research Singularity // // Copyright (c) Microsoft Corporation. All rights reserved. // // File: Service/CredentialsManager/Credentials.sg // // Note: Classes for representing credentials and evidence. // using System; using System.Collections; using System.Diagnostics; using Microsoft.Contracts; using Microsoft.Singularity; using Microsoft.Singularity.Channels; using Microsoft.Singularity.Directory; using Microsoft.Singularity.Io; using Microsoft.SingSharp; using Ex = Microsoft.Singularity.Security; namespace Microsoft.Singularity.Security.CredentialsManager { /// // // // This class contains a set of credentials, including sensitive "private" info, // such as passwords, private keys, etc. The Credentials Manager allows clients // to create these entries, enumerate them, etc., but never allows the private // info to flow out of the credentials manager. The CM also allows clients to // create "supplicants", which are instances of security protocols that are // allowed to make use of the private info, but not to expose it. // // // class Credentials { public Credentials(CredentialsId! id, CredentialsEvidence! evidence) { this.Id = id; this.Evidence = evidence; } public CredentialsId! Id; public CredentialsEvidence! Evidence; } /// // // // This class is used as a key in Hashtable, so it implements identity comparison // methods, including Object.GetHashCode(), operator==, operator!=, and Object.Equals(). // // // Instances of this class are immutable. // // // class CredentialsId { public CredentialsId(string! name, string! tag) { this.CredentialsName = name; this.Tag = tag; } public CredentialsId(Ex.CredentialsId excredentials) { this( Bitter.ToString2(excredentials.CredentialsName), Bitter.ToString2(excredentials.Tag)); } public readonly string! CredentialsName; public readonly string! Tag; override public string! ToString() { return String.Format("[CredentialsId: name:{0} tag:{1}]", this.CredentialsName, this.Tag); } public Ex.CredentialsId ToExchange() { Ex.CredentialsId ex = new Ex.CredentialsId(); ex.CredentialsName = Bitter.FromString2(this.CredentialsName); ex.Tag = Bitter.FromString2(this.Tag); return ex; } override public int GetHashCode() { return unchecked((int)(CredentialsName.GetHashCode() + 3 * Tag.GetHashCode())); } override public bool Equals(object obj) { CredentialsId comparand = obj as CredentialsId; if (comparand == null) return false; return this == comparand; } public static bool operator== (CredentialsId! a, CredentialsId! b) { return a.CredentialsName == b.CredentialsName && a.Tag == b.Tag; } public static bool operator!= (CredentialsId! a, CredentialsId! b) { return a.CredentialsName != b.CredentialsName || a.Tag != b.Tag; } } // Base class for classes that provide evidence of ownership of a key. abstract class CredentialsEvidence { } class PasswordEvidence : CredentialsEvidence { public PasswordEvidence(string! password) { this.Password = password; } public readonly string! Password; } // //class PrivateKeyEvidence : CredentialsEvidence //{ // ??? //} // }