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

無我

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

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>
            香蕉国产精品偷在线观看不卡 | 亚洲欧洲免费视频| 亚洲精品女av网站| 亚洲精品老司机| 亚洲精品一区在线| 一区二区激情| 亚洲一区二区毛片| 欧美一区二区精品| 久久久免费精品| 欧美福利视频| 夜色激情一区二区| 亚洲欧美一区二区三区在线| 午夜精品免费| 蜜臀久久久99精品久久久久久| 美日韩免费视频| 欧美视频免费| 国产亚洲欧美一区二区| 黄色成人av网| 亚洲精品影视| 欧美亚洲综合在线| 欧美xx69| 一区二区日韩欧美| 久久久夜色精品亚洲| 欧美精品 日韩| 国产色产综合产在线视频| 亚洲国产高清aⅴ视频| 正在播放欧美视频| 久久欧美中文字幕| 一区二区精品国产| 久久婷婷麻豆| 国产精品嫩草99a| 91久久综合亚洲鲁鲁五月天| 午夜日韩福利| 亚洲精品视频在线| 久久精品成人一区二区三区| 欧美日韩高清在线播放| 黄色成人在线| 欧美在线免费观看亚洲| 亚洲伦理久久| 美女精品国产| 久久综合给合久久狠狠狠97色69| 亚洲欧洲久久| 久久久www成人免费精品| 亚洲乱码一区二区| 免费在线观看一区二区| 国产亚洲一区二区三区在线观看| 99国产精品99久久久久久粉嫩| 久久久久久亚洲精品中文字幕| 99亚洲视频| 欧美成人r级一区二区三区| 国产欧美三级| 新片速递亚洲合集欧美合集| 亚洲精品精选| 欧美成人午夜免费视在线看片| 国产三区二区一区久久| 香港成人在线视频| 一区二区国产日产| 欧美视频中文字幕| 亚洲视频精选| 一本一本大道香蕉久在线精品| 欧美电影打屁股sp| 亚洲国内自拍| 欧美激情精品久久久| 老司机精品导航| 亚洲国产精品尤物yw在线观看 | 欧美精品色网| 夜夜嗨一区二区| 日韩一级不卡| 欧美日韩激情小视频| 一本色道久久综合亚洲精品小说 | 国产精品国产三级国产专播精品人| 亚洲日本激情| 亚洲黄色一区| 欧美日韩一区在线播放| 亚洲无线视频| 亚洲欧美精品在线观看| 国产午夜精品全部视频播放| 欧美中文字幕视频| 久久久国际精品| 亚洲精品美女在线| 亚洲免费播放| 国产一区二区三区久久| 欧美成人影音| 欧美日韩国产三区| 久久aⅴ国产欧美74aaa| 久久久精品2019中文字幕神马| 亚洲精品久久久久久一区二区 | 国产在线精品二区| 欧美国产国产综合| 欧美色精品天天在线观看视频 | 免费不卡中文字幕视频| 欧美激情一区二区三区 | 亚洲精品乱码久久久久久按摩观| 亚洲欧美一区二区激情| 国产欧美精品在线观看| 免费成人高清| 欧美精品日韩一区| 欧美一区1区三区3区公司| 欧美在线一级视频| 日韩一区二区精品视频| 性色av一区二区三区红粉影视| 在线免费观看成人网| 99综合精品| 136国产福利精品导航网址应用| 亚洲精品在线免费| 国产一区二区三区久久久久久久久 | 欧美一区二区三区四区视频| 在线精品视频一区二区| 在线亚洲免费视频| 亚洲成色777777女色窝| 亚洲一区二区视频| 日韩视频专区| 久久精精品视频| 亚洲欧美日韩精品综合在线观看| 久久精品国产欧美亚洲人人爽| 亚洲私人影院| 欧美成人一区二区三区片免费| 欧美中文字幕| 国产精品男女猛烈高潮激情| 亚洲国产欧美在线| 伊人成人在线视频| 亚洲欧美中文在线视频| 亚洲影视在线播放| 欧美日韩国产精品自在自线| 亚洲第一在线| 在线免费不卡视频| 久久精品国产精品| 久久精品一区二区三区不卡牛牛| 国产精品九九久久久久久久| 亚洲精品乱码久久久久久蜜桃麻豆| 国产日韩欧美精品综合| 一本色道久久加勒比精品| 99精品国产在热久久| 欧美大片免费久久精品三p | 亚洲日韩欧美视频| 日韩视频久久| 欧美大尺度在线观看| 欧美激情一区二区| 亚洲精品一二三区| 欧美日本在线| 亚洲精品久久久久久久久久久久久| 亚洲国产女人aaa毛片在线| 狂野欧美一区| 亚洲高清自拍| 久久久爽爽爽美女图片| 久久久久久久欧美精品| 国产午夜精品一区理论片飘花| 国产精品99久久久久久久女警| 亚洲欧美日韩天堂| 国产欧美一区二区白浆黑人| 欧美一级在线视频| 久久久久国产精品一区二区| 国产一区二区日韩精品| 久久精品国产精品亚洲| 欧美电影美腿模特1979在线看| 在线日韩av片| 欧美成人国产一区二区 | 久久久久欧美精品| 欧美国产免费| 亚洲免费大片| 国产精品成人观看视频免费| 午夜精品久久久久久久久| 卡通动漫国产精品| 99av国产精品欲麻豆| 国产精品一二| 久久精品视频在线| 欧美成人午夜| 亚洲一区bb| 在线观看三级视频欧美| 欧美日韩第一区日日骚| 亚洲欧美日韩中文在线制服| 久久一区免费| 一本大道久久a久久精二百| 国产精品视频一二| 免播放器亚洲一区| 午夜精品99久久免费| 欧美黄在线观看| 欧美亚洲自偷自偷| 日韩亚洲视频| 好吊视频一区二区三区四区| 欧美久久久久久久久久| 午夜精品久久| 亚洲欧洲免费视频| 久久综合婷婷| 欧美影视一区| 中文精品视频| 在线观看视频欧美| 国产精品v欧美精品v日韩| 久久综合电影一区| 亚洲欧美日韩一区二区三区在线| 亚洲欧洲免费视频| 免费不卡亚洲欧美| 久久都是精品| 午夜精品福利电影| 亚洲一区二区免费视频| 亚洲欧洲精品一区二区三区| 国产一区二区主播在线| 国产精品九九久久久久久久| 欧美精品一区二区三区蜜桃| 久久久久久久久一区二区|