2005 年 2 月
终于把IP地址扩展的编解码弄出来了 关于Hungarian notation 婚宴归来
终于把IP地址扩展的编解码弄出来了
日有所得 2005-02-24 10:12:54
经过一番折腾,总算把IP地址扩展的编解码弄出来了。OpenSSL的ASN.1库确实强大,任意新类型,要实现编解码的步骤是:
- 写一个头文件按照其 ASN.1 定义写出数据结构的定义
- 头文件中用一下它的 DECLARE_ASN1_FUNCTIONS 宏声明原型
- 写一个实现文件,用 ASN1_SEQUENCE、ASN1_CHOICE 等定义好结构的模板,都是与其 ASN.1 定义一一对应的。这里面还没有搞得太清 楚,得读一下头文件并参照一些例子
- 实现文件中用宏 IMPLEMENT_ASN1_FUNCTIONS 实现 new、free、d2i 和 i2d 的功能
然后便可以使用对应的i2d和d2i函数进行编解码了。
注意DECLARE_ASN1_FUNCTIONS和IMPLEMENT_ASN1_FUNCTIONS是对应的,还有一个 DECLARE_ASN1_FUNCTIONS_const和IMPLEMENT_ASN1_FUNCTIONS_const是对应的,区别是后者声明的 d2i和i2d里面有适宜的const修饰,这当然更合理。然而这里有个不大不小的问题:DECLARE_ASN1_FUNCTIONS_const漏掉 了d2i和i2d的声明,-Wall编译时就看看出来警告没有函数原型。或许可以mail给openssl开发人员。
DECLARE_ASN1_FUNCTIONS
new, free
d2i, i2d
IMPLEMENT_ASN1_FUNCTIONS
encode: d2i, i2d
alloc: new, free
DECLARE_ASN1_FUNCTIONS_const
new, free
/* 就是这里,少了一句 DECLARE_ASN1_ENCODE_FUNCTIONS_const */
IMPLEMENT_ASN1_FUNCTIONS_const
const encode: d2i, i2d
alloc: new, free
评论人:sagely Fri Feb 25 19:52:12 CST 2005
我假设做最简单的实验
.h中只有如下:
typedef struct ASN1_TEST ASN1_TEST;
struct ASN1_TEST
{
ASN1_BIT_STRING *test;
};
DECLARE_ASN1_FUNCTIONS(ASN1_TEST)
而.c中只有如下:
ASN1_SEQUENCE(ASN1_TEST) =
{
ASN1_SIMPLE(ASN1_TEST, test, ASN1_BIT_STRING),
} ASN1_SEQUENCE_END(ASN1_TEST)
IMPLEMENT_ASN1_FUNCTIONS(ASN1_TEST)
请问:我如何测试一个BIT STRING的“011011100101110111”的编码是多少?
或者说我得到DER编码为“03 04 06 6e 5d c0"的BIT STRING是多少?
评论人:admin Fri Feb 25 21:51:05 CST 2005
要测试DER编码为 03 04 06 6e 5d c0 的 BIT STRING的解码,需要再包一层,因为你定义的test是在结构中,要作为SEQUENCE,即,准备一个SEQUENCE 的 DER
编码用来测试。测试代码示例如下:
unsigned char *der = "\x30\x06\x03\x04\x06\x6e\x5d\xc0";
ASN1_TEST *p;
p = d2i_ASN1_TEST(NULL, &der, 8);
懒得写printf语句,你 gcc -g 编译后,在gdb里看即可。当然VC里面更方便。d2i_ASN1_TEST 执行完后即可观察 p 的内容:
(gdb) p p->test
$3 = (struct asn1_string_st *) 0x8067018
(gdb) p *p->test
$4 = {length = 3, type = 3, data = 0x8067030 "n]à", flags = 14}
(gdb) x/3xb p->test->data
0x8067030: 0x6e 0x5d 0xc0
(gdb)
对了,那个const的问题还是因为你发的短消息我才发现的。
评论人:sagely Sat Feb 26 09:00:11 CST 2005
昨天我也申请了一个blog,我看你这里讨论linux和C语言比较多,很值得我经常来来呀.我的地址是sagely.blogchina.com
评论人:匿名网友 Sat Feb 26 18:56:36 CST 2005
char *der = "\x30\x06\x03\x04\x06\x6e\x5d\xc0";
ASN1_TEST *p;
p = d2i_ASN1_TEST(NULL,(unsigned char **)&der, 8);
printf("%2x\n",p->test->data);
得到的结果好象是882bd8.
然后我把char *der中的数值随便改变了一下,可是输出的还是882bd8,不知道为什么。
评论人:admin Sun Feb 27 20:23:59 CST 2005
你打印出来的是地址的值。正确的做法是:
for (i = 0; i < test->length; i++)
printf("%02x ", p->test->data[i]);
评论人:sagely Tue Mar 01 18:12:14 CST 2005 http://sagely.blogchina.com
哦,呵呵,对呀,p->test->data只是一个地址而已.
以后要要向你多请教C语言的基础呀.
评论人:sagely Tue Mar 01 18:13:25 CST 2005
哎,我写油箱写习惯了,居然把我的blog地址都写错了.真是糊涂拉.
评论人:admin Tue Mar 01 20:07:02 CST 2005
不要谦虚,互相学习吧,我看你写的倒是很高深啊
关于Hungarian notation
日有所得 2005-02-25 22:24:56
adjHungarian nounNotation verbIs advReally advFriggin adjAnnoying
来自一个关于 Hungarian notation 的争论,很有意思:
http://www.sitepoint.com/forums/showthread.php?t=143993
个人认为对于 C 程序员来说这东西实在是不好用,虽然偶尔也能有点帮助。我看除了指针用 p 开头,二级指针用 pp 开头这两条之外,就没什么必要用了:)
婚宴归来
日有所得 2005-02-28 09:46:27
昨日参加同学liang'r'a的婚宴,去了很多多年未见的本科同学,大家喝得比较高兴,酒酣耳热之际,让新郎新娘做的节目,有几个还挺有意思,暗暗留了 心,未雨绸缪啊!
1. 用一个空酒瓶灌入合适的水,使得一根木筷子浸入、浮起之后只露出瓶口两到三毫米,要求新郎新娘合力把筷子弄出来,只需用嘴、舌头。物理博士出的题,呵呵。 新郎新娘失败了 n 次,总算弄出来了。(对策:婚宴前可勤加练习。技巧:一人往里吹气,筷子便可浮起更高,另一人抓住时机以嘴噙之)
2. 吊个苹果要新人来咬。这个就比较传统了,没什么好说的。
3. 新人轮流拍对方脸,说一句"你真好玩"、"你真好笑"之类的话,双方都不准笑,违例则罚酒。10 轮不笑方为过关。(对策:这种日子不笑很难,游戏不要做了,直接认罚得了)
4. 新郎站在椅上,新娘将一鸡蛋由新郎的一条裤管进去,用手在裤子外面将鸡蛋往上移动或滚动,从另一裤管下来为过关。新娘两次失手掉了鸡蛋(生的),还好掉在 地上才破的,第三次换成了一个小西红柿果然好弄些了,不过似乎不太容易"过桥",新娘急了,伸手进去抓了然后放到了另一个裤管,未满十八请闭眼 ^_^,旁边有人叫了:小心别抓错了哦!大家一个个乐得脸涨红了,可算是婚宴的一个高潮,因此一致鼓掌同意过关。(对策?这个很难啊,婚宴前练练吧,据说 还有用香蕉替代鸡蛋的,怕怕)
5. 蒙住新娘/新郎的眼睛,要求从一堆手中摸出对方的手。这个也比较传统,新娘做的时候一次成功,因为新郎的手实在太肥厚了,找不出可以乱真的;轮新郎做的时 候,可真不争气,居然连错三次,呵呵。(对策:给对方暗示,小心宾客也会故意给暗示,因此自己给的暗示要能区别,先商量好,忍心的话就狠狠掐一下吧,宾客 是不敢狠掐的)
6. 一张厚纸巾从面对面的新人头上方做自由落体运动,经过新人的脸之间,要求新人用嘴夹住,"接纸"谐"接子"。这个有点意思,因为一开始掌握不了纸巾的运动 规律,新郎新娘当场接吻了好几次 ^_^。(对策?又不能找陪练)
0 Comments so far