青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

無我

讓內心永遠燃燒著偉大的光明的精神之火!
靈活的思考,嚴謹的實現
豪邁的氣魄、頑強的意志和周全的思考

eSNACC對OBJECT IDENTIFIER的編碼和解碼

本文剖析asn-oid.h/c,從源代碼來學習eSNACC對OBJECT IDENTIFIER的編碼和解碼。

在研究代碼之前,我們先來說明什么是OBJECT IDENTIFIER。

————————————以下一段來自于http://www.eccsdk.com/bbs/read.php?tid=1772————————————————

 ASN.1 對象標識符類型 
      對象標識符(OBJECT IDENTIFIER, OID)類型用層次的形式來表示標準規范.標識符樹通過一個點分的十進制符號來定義,這個符號以組織,子部分然后是標準的類型和各自的子標識符開始. 

      例如:MD5的OID 是 1.2.840.113549.2.5  表示為"iso(1) member-body (2) US (840) rsadsi(113549) digestAlgorithm (2) md5 (5)", 所以當解碼程序看到這個OID時,就知道是MD5散列. 

      OID在公鑰算法標準中很流行,它指出證書綁定了哪種散列算法. 同樣,也有公鑰算法,分組算法,和操作模式的OID. 它們是一種高效且可移植的表示數據包中所選算法的形式. 

      對OID的編碼規則: 
1、前兩部分如果定義為x.y, 那么它們將合成一個字40*x + y, 其余部分單獨作為一個字節進行編碼. 
2、每個字首先被分割為最少數量的沒有頭零數字的7位數字.這些數字以big-endian格式進行組織,并且一個接一個地組合成字節. 除了編碼的最后一個字節外,其他所有字節的最高位(位8)都為1.
     舉例: 30331 = 1 * 128^2 + 108 * 128 + 123  分割成7位數字(0x80)后為{1,108,123}設置最高位后變成{129,236,123}.如果該字只有一個7位數字,那么最高為0.   

     MD5 OID的編碼: 
        1. 將1.2.840.113549.2.5轉換成字數組 {42, 840, 113549, 2, 5}. 
        2. 然后將每個字分割為帶有最高位的7位數字,{{0x2A},{0x86,0x48},{0x86,0xF7,0x0D},{0x02},{0x05}}. 
        3. 最后完整的編碼為 0x06 08 2A 86 48 86 F7 0D 02 05.

————————————————————————————————————————————————————————————

有了上面的直觀的理解,我們再研究代碼就不會困惑了。

在eSNACC中,OBJECT IDENTIFIER實現分為oid和RELATIVE OID。oid要求至少必須由兩部分數字組成,因為要編碼的一個值為40*x + y,所以如果不滿足就會報錯。就如同上面例子中的MD5 OID,就有6個部分。而RELATIVE OID就沒有這個要求,對她的編碼沒有做40*x + y的操作,解碼也不需要逆處理。但是RELATIVE OID必須和一個oid根相關聯。因為RELATIVE OID的定義方式和處理函數都與oid類似,僅僅是少了上面所說的第一個編碼規則操作,所以我們只討論oid,而RELATIVE OID就不展開了。

eSNACC對oid有兩種實現:用字節串存放和用鏈表形式存放,對字節串存放,就是每一個字節存放一個數值;而鏈表,就是每一個節點元素存放一個值。不過文檔說:如果追求更好的性能,應當采用字節串的形式。這兩種方式定義如下:

字節串形式,定義為AsnOid,直接從AsnOcts定義過來:

typedef AsnOcts AsnOid;  /* standard oid type  */

鏈表形式,定義為OID:

/* linked oid type that may be easier to use in some circumstances */
#define NULL_OID_ARCNUM    -1
typedef 
struct OID
{
  
struct OID    *next;
  
long arcNum;
#if COMPILER || TTBL
  
struct Value    *valueRef;
#endif
}
 OID;

頭文件中還定義了若干函數實現這兩者的互相轉換。

嚴重說明:

AsnOid存放的是已經對原始的OBJECT IDENTIFIER編碼之后的值!比如上面例子的MD5,字節串是2A 86 48 86 F7 0D 02 05。

