public AsnElt Encode() { List <AsnElt> asnElements = new List <AsnElt>(); AsnElt keyAsn = key.Encode(); keyAsn = AsnElt.MakeImplicit(AsnElt.CONTEXT, 0, keyAsn); asnElements.Add(keyAsn); AsnElt lastReqAsn = lastReq.Encode(); lastReqAsn = AsnElt.MakeImplicit(AsnElt.CONTEXT, 1, lastReqAsn); asnElements.Add(lastReqAsn); AsnElt nonceElt = AsnElt.MakeInteger(Convert.ToInt64(nonce)); AsnElt nonceSeq = AsnElt.Make(AsnElt.SEQUENCE, nonceElt); nonceSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 2, nonceSeq); asnElements.Add(nonceSeq); AsnElt flagsElt = AsnElt.MakeInteger(Convert.ToInt32(flags)); AsnElt flagsSeq = AsnElt.Make(AsnElt.SEQUENCE, flagsElt); flagsSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 4, flagsSeq); asnElements.Add(flagsSeq); AsnElt authtimeElt = AsnElt.MakeTimeAuto(authtime); AsnElt authtimeSeq = AsnElt.Make(AsnElt.SEQUENCE, authtimeElt); authtimeSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 5, authtimeSeq); asnElements.Add(authtimeSeq); AsnElt endtimeElt = AsnElt.MakeTimeAuto(endtime); AsnElt endtimeSeq = AsnElt.Make(AsnElt.SEQUENCE, endtimeElt); endtimeSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 7, endtimeSeq); asnElements.Add(endtimeSeq); // TODO: Find proper string type AsnElt realmElt = AsnElt.MakeString(12, realm); AsnElt realmSeq = AsnElt.Make(AsnElt.SEQUENCE, realmElt); realmSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 9, realmSeq); asnElements.Add(realmSeq); sname = new PrincipalName(new List <string> { "krbgt", "MACS.XBOX.COM" }, 2); AsnElt snameElt = sname.Encode(); snameElt = AsnElt.MakeImplicit(AsnElt.CONTEXT, 10, snameElt); asnElements.Add(snameElt); AsnElt seq = AsnElt.Make(AsnElt.SEQUENCE, asnElements.ToArray()); return(seq); }
public AsnElt Encode(byte[] OnlineKey) { List <string> snames = new List <string>() { "krbtgt", "XBOX.COM" }; List <AsnElt> allNodes = new List <AsnElt>(); sname = new PrincipalName(snames, 2); AsnElt tkt_vnoAsn = AsnElt.MakeInteger(5); AsnElt tkt_vnoSeq = AsnElt.Make(AsnElt.SEQUENCE, new AsnElt[] { tkt_vnoAsn }); tkt_vnoSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 0, tkt_vnoSeq); allNodes.Add(tkt_vnoSeq); // realm [1] Realm AsnElt realmAsn = AsnElt.MakeString(AsnElt.IA5String, "PASSPORT.NET"); realmAsn = AsnElt.MakeImplicit(AsnElt.UNIVERSAL, AsnElt.GeneralString, realmAsn); AsnElt realmAsnSeq = AsnElt.Make(AsnElt.SEQUENCE, realmAsn); realmAsnSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 1, realmAsnSeq); allNodes.Add(realmAsnSeq); // sname [2] PrincipalName AsnElt snameAsn = sname.Encode(); snameAsn = AsnElt.MakeImplicit(AsnElt.CONTEXT, 2, snameAsn); allNodes.Add(snameAsn); // TODO: Find proper key type encdata = new EncryptedData((int)Interop.KERB_ETYPE.rc4_hmac, 1, KerberosCrypto.KerberosEncrypt(Interop.KERB_ETYPE.rc4_hmac, Interop.KRB_KEY_USAGE_AS_REP_EP_SESSION_KEY, OnlineKey, SessionKey)); AsnElt enc_partAsn = encdata.Encode(); AsnElt enc_partSeq = AsnElt.Make(AsnElt.SEQUENCE, enc_partAsn); enc_partSeq = AsnElt.MakeImplicit(AsnElt.CONTEXT, 3, enc_partSeq); allNodes.Add(enc_partSeq); AsnElt seq = AsnElt.Make(AsnElt.SEQUENCE, allNodes.ToArray()); AsnElt seq2 = AsnElt.Make(AsnElt.SEQUENCE, seq); AsnElt seq3 = AsnElt.Make(AsnElt.APPLICATION, 1, seq2); seq3 = AsnElt.MakeImplicit(AsnElt.APPLICATION, 0, seq3); return(seq3); }