2017-04-11 2 views
0

모든 것이 제목에 있습니다. 이 세부 사항에 대한 정보를 찾을 수 없으며, 구현을 확인하기 위해 (여기에 게시 할 예정이며 헤더 md32_common.h에서 찾을 수 있습니다.) 실제로 알 수는 없습니다 ...해시 함수의 openssl 구현은 비트 또는 바이트 지향입니까?

다음

모든 해시 함수 업데이트 기능에 의해 호출되는 HASH_UPDATE 기능입니다 (MD5_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

MD5와 같은 해시 함수는 일반적으로 비트 스트림에서 작동하지만은 소프트웨어 구현은 일반적으로 바이트에서 작동 비트 시프 팅의 속도 저하를 피하십시오 (데이터는 일반적으로 바이트 단위 또는 그 이상으로 처리되기 때문에). 코드에서는

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

라인을 게시 바이트는 비트 수로 계산 변환 (3 회를 왼쪽으로 이동하여) (8)에 의해 len 매개 변수를 곱합니다, 그래서 나는이 코드는 비트를 사용하는 말을하는 것이 안전하다고 생각 내부적으로는 바이트 스트림을 전달할 것으로 예상됩니다.