打印asn1c

时间:2018-12-15 14:00:34

标签: ldap asn.1

我使用 asn1c 解析 LDAP消息

为此,在编译 rfc4511 中定义的ASN.1定义后,我使用 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>

如您所见,名称简单当前选择器字段的值以十六进制显示。虽然我希望它们显示为人类可读值(类似于wireshark的操作)

second message on the wireshark (present field have ObjectClass Value)

我知道在此链接(decoding asn.1 compiler output as strings)中提出了相同的问题。 Lev Walkin说,应将 OCTET STRING 替换为 IA5String UTF8String 。但是在LDAP ASN.1定义中,OCTET STRING已在许多地方使用。

我应该换哪个?我用IA5String或UTF8String替换OCTET STRING的看法是否正确?应该在LDAP ASN.1定义中还是在其他地方完成?更改LDAP标准定义是否有问题?例如,我仅将LDAPDN :: = LDAPString更改为LDAPDN :: = UTF8String,但是在 ber_decode 函数中遇到错误。

以人类可读的方式显示所有值的一般解决方案是什么?

谢谢...

2 个答案:

答案 0 :(得分:1)

有一个相当棘手的解决方案,您可以更改需要打印为人类可读值的类型的xer_encoder功能。

在LDAPString定义旁边的asn.1文件中,添加引用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标头。

如果您正在使用asn1c的示例中的converter-example.crfc4511-Lightweight-Directory-Access-Protocol-V3.asn1,则为以下完整补丁

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>

答案 1 :(得分:0)

您不能更改LDAP asn1规范来解决您的问题。

例如:在解码BindRequest时,要解码name(类型为LDAPDN的{​​{1}}), ber_decode 需要标签OCTET STRING。如果您按照建议更改规格,则将使用UTF8String标签并收到OCTET STRING标签(因此出现错误)

不幸的是,在规范使用OCTET STRING的情况下,使用通用工具无法显示人类可读的文本