SymCryptMarvin32AppendBlocks

INT64 __fastcall SymCryptMarvin32AppendBlocks(UINT64 *a1, INT64 a2, INT64 a3){
  INT64 result; 
  int v4; 
  INT64 v5; 
  _DWORD *v6; 
  INT64 v7; 
  int v8; 
  int v9; 
  int v10; 
  int v11; 
  int v12; 
  int v13; 
  int v14; 
  int v15; 
  int v16; 
  int v17; 
  int v18; 
  int v19; 
  int v20; 
  int v21; 
  int v22; 
  int v23; 
  result = *(unsigned int *)a1;
  v4 = *((_DWORD *)a1 + 1);
  v5 = a3 & 0xC;
  v6 = (_DWORD *)(v5 + a2);
  v7 = a3 - v5;
  switch( v5 )
  {
    case 0i64:
      goto LABEL_6;
    case 4i64:
      goto LABEL_10;
    case 8i64:
      goto LABEL_9;
    case 12i64:
      while( 1 )
      {
        v12 = *(v6 - 3) + result;
        v13 = v12 ^ v4;
        v14 = v13 + __ROL4__(v12, 20);
        v15 = v14 ^ __ROL4__(v13, 9);
        LODWORD(result) = v15 + __ROL4__(v14, 27);
        v4 = __ROL4__(v15, 19);
LABEL_9:
        v16 = *(v6 - 2) + result;
        v17 = v16 ^ v4;
        v18 = v17 + __ROL4__(v16, 20);
        v19 = v18 ^ __ROL4__(v17, 9);
        LODWORD(result) = v19 + __ROL4__(v18, 27);
        v4 = __ROL4__(v19, 19);
LABEL_10:
        v20 = *(v6 - 1) + result;
        v21 = v20 ^ v4;
        v22 = v21 + __ROL4__(v20, 20);
        v23 = v22 ^ __ROL4__(v21, 9);
        result = (unsigned int)(v23 + __ROL4__(v22, 27));
        v4 = __ROL4__(v23, 19);
LABEL_6:
        if( !v7 )
          break;
        v8 = *v6 + result;
        v6 += 4;
        v9 = v8 ^ v4;
        v7 -= 16i64;
        v10 = v9 + __ROL4__(v8, 20);
        v11 = v10 ^ __ROL4__(v9, 9);
        LODWORD(result) = v11 + __ROL4__(v10, 27);
        v4 = __ROL4__(v11, 19);
      }
      break;
  }
  *(_DWORD *)a1 = result;
  *((_DWORD *)a1 + 1) = v4;
  return result;
}

Referenced by:

SymCryptMarvin32Append
SymCryptMarvin32Result