private static IEnumerable <AuthorizationDataElement> ExtractRestrictions(Asn1Element restrictions)
        {
            var elements = new List <AuthorizationDataElement>();

            AuthorizationDataValueType type = 0;

            for (var i = 0; i < restrictions.Count; i++)
            {
                switch (restrictions[i].ContextSpecificTag)
                {
                case 0:
                    type = (AuthorizationDataValueType)restrictions[i][0].AsInt();
                    break;

                case 1:
                    var rel = ParseAdIfRelevant(restrictions[i], type);

                    if (rel != null)
                    {
                        elements.Add(rel);
                    }
                    break;
                }
            }

            return(elements);
        }
        private static AuthorizationDataElement ParseIfRelevant(Asn1Element restriction)
        {
            AuthorizationDataValueType type = 0;

            switch (restriction.ContextSpecificTag)
            {
            case 0:
                type = (AuthorizationDataValueType)restriction[0].AsInt();
                break;

            case 1:
                return(ParseAdIfRelevant(restriction, type));
            }

            throw new InvalidDataException();
        }
        private static AuthorizationDataElement ParseAdIfRelevant(Asn1Element restriction, AuthorizationDataValueType type)
        {
            switch (type)
            {
            case AuthorizationDataValueType.AD_WIN2K_PAC:
                return(new PacElement(restriction[0].Value));

            case AuthorizationDataValueType.AD_ETYPE_NEGOTIATION:
                return(ParseETypes(restriction.AsEncapsulatedElement()));

            case AuthorizationDataValueType.KERB_AUTH_DATA_TOKEN_RESTRICTIONS:
                return(new RestrictionEntry().Decode(restriction.AsEncapsulatedElement()));

            case AuthorizationDataValueType.KERB_AP_OPTIONS:
                return(new KerbApOptions(restriction[0].AsInt(reverse: true)));

            case AuthorizationDataValueType.KERB_LOCAL:
                return(new KerbLocal(restriction[0].Value));

            case AuthorizationDataValueType.KERB_SERVICE_TARGET:
                return(new KerbServiceName(restriction[0].Value));

            default:
                return(null);
            }
        }