Subversion Repositories spk

Rev

Rev 1 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1 Rev 160
Line 2107... Line 2107...
2107
  if (len) do {DO1(buf);} while (--len);
2107
  if (len) do {DO1(buf);} while (--len);
2108
  return crc ^ 0xffffffffL;  // (instead of ~c for 64-bit machines)
2108
  return crc ^ 0xffffffffL;  // (instead of ~c for 64-bit machines)
2109
}
2109
}
2110
 
2110
 
2111
 
2111
 
2112
void update_keys(unsigned long *keys, char c)
2112
void update_keys(unsigned long *keys, char c)
2113
{ keys[0] = CRC32(keys[0],c);
2113
{ keys[0] = CRC32(keys[0],c);
2114
  keys[1] += keys[0] & 0xFF;
2114
  keys[1] += keys[0] & 0xFF;
2115
  keys[1] = keys[1]*134775813L +1;
2115
  keys[1] = keys[1]*134775813L +1;
2116
  keys[2] = CRC32(keys[2], keys[1] >> 24);
2116
  keys[2] = CRC32(keys[2], keys[1] >> 24);
2117
}
2117
}
2118
char decrypt_byte(unsigned long *keys)
2118
char decrypt_byte(unsigned long *keys)
2119
{ unsigned temp = ((unsigned)keys[2] & 0xffff) | 2;
2119
{ unsigned temp = ((unsigned)keys[2] & 0xffff) | 2;
2120
  return (char)(((temp * (temp ^ 1)) >> 8) & 0xff);
2120
  return (char)(((temp * (temp ^ 1)) >> 8) & 0xff);
2121
}
2121
}
2122
char zencode(unsigned long *keys, char c)
2122
char zencode(unsigned long *keys, char c)
2123
{ int t=decrypt_byte(keys);
2123
{ int t=decrypt_byte(keys);
2124
  update_keys(keys,c);
2124
  update_keys(keys,c);
2125
  return (char)(t^c);
2125
  return (char)(t^c);
2126
}
2126
}
2127
 
2127
 
2128
 
2128
 
2129
 
2129
 
2130
 
2130
 
2131
 
2131
 
Line 2639... Line 2639...
2639
  if (r!=ZE_OK) {iclose(); return ZR_WRITE;}
2639
  if (r!=ZE_OK) {iclose(); return ZR_WRITE;}
2640
  writ += 4 + LOCHEAD + (unsigned int)zfi.nam + (unsigned int)zfi.ext;
2640
  writ += 4 + LOCHEAD + (unsigned int)zfi.nam + (unsigned int)zfi.ext;
2641
  if (oerr!=ZR_OK) {iclose(); return oerr;}
2641
  if (oerr!=ZR_OK) {iclose(); return oerr;}
2642
 
2642
 
2643
  // (1.5) if necessary, write the encryption header
2643
  // (1.5) if necessary, write the encryption header
2644
  keys[0]=305419896L;
2644
  keys[0]=305419896L;
2645
  keys[1]=591751049L;
2645
  keys[1]=591751049L;
2646
  keys[2]=878082192L;
2646
  keys[2]=878082192L;
2647
  for (const char *cp=password; cp!=0 && *cp!=0; cp++) update_keys(keys,*cp);
2647
  for (const char *cp=password; cp!=0 && *cp!=0; cp++) update_keys(keys,*cp);
2648
  // generate some random bytes
2648
  // generate some random bytes
2649
  if (!has_seeded) srand(GetTickCount()^(unsigned long)GetDesktopWindow());
2649
  if (!has_seeded) srand(GetTickCount()^(unsigned long)GetDesktopWindow());
2650
  char encbuf[12]; for (int i=0; i<12; i++) encbuf[i]=(char)((rand()>>7)&0xff);
2650
  char encbuf[12]; for (int i=0; i<12; i++) encbuf[i]=(char)((rand()>>7)&0xff);
2651
  encbuf[11] = (char)((zfi.tim>>8)&0xff);
2651
  encbuf[11] = (char)((zfi.tim>>8)&0xff);
2652
  for (int ei=0; ei<12; ei++) encbuf[ei]=zencode(keys,encbuf[ei]);
2652
  for (int ei=0; ei<12; ei++) encbuf[ei]=zencode(keys,encbuf[ei]);
2653
  if (password!=0 && !isdir) {swrite(this,encbuf,12); writ+=12;}
2653
  if (password!=0 && !isdir) {swrite(this,encbuf,12); writ+=12;}
2654
 
2654
 
2655
  //(2) Write deflated/stored file to zip file
2655
  //(2) Write deflated/stored file to zip file
2656
  ZRESULT writeres=ZR_OK;
2656
  ZRESULT writeres=ZR_OK;
2657
  encwriting = (password!=0 && !isdir);  // an object member variable to say whether we write to disk encrypted
2657
  encwriting = (password!=0 && !isdir);  // an object member variable to say whether we write to disk encrypted
2658
  if (!isdir && method==DEFLATE) writeres=ideflate(&zfi);
2658
  if (!isdir && method==DEFLATE) writeres=ideflate(&zfi);