而OID存的是OBJECT IDENTIFIER的原始值鏈。比如上面例子的MD5,鏈表為1->2->840->113549->2->5。

 

 

/**************************************休息一下********************************************

上文我們說過:AsnOid存放的是已經對原始的OBJECT IDENTIFIER編碼之后的值。所以我們當我們要對一個AsnOid進行打印輸出時,就需要進行前面所說編碼算法的逆運算,這個我們可以通過打印例程來驗證一下:

/*
 * Prints the given OID to the given FILE * in ASN.1 Value Notation.
 * Since the internal rep of an OID is 'encoded', this routine
 * decodes each individual arc number to print it.
 
*/

void
PrintAsnOid PARAMS ((f,v, indent),
    FILE 
*f _AND_
    AsnOid 
*v _AND_
    unsigned 
int indent)
{
    unsigned 
int firstArcNum;
    unsigned 
int arcNum;
    
int i;

    fprintf (f,
"{");

    
/* un-munge first two arc numbers */
    
for (arcNum = 0, i=0; (i < (int)(v->octetLen)) && (v->octs[i] & 0x80);i++)
        arcNum 
= (arcNum << 7+ (v->octs[i] & 0x7f);

    arcNum 
= (arcNum << 7+ (v->octs[i] & 0x7f);
    i
++;
    firstArcNum 
= (unsigned short)(arcNum/40);
    
if (firstArcNum > 2)
        firstArcNum 
= 2;

    fprintf (f,
"%u %u", (unsigned int)firstArcNum, arcNum - (firstArcNum * 40));

    
for (; i < (int)(v->octetLen); )
    
{
        
for (arcNum = 0; (i < (int)(v->octetLen)) && (v->octs[i] & 0x80);i++)
            arcNum 
= (arcNum << 7+ (v->octs[i] & 0x7f);

        arcNum 
= (arcNum << 7+ (v->octs[i] & 0x7f);
        i
++;
        fprintf (f,
" %u", arcNum);
    }

    fprintf (f,
"}");
    indent
=indent; /* referenced to avoid compiler warning. */

}
 /* PrintAsnOid */

從代碼可以看到,這個算法就是這樣的:

首先得到第一個數,因為如果一個編碼后的數用了多個字節表示,那么除了最后一個以外,前面的字節的最高位肯定為1.所以就用一個循環來獲取一個完整的數。后面嵌套的for也是這個原理。然后對取得的第一個數分拆:num=first*40+second。這樣就完成第一步的逆算法并打印出來。

然后遍歷這個字節串,每獲取一個完整的數就打印出來。由于for循環只是把最高位為1的字節遍歷了,所以都需要加上最后一個字節。其實我們發現用多個字節存的數對應前面的字節的128的n次方和最末尾一個字節值的和。

 

而OID存的是原始值,就讓我們通過這個OID -> AsnOid的函數來進一步理解兩者的不同:

/*
 * given an oid list and a pre-allocated ENC_OID
 * (use EncodedOidLen to figure out byte length needed)
 * fills the ENC_OID with a BER encoded version
 * of the oid.
 
*/

void
BuildEncodedOid PARAMS ((oid, result),
    OID 
*oid _AND_
    AsnOid 
*result)
{
    unsigned 
long len;
    unsigned 
long headArcNum;
    unsigned 
long tmpArcNum;
    
char         *buf;
    
int           i;
    OID          
*tmpOid;

    buf 
= result->octs;
    
/*
     * oid must have at least 2 elmts
     
*/

    
if (oid->next == NULL)
       
return;
    
/*
     * munge together first two arcNum
     * note first arcnum must be <= 2
     * and second must be < 39 if first = 0 or 1
     * see (X.209) for ref to this stupidity
     
*/

    
//head = first * 40 + second
    headArcNum = (oid->arcNum * 40+ oid->next->arcNum;
    tmpArcNum 
= headArcNum;

    
/*
     * 計算存放第一個數需要幾個字節。每7位要一個字節
     
*/

    
for (len = 0; (tmpArcNum >>= 7!= 0; len++)
    ;

    
/*
     * 從高位到低位,把每7位寫到緩沖區,因為不是最后一個字節,所以都把最高位設為1
     
*/

    
for (i=0; i < (int)len; i++)
        
*(buf++= (char)(0x80 | (headArcNum >> ((len-i)*7)));

    
/*
     * 將寫第一個數的最后7位寫到最后一個字節
     
*/

    
*(buf++= (char)(0x7f & headArcNum);


    
/*
     * 如果有,就把后面的數寫到緩沖區,原理和第一個數相同,里面不再注釋
     
*/

    
for (tmpOid = oid->next->next; tmpOid != NULL; tmpOid = tmpOid->next)
    
{
        tmpArcNum 
= tmpOid->arcNum;
        
for (len = 0; (tmpArcNum >>= 7!= 0; len++)
        ;

        
for (i=0; i < (int)len; i++)
            
*(buf++= (char)(0x80 | (tmpOid->arcNum >> ((len-i)*7)));

          
*(buf++= (char)(0x7f & tmpOid->arcNum);
    }

    result
->octetLen = (buf - result->octs);//根據被寫的緩沖區設定字節長度
}
 /* BuildEncodedOid */

在上面的函數中,我已經對相應語句做了注釋了,所以這里就不復述了。

 

文件中其他函數都是這個原理,就很簡單了。本篇就到此吧。

posted on 2012-04-24 16:30 Tim 閱讀(1834) 評論(0)  編輯 收藏 引用 所屬分類: eSNACC學習

<2012年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

導航

統計

公告

本博客原創文章,歡迎轉載和交流。不過請注明以下信息:
作者:TimWu
郵箱:timfly@yeah.net
來源:m.shnenglu.com/Tim
感謝您對我的支持!

留言簿(9)

隨筆分類(173)

IT

Life

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            噜噜噜躁狠狠躁狠狠精品视频| 久久久久久伊人| 久久精品30| 欧美国产第一页| 亚洲美女av黄| 99国产精品国产精品久久| 国产精品区二区三区日本| 国产日本欧美一区二区三区在线 | 欧美激情亚洲自拍| 美日韩精品免费观看视频| 欧美激情四色 | 中文在线资源观看视频网站免费不卡| 久久精品国产免费看久久精品| 欧美大尺度在线| 欧美亚洲在线| 欧美成年人在线观看| 激情综合亚洲| 亚洲一区二区黄色| 亚洲激情中文1区| 欧美一区二区在线免费播放| 国产精品激情电影| av不卡在线观看| 久久精品欧洲| 欧美亚洲免费高清在线观看| 国产精品久久久久9999高清| 一区二区三欧美| 最新日韩中文字幕| 欧美国产日韩精品免费观看| 美女爽到呻吟久久久久| 亚洲欧美卡通另类91av| 国产精品免费观看在线| 亚洲天堂成人在线观看| 欧美三级黄美女| 国产视频丨精品|在线观看| 午夜精品久久久久久久久久久久久 | 亚洲视频一区在线| 欧美日韩视频在线一区二区| 国产精品一区二区你懂的| 午夜精品久久久久久久久久久久久| 一本色道久久加勒比精品 | 国产一区欧美| 久久精品一区二区三区不卡牛牛| 亚洲综合国产精品| 国产日韩欧美在线| 欧美99久久| 欧美成人精品高清在线播放| 亚洲欧洲在线看| 91久久国产综合久久蜜月精品| 欧美精品性视频| 亚洲激情在线| 亚洲精品中文字幕在线| 欧美视频日韩视频在线观看| 亚洲高清视频中文字幕| 亚洲黄色av| 国产精品乱看| 国产一区二区三区最好精华液| 欧美日韩p片| 亚洲一区在线观看视频| 午夜精品免费在线| 亚洲第一主播视频| 欧美xxxx在线观看| 久久精品国产视频| 亚洲大胆人体视频| 一本高清dvd不卡在线观看| 国产欧美日韩伦理| 亚洲东热激情| 久久久xxx| 亚洲欧美在线视频观看| 久久久久久欧美| 亚洲一区二区三区777| 欧美xart系列高清| 欧美一级免费视频| 久久视频精品在线| 久久岛国电影| 欧美精品一区二区高清在线观看| 亚洲欧美自拍偷拍| 欧美日韩国产在线一区| 久久乐国产精品| 欧美视频日韩视频| 日韩视频二区| 亚洲高清中文字幕| 亚洲综合第一页| 亚洲欧美一区二区精品久久久| 免费成人美女女| 欧美在线高清视频| 欧美成人亚洲| 欧美成人久久| 国产午夜亚洲精品羞羞网站| 亚洲一区久久久| av成人免费观看| 猛干欧美女孩| 欧美a级在线| 国产专区欧美专区| 亚洲一区亚洲| 午夜精品久久久久久久久久久久| 蜜臀av在线播放一区二区三区 | 牛人盗摄一区二区三区视频| 国内精品久久国产| 在线中文字幕不卡| 艳妇臀荡乳欲伦亚洲一区| 欧美国产一区二区| 欧美国产在线电影| …久久精品99久久香蕉国产| 性久久久久久久久久久久| 欧美黄在线观看| 亚欧美中日韩视频| 国产一区二区精品丝袜| 亚洲永久在线观看| 亚洲伦伦在线| 欧美特黄一级| 一区二区三区视频免费在线观看| 国产精品久久久久毛片软件| 亚洲欧美国产精品专区久久| 亚洲欧美成人综合| 欧美激情精品久久久久久黑人 | 欧美在线一二三区| 亚洲日本国产| 亚洲在线免费观看| 久久偷看各类wc女厕嘘嘘偷窃| 国产精品久久久久国产a级| 日韩视频一区二区三区在线播放 | 久久精品日产第一区二区| 国产精品无码专区在线观看| 亚洲天堂第二页| 国产精品一区二区在线观看网站 | 久久综合网络一区二区| 91久久精品美女| 亚洲色在线视频| 国产精品va在线播放| 欧美一区二区三区免费在线看| 欧美一区二视频在线免费观看| 国产日产欧美精品| 欧美va天堂在线| 日韩一级免费| 欧美一区二区三区视频免费| 在线观看一区视频| 欧美日韩国产成人在线观看| 一区二区三区日韩| 欧美激情一区二区三区不卡| 一本久久青青| 国产精品视频免费| 美女久久网站| 中文久久乱码一区二区| 久久久在线视频| 亚洲免费综合| 亚洲高清在线精品| 国产精品国产三级国产aⅴ入口| 久久在线91| 亚洲网站啪啪| 欧美激情第五页| 久久久美女艺术照精彩视频福利播放| 亚洲国产日韩欧美综合久久| 欧美三级电影精品| 欧美日韩aaaaa| 久久久国产精彩视频美女艺术照福利 | 91久久精品美女| 国产伦理一区| 久久激情综合| 亚洲一区精彩视频| 亚洲国产成人不卡| 亚洲午夜高清视频| 91久久久亚洲精品| 国产日韩欧美综合精品| 久久精品国产清自在天天线| 亚洲欧美一区二区原创| 91久久久在线| 欧美在线播放一区| 午夜视频一区在线观看| 亚洲国产色一区| 欧美视频网址| 欧美美女bb生活片| 久久人人97超碰国产公开结果| 亚洲电影激情视频网站| 欧美成人综合| 老色批av在线精品| 亚洲美女精品成人在线视频| 亚洲国产精品999| 国产一区二区三区四区老人| 欧美91大片| 亚洲一区二区三区四区在线观看| 亚洲国产影院| 女同性一区二区三区人了人一 | 久久久亚洲一区| 亚洲欧美激情诱惑| 亚洲免费影院| 一区二区三区精品| 久久永久免费| 欧美成人国产| 久久久久五月天| 欧美精品一区三区在线观看| 欧美电影免费观看高清| 久久人人爽人人爽爽久久| 另类尿喷潮videofree| 久久成人免费| 久久国产精品99国产精| 久久在线观看视频| 美腿丝袜亚洲色图| 欧美国产日韩一区| 国产精品国产三级国产专播精品人 | 久久亚洲精品一区|