Exemple #1
0
        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;
                }
            }
        }
Exemple #2
0
        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())));
        }
Exemple #3
0
        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);
    }
Exemple #6
0
        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;
                }
            }
        }
Exemple #7
0
        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);
        }