ASN.1全面指南:协议规范与编码解析

5星 · 超过95%的资源 需积分: 10 8 下载量 194 浏览量 更新于2024-07-27 收藏 1.02MB PDF 举报
"ASN1_Complete" 本书《ASN.1 Complete》由John Larmouth教授撰写,专注于ASN.1(抽象语法标记一号)的全面介绍。ASN.1是一种用于定义数据结构的标准,常用于通信协议的规范,特别是电信和网络领域。这本书可能是为那些与作者的孩子在Withington Girls' School和The Manchester Grammar School一起学习的人准备的,希望对他们有所帮助。 书中内容分为多个部分,首先介绍了全球通信基础设施,然后阐述了ASN.1的本质。在发展过程中,ASN.1扮演着关键角色,它允许不同系统间的数据交换具有明确的结构和语义。ASN.1的文本结构也进行了详述,帮助读者理解其组织方式。 在“ASN.1概述”这一章节中,作者探讨了协议的定义,指出协议是规定不同系统间通信规则的一组指令。协议的规格化涉及一些基本概念,如分层和协议“洞”(即不同层次之间的接口)。早期的分层模型被讨论,同时指出了过分依赖分层架构的缺点,强调应保持设计简单。协议的可扩展性是另一个关键点,使得协议能够适应未来的需求。 asn.1中的抽象和传输语法是核心概念,它们分离了协议数据的逻辑表示(抽象语法)和实际传输时的编码表示(传输语法)。书中有对比了命令行和基于语句的方法,并引入了接口定义语言(IDL)的概念,IDL用于定义不同系统间的接口,这在分布式系统和网络通信中至关重要。 更深入地,书中讨论了抽象值和类型,以及如何编码这些抽象值。这部分帮助读者理解如何将抽象的协议数据转化为实际的二进制编码,以便在网络中传输。最后,书中对这些概念进行了评估讨论,指出在选择表示和编码方法时有许多不同的路径和考虑因素。 《ASN.1 Complete》是一本深入浅出的教程,旨在帮助读者理解和应用ASN.1,这对于理解网络通信协议和开发相关软件至关重要。无论是初学者还是经验丰富的专业人员,都能从中获益。

typedef struct pkcs9_attribute_st { ASN1_OBJECT *object; ASN1_STRING *randomvalues; }PKCS9_ATTRIBUTE; ASN1_SEQUENCE(PKCS9_ATTRIBUTE) = { ASN1_SIMPLE(PKCS9_ATTRIBUTE, object, ASN1_OBJECT), ASN1_SET_OF(PKCS9_ATTRIBUTE, randomvalues, ASN1_ANY) } ASN1_SEQUENCE_END(PKCS9_ATTRIBUTE) IMPLEMENT_ASN1_FUNCTIONS(PKCS9_ATTRIBUTE) IMPLEMENT_ASN1_DUP_FUNCTION(PKCS9_ATTRIBUTE) #if 1 int PKCS9_ATTRIBUTE_set1_object(PKCS9_ATTRIBUTE *attr, const ASN1_OBJECT *obj) { if ((attr == NULL) || (obj == NULL)) return 0; ASN1_OBJECT_free(attr->object); attr->object = OBJ_dup(obj); return attr->object != NULL; } int PKCS9_ATTRIBUTE_set1_randomvalues(PKCS9_ATTRIBUTE *attr, int attrtype, const void *data, int len) { ASN1_TYPE *ttmp = NULL; ASN1_STRING *stmp = NULL; int atype = 0; if (!attr) return 0; if (attrtype & MBSTRING_FLAG) { stmp = ASN1_STRING_set_by_NID(NULL, data, len, attrtype, OBJ_obj2nid(attr->object)); if (!stmp) { printf("PKCS9_F_PKCS9_ATTRIBUTE_SET1_DATA\n"); return 0; } atype = stmp->type; } else if (len != -1) { if ((stmp = ASN1_STRING_type_new(attrtype)) == NULL) goto err; if (!ASN1_STRING_set(stmp, data, len)) goto err; atype = attrtype; } /* * This is a bit naughty because the attribute should really have at * least one value but some types use and zero length SET and require * this. */ if (attrtype == 0) { ASN1_STRING_free(stmp); return 1; } if ((ttmp = ASN1_TYPE_new()) == NULL) goto err; if ((len == -1) && !(attrtype & MBSTRING_FLAG)) { if (!ASN1_TYPE_set1(ttmp, attrtype, data)) goto err; } else { ASN1_TYPE_set(ttmp, atype, stmp); stmp = NULL; } if (!sk_ASN1_TYPE_push(attr->randomvalues, ttmp)) goto err; return 1; err: ASN1_TYPE_free(ttmp); ASN1_STRING_free(stmp); return 0; } #endif使用以上代码定义了一个PKCS9_ATTRIBUTE结构,请根据以上定义,将-----BEGIN RKRD.der----- MCAGCiqGSIb3DQEJGQMxEgQQFn6w5yeB5JQBEiM0RVZneA== -----END RKRD.der-----数据进行解码成PKCS9_ATTRIBUTE结构的数据

2023-06-07 上传