Вывести удобочитаемые значения для полей протокола LDAP в asn1c - PullRequest
0 голосов
/ 15 декабря 2018

Я использую asn1c для анализа сообщений LDAP .

. Для этого после компиляции определения ASN.1, определенного в rfc4511 , Я использую функции ber_decode и xer_fprint для декодирования и печати содержимого в моей программе.

Например, два указанных ниже вывода связаны с двумя различными сообщениями LDAP:

<LDAPMessage>
    <messageID>1</messageID>
    <protocolOp>
        <bindRequest>
            <version>3</version>
            <name>75 69 64 3D 61 2C 64 63 3D 63 6F 6D</name>
            <authentication>
                <simple>70 61 73 73 77 6F 72 64</simple>
            </authentication>
        </bindRequest>
    </protocolOp>
</LDAPMessage>

<LDAPMessage>
    <messageID>5</messageID>
    <protocolOp>
        <searchRequest>
            <baseObject></baseObject>
            <scope><baseObject/></scope>
            <derefAliases><neverDerefAliases/></derefAliases>
            <sizeLimit>0</sizeLimit>
            <timeLimit>0</timeLimit>
            <typesOnly><true/></typesOnly>
            <filter>
                <present>4F 62 6A 65 63 74 43 6C 61 73 73</present>
            </filter>
            <attributes>
                <selector>31 2E 31</selector>
            </attributes>
        </searchRequest>
    </protocolOp>
</LDAPMessage>

Как видите, значения для name , simple , present и selector поля отображаются как шестнадцатеричный .Хотя я хочу, чтобы они отображались в виде человекочитаемых значений (аналогично тому, что делает wireshark).

второе сообщение на wireshark (текущее поле имеет значение ObjectClass)

Я знаю, что в этой ссылке был задан тот же вопрос ( расшифровывает вывод компилятора asn.1 в виде строк ).Лев Уолкин сказал, что OCTET STRING следует заменить на IA5String или UTF8String .Но в определении LDAP ASN.1 во многих местах используется OCTET STRING.

Какой из них мне следует изменить?Правильно ли мое восприятие замены OCTET STRING на IA5String или UTF8String?Должно ли это быть сделано в определении LDAP ASN.1 или где-либо еще?Есть ли проблема с изменением стандартного определения LDAP?Например, я изменил только LDAPDN :: = LDAPString на LDAPDN :: = UTF8String, но обнаружил ошибку в функции ber_decode .

Каково общее решение для отображения всех значений в удобочитаемом для человека виде?

Спасибо ...

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Существует одно довольно хакерское решение: вы можете изменить функцию xer_encoder для типов, которые необходимо печатать, в виде удобочитаемых значений.

В файле asn.1 рядом с определением LDAPString добавьтеновый тип, который ссылается на тип UTF8String

    LDAPString ::= OCTET STRING -- UTF-8 encoded,
                                 -- [ISO10646] characters

    LDAPStringUTF8 ::= UTF8String
                      -- [RFC4514]

. Без этого asn1c не скопирует UTF8String.[hc] файлов, которые нам понадобятся.

Чем в вашем mainили непосредственно перед вызовом asn_encode с помощью ATS_BASIC_XER / ATS_CANONICAL_XER добавьте следующий

asn_DEF_LDAPDN.op->xer_encoder = OCTET_STRING_encode_xer_utf8;

и включите заголовок LDAPDN.h.

Вот полный патч на случайвы используете converter-example.c и rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 из примеров asn1c

diff --git a/converter-example.c b/converter-example.c
index b540452..bb883b4 100644
--- a/converter-example.c
+++ b/converter-example.c
@@ -189,6 +189,8 @@ ats_by_name(const char *name, const asn_TYPE_descriptor_t *td,
     return NULL;
 }

+#include "LDAPDN.h"
+
 int
 main(int ac, char *av[]) {
     FILE *binary_out;
@@ -216,6 +218,8 @@ main(int ac, char *av[]) {
 #endif
     }

+    asn_DEF_LDAPDN.op->xer_encoder = OCTET_STRING_encode_xer_utf8;
+
     /* Figure out if a specialty decoder needs to be default */
 #ifndef ASN_DISABLE_OER_SUPPORT
     isyntax = ATS_BASIC_OER;
diff --git a/pdu_collection.c b/pdu_collection.c
index 4fde16b..55e2c2f 100644
--- a/pdu_collection.c
+++ b/pdu_collection.c
@@ -7,6 +7,7 @@ struct asn_TYPE_descriptor_s;   /* Forward declaration */
 extern struct asn_TYPE_descriptor_s asn_DEF_LDAPMessage;
 extern struct asn_TYPE_descriptor_s asn_DEF_MessageID;
 extern struct asn_TYPE_descriptor_s asn_DEF_LDAPString;
+extern struct asn_TYPE_descriptor_s asn_DEF_LDAPStringUTF8;
 extern struct asn_TYPE_descriptor_s asn_DEF_LDAPOID;
 extern struct asn_TYPE_descriptor_s asn_DEF_LDAPDN;
 extern struct asn_TYPE_descriptor_s asn_DEF_RelativeLDAPDN;
@@ -58,6 +59,7 @@ struct asn_TYPE_descriptor_s *asn_pdu_collection[] = {
    &asn_DEF_LDAPMessage,   
    &asn_DEF_MessageID, 
    &asn_DEF_LDAPString,    
+   &asn_DEF_LDAPStringUTF8,    
    &asn_DEF_LDAPOID,   
    &asn_DEF_LDAPDN,    
    &asn_DEF_RelativeLDAPDN,    
diff --git a/rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 b/rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1
index 53de3cf..b29ec11 100644
--- a/rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1
+++ b/rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1
@@ -47,6 +47,7 @@
         LDAPString ::= OCTET STRING -- UTF-8 encoded,
                                     -- [ISO10646] characters

+        LDAPStringUTF8 ::= UTF8String

А вот вывод

./converter-example -iber ldap1.der
<LDAPMessage>
    <messageID>1</messageID>
    <protocolOp>
        <bindRequest>
            <version>3</version>
            <name>uid=a,dc=com</name>
            <authentication>
                <simple>password</simple>
            </authentication>
        </bindRequest>
    </protocolOp>
</LDAPMessage>
0 голосов
/ 15 декабря 2018

Вы не можете изменить спецификацию LDAP asn1 для решения вашей проблемы.

Например: когда вы декодируете BindRequest, декодировать name (типа LDAPDN) ber_decode ожидает тег OCTET STRING.Если вы измените спецификацию, как вы предлагаете, вы ожидаете тег UTF8String и получите тег OCTET STRING (отсюда и ошибка)

К сожалению, с помощью универсальных инструментов нет способа отобразитьтекст, читаемый человеком, в то время как спецификация использует OCTET STRING

...