LCOV - code coverage report
Current view: top level - ccache - mdfour.c (source / functions) Hit Total Coverage
Test: ccache.lcov.info Lines: 95 100 95.0 %
Date: 2015-06-29 Functions: 7 7 100.0 %
Branches: 17 18 94.4 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright (C) 1997-1998 Andrew Tridgell
       3                 :            :  *
       4                 :            :  * This program is free software; you can redistribute it and/or modify it
       5                 :            :  * under the terms of the GNU General Public License as published by the Free
       6                 :            :  * Software Foundation; either version 3 of the License, or (at your option)
       7                 :            :  * any later version.
       8                 :            :  *
       9                 :            :  * This program is distributed in the hope that it will be useful, but WITHOUT
      10                 :            :  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      11                 :            :  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
      12                 :            :  * more details.
      13                 :            :  *
      14                 :            :  * You should have received a copy of the GNU General Public License along with
      15                 :            :  * this program; if not, write to the Free Software Foundation, Inc., 51
      16                 :            :  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
      17                 :            :  */
      18                 :            : 
      19                 :            : #include "ccache.h"
      20                 :            : 
      21                 :            : /* NOTE: This code makes no attempt to be fast! */
      22                 :            : 
      23                 :            : static struct mdfour *m;
      24                 :            : 
      25                 :            : #define MASK32 (0xffffffff)
      26                 :            : 
      27                 :            : #define F(X,Y,Z) ((((X)&(Y)) | ((~(X))&(Z))))
      28                 :            : #define G(X,Y,Z) ((((X)&(Y)) | ((X)&(Z)) | ((Y)&(Z))))
      29                 :            : #define H(X,Y,Z) (((X)^(Y)^(Z)))
      30                 :            : #define lshift(x,s) (((((x)<<(s))&MASK32) | (((x)>>(32-(s)))&MASK32)))
      31                 :            : 
      32                 :            : #define ROUND1(a,b,c,d,k,s) a = lshift((a + F(b,c,d) + M[k])&MASK32, s)
      33                 :            : #define ROUND2(a,b,c,d,k,s) a = lshift((a + G(b,c,d) + M[k] + 0x5A827999)&MASK32,s)
      34                 :            : #define ROUND3(a,b,c,d,k,s) a = lshift((a + H(b,c,d) + M[k] + 0x6ED9EBA1)&MASK32,s)
      35                 :            : 
      36                 :            : /* this applies md4 to 64 byte chunks */
      37                 :            : static void
      38                 :         29 : mdfour64(uint32_t *M)
      39                 :            : {
      40                 :            :         uint32_t AA, BB, CC, DD;
      41                 :            :         uint32_t A,B,C,D;
      42                 :            : 
      43                 :         29 :         A = m->A; B = m->B; C = m->C; D = m->D;
      44                 :         29 :         AA = A; BB = B; CC = C; DD = D;
      45                 :            : 
      46                 :         29 :         ROUND1(A,B,C,D,  0,  3);  ROUND1(D,A,B,C,  1,  7);
      47                 :         29 :         ROUND1(C,D,A,B,  2, 11);  ROUND1(B,C,D,A,  3, 19);
      48                 :         29 :         ROUND1(A,B,C,D,  4,  3);  ROUND1(D,A,B,C,  5,  7);
      49                 :         29 :         ROUND1(C,D,A,B,  6, 11);  ROUND1(B,C,D,A,  7, 19);
      50                 :         29 :         ROUND1(A,B,C,D,  8,  3);  ROUND1(D,A,B,C,  9,  7);
      51                 :         29 :         ROUND1(C,D,A,B, 10, 11);  ROUND1(B,C,D,A, 11, 19);
      52                 :         29 :         ROUND1(A,B,C,D, 12,  3);  ROUND1(D,A,B,C, 13,  7);
      53                 :         29 :         ROUND1(C,D,A,B, 14, 11);  ROUND1(B,C,D,A, 15, 19);
      54                 :            : 
      55                 :            : 
      56                 :         29 :         ROUND2(A,B,C,D,  0,  3);  ROUND2(D,A,B,C,  4,  5);
      57                 :         29 :         ROUND2(C,D,A,B,  8,  9);  ROUND2(B,C,D,A, 12, 13);
      58                 :         29 :         ROUND2(A,B,C,D,  1,  3);  ROUND2(D,A,B,C,  5,  5);
      59                 :         29 :         ROUND2(C,D,A,B,  9,  9);  ROUND2(B,C,D,A, 13, 13);
      60                 :         29 :         ROUND2(A,B,C,D,  2,  3);  ROUND2(D,A,B,C,  6,  5);
      61                 :         29 :         ROUND2(C,D,A,B, 10,  9);  ROUND2(B,C,D,A, 14, 13);
      62                 :         29 :         ROUND2(A,B,C,D,  3,  3);  ROUND2(D,A,B,C,  7,  5);
      63                 :         29 :         ROUND2(C,D,A,B, 11,  9);  ROUND2(B,C,D,A, 15, 13);
      64                 :            : 
      65                 :         29 :         ROUND3(A,B,C,D,  0,  3);  ROUND3(D,A,B,C,  8,  9);
      66                 :         29 :         ROUND3(C,D,A,B,  4, 11);  ROUND3(B,C,D,A, 12, 15);
      67                 :         29 :         ROUND3(A,B,C,D,  2,  3);  ROUND3(D,A,B,C, 10,  9);
      68                 :         29 :         ROUND3(C,D,A,B,  6, 11);  ROUND3(B,C,D,A, 14, 15);
      69                 :         29 :         ROUND3(A,B,C,D,  1,  3);  ROUND3(D,A,B,C,  9,  9);
      70                 :         29 :         ROUND3(C,D,A,B,  5, 11);  ROUND3(B,C,D,A, 13, 15);
      71                 :         29 :         ROUND3(A,B,C,D,  3,  3);  ROUND3(D,A,B,C, 11,  9);
      72                 :         29 :         ROUND3(C,D,A,B,  7, 11);  ROUND3(B,C,D,A, 15, 15);
      73                 :            : 
      74                 :         29 :         A += AA; B += BB;
      75                 :         29 :         C += CC; D += DD;
      76                 :            : 
      77                 :         29 :         A &= MASK32; B &= MASK32;
      78                 :         29 :         C &= MASK32; D &= MASK32;
      79                 :            : 
      80                 :         29 :         m->A = A; m->B = B; m->C = C; m->D = D;
      81                 :         29 : }
      82                 :            : 
      83                 :            : static void
      84                 :         29 : copy64(uint32_t *M, const unsigned char *in)
      85                 :            : {
      86                 :            : #ifdef WORDS_BIGENDIAN
      87                 :            :         int i;
      88                 :            : 
      89                 :            :         for (i = 0; i < 16; i++)
      90                 :            :                 M[i] = (in[i*4+3]<<24) | (in[i*4+2]<<16) |
      91                 :            :                         (in[i*4+1]<<8) | (in[i*4+0]<<0);
      92                 :            : #else
      93                 :         29 :         memcpy(M, in, 16*4);
      94                 :            : #endif
      95                 :         29 : }
      96                 :            : 
      97                 :            : static void
      98                 :         94 : copy4(unsigned char *out, uint32_t x)
      99                 :            : {
     100                 :            : #ifdef WORDS_BIGENDIAN
     101                 :            :         out[0] = x&0xFF;
     102                 :            :         out[1] = (x>>8)&0xFF;
     103                 :            :         out[2] = (x>>16)&0xFF;
     104                 :            :         out[3] = (x>>24)&0xFF;
     105                 :            : #else
     106                 :         94 :         memcpy(out, &x, 4);
     107                 :            : #endif
     108                 :         94 : }
     109                 :            : 
     110                 :            : void
     111                 :         20 : mdfour_begin(struct mdfour *md)
     112                 :            : {
     113                 :         20 :         md->A = 0x67452301;
     114                 :         20 :         md->B = 0xefcdab89;
     115                 :         20 :         md->C = 0x98badcfe;
     116                 :         20 :         md->D = 0x10325476;
     117                 :         20 :         md->totalN = 0;
     118                 :         20 :         md->tail_len = 0;
     119                 :         20 :         md->finalized = 0;
     120                 :         20 : }
     121                 :            : 
     122                 :            : static
     123                 :         18 : void mdfour_tail(const unsigned char *in, size_t n)
     124                 :            : {
     125                 :         18 :         unsigned char buf[128] = { 0 };
     126                 :            :         uint32_t M[16];
     127                 :            :         uint32_t b;
     128                 :            : 
     129                 :         18 :         m->totalN += n;
     130                 :            : 
     131                 :         18 :         b = m->totalN * 8;
     132                 :            : 
     133         [ +  + ]:         18 :         if (n) {
     134                 :         16 :                 memcpy(buf, in, n);
     135                 :            :         }
     136                 :         18 :         buf[n] = 0x80;
     137                 :            : 
     138         [ +  - ]:         18 :         if (n <= 55) {
     139                 :         18 :                 copy4(buf+56, b);
     140                 :         18 :                 copy64(M, buf);
     141                 :         18 :                 mdfour64(M);
     142                 :            :         } else {
     143                 :          0 :                 copy4(buf+120, b);
     144                 :          0 :                 copy64(M, buf);
     145                 :          0 :                 mdfour64(M);
     146                 :          0 :                 copy64(M, buf+64);
     147                 :          0 :                 mdfour64(M);
     148                 :            :         }
     149                 :         18 : }
     150                 :            : 
     151                 :            : void
     152                 :         65 : mdfour_update(struct mdfour *md, const unsigned char *in, size_t n)
     153                 :            : {
     154                 :            :         uint32_t M[16];
     155                 :            : 
     156                 :            : #ifdef CCACHE_DEBUG_HASH
     157                 :            :         if (getenv("CCACHE_DEBUG_HASH")) {
     158                 :            :                 FILE* f = fopen("ccache-debug-hash.bin", "a");
     159                 :            :                 fwrite(in, 1, n, f);
     160                 :            :                 fclose(f);
     161                 :            :         }
     162                 :            : #endif
     163                 :            : 
     164                 :         65 :         m = md;
     165                 :            : 
     166         [ +  + ]:         65 :         if (!in) {
     167         [ +  + ]:         19 :                 if (!md->finalized) {
     168                 :         18 :                         mdfour_tail(md->tail, md->tail_len);
     169                 :         18 :                         md->finalized = 1;
     170                 :            :                 }
     171                 :         19 :                 return;
     172                 :            :         }
     173                 :            : 
     174         [ +  + ]:         46 :         if (md->tail_len) {
     175                 :         28 :                 size_t len = 64 - md->tail_len;
     176         [ +  + ]:         28 :                 if (len > n) {
     177                 :         23 :                         len = n;
     178                 :            :                 }
     179                 :         28 :                 memcpy(md->tail+md->tail_len, in, len);
     180                 :         28 :                 md->tail_len += len;
     181                 :         28 :                 n -= len;
     182                 :         28 :                 in += len;
     183         [ +  + ]:         28 :                 if (md->tail_len == 64) {
     184                 :          5 :                         copy64(M, md->tail);
     185                 :          5 :                         mdfour64(M);
     186                 :          5 :                         m->totalN += 64;
     187                 :          5 :                         md->tail_len = 0;
     188                 :            :                 }
     189                 :            :         }
     190                 :            : 
     191         [ +  + ]:         52 :         while (n >= 64) {
     192                 :          6 :                 copy64(M, in);
     193                 :          6 :                 mdfour64(M);
     194                 :          6 :                 in += 64;
     195                 :          6 :                 n -= 64;
     196                 :          6 :                 m->totalN += 64;
     197                 :            :         }
     198                 :            : 
     199         [ +  + ]:         46 :         if (n) {
     200                 :         21 :                 memcpy(md->tail, in, n);
     201                 :         65 :                 md->tail_len = n;
     202                 :            :         }
     203                 :            : }
     204                 :            : 
     205                 :            : void
     206                 :         19 : mdfour_result(struct mdfour *md, unsigned char *out)
     207                 :            : {
     208                 :         19 :         copy4(out, md->A);
     209                 :         19 :         copy4(out+4, md->B);
     210                 :         19 :         copy4(out+8, md->C);
     211                 :         19 :         copy4(out+12, md->D);
     212                 :         19 : }

Generated by: LCOV version 1.9