private static void BuildKrbApReq(KrbApReq krbApReq, Asn1Node asn1Node) { Asn1Node childNode1 = asn1Node.GetChildNode(0); for (int index = 0; (long)index < childNode1.ChildNodeCount; ++index) { Asn1Node childNode2 = childNode1.GetChildNode(index); switch (KerberosAuthorizeMessageBuilder.GetContextNumber(childNode2)) { case 0: krbApReq.ProtocolVersionNumber = (int)Asn1Util.BytesToLong(childNode2.GetChildNode(0).Data); break; case 1: krbApReq.MessageType = (MessageType)Asn1Util.BytesToLong(childNode2.GetChildNode(0).Data); break; case 2: krbApReq.APOptions = (APOptions)Asn1Util.BytesToLong(childNode2.GetChildNode(0).Data); break; case 3: krbApReq.Ticket = new Ticket(); KerberosAuthorizeMessageBuilder.BuildTicket(krbApReq.Ticket, childNode2); break; case 4: krbApReq.Authenticator = new EncryptedData(); KerberosAuthorizeMessageBuilder.BuildEncryptedData(krbApReq.Authenticator, childNode2); break; } } }
public static bool IsCertInCRL(byte[] crl, X509Certificate2 cert) { var asnParser = new Asn1Parser(); var strCRL = Asn1Util.BytesToString(crl); if (Asn1Util.IsPemFormated(strCRL)) { asnParser.LoadData(Asn1Util.PemToStream(strCRL)); } else { asnParser.LoadData(new MemoryStream(crl)); } if (7 > asnParser.RootNode.GetChildNode(0).ChildNodeCount) { return(false); // empty CRL } var revokedCertificates = asnParser.RootNode.GetChildNode(0).GetChildNode(5); // throw revoked certs into a list so someday we eventually cache CRLs var revoked = new List <long>(); for (var i = 0; i < revokedCertificates.ChildNodeCount; i++) { revoked.Add(Asn1Util.BytesToLong(revokedCertificates.GetChildNode(i) .GetChildNode(0) .Data .Reverse() .ToArray())); } return(revoked.Contains(Asn1Util.BytesToLong(cert.GetSerialNumber()))); }
private static void BuildTicket(Ticket ticket, Asn1Node asn1Node) { Asn1Node childNode1 = asn1Node.GetChildNode(0).GetChildNode(0); for (int index = 0; (long)index < childNode1.ChildNodeCount; ++index) { Asn1Node childNode2 = childNode1.GetChildNode(index); switch (KerberosAuthorizeMessageBuilder.GetContextNumber(childNode2)) { case 0: ticket.TicketVersionNumber = (int)Asn1Util.BytesToLong(childNode2.GetChildNode(0).Data); break; case 1: ticket.Realm = childNode2.GetChildNode(0).GetDataStr(false); break; case 2: ticket.ServiceName = new PrincipalName(); KerberosAuthorizeMessageBuilder.BuildPrincipleName(ticket.ServiceName, childNode2); break; case 3: ticket.EncPart = new EncryptedData(); KerberosAuthorizeMessageBuilder.BuildEncryptedData(ticket.EncPart, childNode2); break; } } }
private AppleReceipt ParseReceipt(Asn1Node data) { if (data == null || data.ChildNodeCount != 1) { throw new InvalidPKCS7Data(); } Asn1Node set = GetSetNode(data); var result = new AppleReceipt(); var inApps = new List <AppleInAppPurchaseReceipt> (); for (int t = 0; t < set.ChildNodeCount; t++) { var node = set.GetChildNode(t); // Each node should contain three children. if (node.ChildNodeCount == 3) { var type = Asn1Util.BytesToLong(node.GetChildNode(0).Data); var value = node.GetChildNode(2); // See https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1 switch (type) { case 2: result.bundleID = Encoding.UTF8.GetString(value.GetChildNode(0).Data); break; case 3: result.appVersion = Encoding.UTF8.GetString(value.GetChildNode(0).Data); break; case 4: result.opaque = value.Data; break; case 5: result.hash = value.Data; break; case 12: var dateString = Encoding.UTF8.GetString(value.GetChildNode(0).Data); result.receiptCreationDate = DateTime.Parse(dateString).ToUniversalTime(); break; case 17: inApps.Add(ParseInAppReceipt(value.GetChildNode(0))); break; case 19: result.originalApplicationVersion = Encoding.UTF8.GetString(value.GetChildNode(0).Data); break; } } } result.inAppPurchaseReceipts = inApps.ToArray(); return(result); }
private static int getIntegerFromSubNode(Asn1Node nn) { int retval = -1; if ((nn.Tag & Asn1Tag.TAG_MASK) == Asn1Tag.OCTET_STRING && nn.ChildNodeCount > 0) { Asn1Node n = nn.GetChildNode(0); if ((n.Tag & Asn1Tag.TAG_MASK) == Asn1Tag.INTEGER) { retval = (int)Asn1Util.BytesToLong(n.Data); } } return(retval); }
private static void BuildPrincipleName(PrincipalName principalName, Asn1Node asn1Node) { Asn1Node childNode1 = asn1Node.GetChildNode(0); for (int index = 0; (long)index < childNode1.ChildNodeCount; ++index) { Asn1Node childNode2 = childNode1.GetChildNode(index); switch (KerberosAuthorizeMessageBuilder.GetContextNumber(childNode2)) { case 0: principalName.NameType = (PrincipalNameType)Asn1Util.BytesToLong(childNode2.GetChildNode(0).Data); break; case 1: principalName.NameString = new List <string>(); KerberosAuthorizeMessageBuilder.BuildPrincipleNameList(principalName.NameString, childNode2); break; } } }
private static void BuildEncryptedData(EncryptedData encryptedData, Asn1Node asn1Node) { Asn1Node childNode1 = asn1Node.GetChildNode(0); for (int index = 0; (long)index < childNode1.ChildNodeCount; ++index) { Asn1Node childNode2 = childNode1.GetChildNode(index); switch (KerberosAuthorizeMessageBuilder.GetContextNumber(childNode2)) { case 0: encryptedData.EncryptionType = (EncryptionType)Asn1Util.BytesToLong(childNode2.GetChildNode(0).Data); break; case 1: encryptedData.KeyVersionNumber = new uint?((uint)Asn1Util.BytesToLong(childNode2.GetChildNode(0).Data)); break; case 2: encryptedData.Cipher = new byte[childNode2.GetChildNode(0).DataLength]; Buffer.BlockCopy((Array)childNode2.GetChildNode(0).Data, 0, (Array)encryptedData.Cipher, 0, encryptedData.Cipher.Length); break; } } }
private void parseNodeRecursive(Asn1Node tNode) { bool processed_node = false; if ((tNode.Tag & Asn1Tag.TAG_MASK) == Asn1Tag.SEQUENCE && tNode.ChildNodeCount == 3) { Asn1Node node1 = tNode.GetChildNode(0); Asn1Node node2 = tNode.GetChildNode(1); Asn1Node node3 = tNode.GetChildNode(2); if ((node1.Tag & Asn1Tag.TAG_MASK) == Asn1Tag.INTEGER && (node2.Tag & Asn1Tag.TAG_MASK) == Asn1Tag.INTEGER && (node3.Tag & Asn1Tag.TAG_MASK) == Asn1Tag.OCTET_STRING) { processed_node = true; int type = (int)Asn1Util.BytesToLong(node1.Data); switch (type) { case AppReceiptASN1TypeBundleIdentifier: BundleIdentifier = getStringFromSubNode(node3); break; case AppReceiptASN1TypeAppVersion: AppVersion = getStringFromSubNode(node3); break; case AppReceiptASN1TypeOpaqueValue: break; case AppReceiptASN1TypeHash: break; case AppReceiptASN1TypeOriginalAppVersion: OriginalAppVersion = getStringFromSubNode(node3); break; case AppReceiptASN1TypeReceiptExpirationDate: break; case AppReceiptASN1TypeReceiptCreationDate: ReceiptCreationDate = getDateTimeFromSubNode(node3); break; case AppReceiptASN1TypeInAppPurchaseReceipt: { if (node3.ChildNodeCount > 0) { Asn1Node node31 = node3.GetChildNode(0); if ((node31.Tag & Asn1Tag.TAG_MASK) == Asn1Tag.SET && node31.ChildNodeCount > 0) { AppleInAppPurchaseReceipt receipt = new AppleInAppPurchaseReceipt(); for (int i = 0; i < node31.ChildNodeCount; i++) { Asn1Node node311 = node31.GetChildNode(i); if ((node311.Tag & Asn1Tag.TAG_MASK) == Asn1Tag.SEQUENCE && node311.ChildNodeCount == 3) { Asn1Node node3111 = node311.GetChildNode(0); Asn1Node node3112 = node311.GetChildNode(1); Asn1Node node3113 = node311.GetChildNode(2); if ((node3111.Tag & Asn1Tag.TAG_MASK) == Asn1Tag.INTEGER && (node3112.Tag & Asn1Tag.TAG_MASK) == Asn1Tag.INTEGER && (node3113.Tag & Asn1Tag.TAG_MASK) == Asn1Tag.OCTET_STRING) { int type1 = (int)Asn1Util.BytesToLong(node3111.Data); switch (type1) { case AppReceiptASN1TypeQuantity: receipt.Quantity = getIntegerFromSubNode(node3113); break; case AppReceiptASN1TypeProductIdentifier: receipt.ProductIdentifier = getStringFromSubNode(node3113); break; case AppReceiptASN1TypeTransactionIdentifier: receipt.TransactionIdentifier = getStringFromSubNode(node3113); break; case AppReceiptASN1TypePurchaseDate: receipt.PurchaseDate = getDateTimeFromSubNode(node3113); break; case AppReceiptASN1TypeOriginalTransactionIdentifier: receipt.OriginalTransactionIdentifier = getStringFromSubNode(node3113); break; case AppReceiptASN1TypeOriginalPurchaseDate: receipt.OriginalPurchaseDate = getDateTimeFromSubNode(node3113); break; case AppReceiptASN1TypeSubscriptionExpirationDate: receipt.SubscriptionExpirationDate = getDateTimeFromSubNode(node3113); break; case AppReceiptASN1TypeWebOrderLineItemID: receipt.WebOrderLineItemID = getIntegerFromSubNode(node3113); break; case AppReceiptASN1TypeCancellationDate: receipt.CancellationDate = getDateTimeFromSubNode(node3113); break; } } } } if (!string.IsNullOrEmpty(receipt.ProductIdentifier)) { PurchaseReceipts.Add(receipt.ProductIdentifier, receipt); } } } } break; default: processed_node = false; break; } } } if (!processed_node) { for (int i = 0; i < tNode.ChildNodeCount; i++) { Asn1Node chld = tNode.GetChildNode(i); if (chld != null) { parseNodeRecursive(chld); } } } }
private AppleInAppPurchaseReceipt ParseInAppReceipt(Asn1Node inApp) { var result = new AppleInAppPurchaseReceipt(); for (int t = 0; t < inApp.ChildNodeCount; t++) { var node = inApp.GetChildNode(t); if (node.ChildNodeCount == 3) { var type = Asn1Util.BytesToLong(node.GetChildNode(0).Data); var value = node.GetChildNode(2); switch (type) { case 1701: result.quantity = (int)Asn1Util.BytesToLong(value.GetChildNode(0).Data); break; case 1702: result.productID = Encoding.UTF8.GetString(value.GetChildNode(0).Data); break; case 1703: result.transactionID = Encoding.UTF8.GetString(value.GetChildNode(0).Data); break; case 1705: result.originalTransactionIdentifier = Encoding.UTF8.GetString(value.GetChildNode(0).Data); break; case 1704: result.purchaseDate = TryParseDateTimeNode(value); break; case 1706: result.originalPurchaseDate = TryParseDateTimeNode(value); break; case 1708: result.subscriptionExpirationDate = TryParseDateTimeNode(value); break; case 1712: result.cancellationDate = TryParseDateTimeNode(value); break; case 1707: // looks like possibly a type? result.productType = (int)Asn1Util.BytesToLong(value.GetChildNode(0).Data); break; case 1713: // looks like possibly is_trial? result.isFreeTrial = (int)Asn1Util.BytesToLong(value.GetChildNode(0).Data); break; case 1719: result.isIntroductoryPricePeriod = (int)Asn1Util.BytesToLong(value.GetChildNode(0).Data); break; default: break; } } } return(result); }