2017-04-11 5 views
0

すべてがタイトルにあります。私はこの具体的な詳細についての情報を見つけることができません。実装(私はここに投稿します。ヘッダーmd32_common.hで見つけることができます)を確認する間に、私は本当に伝えることができませんでした...opensslのハッシュ関数の実装は、ビットまたはバイト指向ですか?

ここ

はMD5のようなハッシュ関数は、典型的には、ビットストリーム上で動作するが、ソフトウェアの実装は、通常、バイトで動作するすべてのハッシュ関数更新機能(すなわちMD5_Update(...))によって呼び出されるHASH_UPDATE機能

int HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len) 
{ 
    const unsigned char *data = data_; 
    unsigned char *p; 
    HASH_LONG l; 
    size_t n; 

    if (len == 0) 
     return 1; 

    l = (c->Nl + (((HASH_LONG) len) << 3)) & 0xffffffffUL; 
    /* 
    * 95-05-24 eay Fixed a bug with the overflow handling, thanks to Wei  
    Dai 
    * <[email protected]> for pointing it out. 
    */ 
    if (l < c->Nl)    /* overflow */ 
     c->Nh++; 
    c->Nh += (HASH_LONG) (len >> 29); /* might cause compiler warning on 
            * 16-bit */ 
    c->Nl = l; 

    n = c->num; 
    if (n != 0) { 
     p = (unsigned char *)c->data; 

     if (len >= HASH_CBLOCK || len + n >= HASH_CBLOCK) { 
      memcpy(p + n, data, HASH_CBLOCK - n); 
      HASH_BLOCK_DATA_ORDER(c, p, 1); 
      n = HASH_CBLOCK - n; 
      data += n; 
      len -= n; 
      c->num = 0; 
      /* 
      * We use memset rather than OPENSSL_cleanse() here 
       deliberately. 
      * Using OPENSSL_cleanse() here could be a performance issue. 
       It 
      * will get properly cleansed on finalisation so this isn't a 
      * security problem. 
      */ 
      memset(p, 0, HASH_CBLOCK); /* keep it zeroed */ 
     } else { 
      memcpy(p + n, data, len); 
      c->num += (unsigned int)len; 
      return 1; 
     } 
    } 

    n = len/HASH_CBLOCK; 
    if (n > 0) { 
     HASH_BLOCK_DATA_ORDER(c, data, n); 
     n *= HASH_CBLOCK; 
     data += n; 
     len -= n; 
    } 

    if (len != 0) { 
     p = (unsigned char *)c->data; 
     c->num = (unsigned int)len; 
     memcpy(p, data, len); 
    } 
    return 1; 
} 

答えて

2

ありますビットシフトのスピードペナルティを避けます(データは通常どんな場合でもバイト単位またはそれ以上の単位で処理されるため)。あなたが投稿のコードでは、行

l = (c->Nl + (((HASH_LONG) len) << 3)) & 0xffffffffUL; 

はバイトはビット数にカウントを変換する(3回、左シフトすることにより)8によってlenパラメータを乗算ので、私はそれがこのコードはビットを使用していることを言っても安全だと思います内部的には、バイトのストリームが渡されることが予想されます。

関連する問題