srcanamdw/codescanner/pyinstaller/source/zlib/crypt.h
author noe\swadi
Thu, 18 Feb 2010 12:29:02 +0530
changeset 1 22878952f6e2
permissions -rw-r--r--
Committing the CodeScanner Core tool This component has been moved from the StaticAnaApps package. BUG : 5889 (http://developer.symbian.org/webbugs/show_bug.cgi?id=5889).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     1
/* crypt.h -- base code for crypt/uncrypt ZIPfile
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     3
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     4
   Version 1.01e, February 12th, 2005
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     5
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     6
   Copyright (C) 1998-2005 Gilles Vollant
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     7
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     8
   This code is a modified version of crypting code in Infozip distribution
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     9
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    10
   The encryption/decryption parts of this source code (as opposed to the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    11
   non-echoing password parts) were originally written in Europe.  The
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    12
   whole source package can be freely distributed, including from the USA.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    13
   (Prior to January 2000, re-export from the US was a violation of US law.)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    14
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    15
   This encryption code is a direct transcription of the algorithm from
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    16
   Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    17
   file (appnote.txt) is distributed with the PKZIP program (even in the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    18
   version without encryption capabilities).
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    19
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    20
   If you don't need crypting in your application, just define symbols
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    21
   NOCRYPT and NOUNCRYPT.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    22
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    23
   This code support the "Traditional PKWARE Encryption".
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    24
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    25
   The new AES encryption added on Zip format by Winzip (see the page
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    26
   http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    27
   Encryption is not supported.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    28
*/
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    29
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    30
#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    31
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    32
/***********************************************************************
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    33
 * Return the next byte in the pseudo-random sequence
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    34
 */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    35
static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    36
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    37
    unsigned temp;  /* POTENTIAL BUG:  temp*(temp^1) may overflow in an
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    38
                     * unpredictable manner on 16-bit systems; not a problem
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    39
                     * with any known compiler so far, though */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    40
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    41
    temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    42
    return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    43
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    44
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    45
/***********************************************************************
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    46
 * Update the encryption keys with the next byte of plain text
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    47
 */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    48
static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    49
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    50
    (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    51
    (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    52
    (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    53
    {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    54
      register int keyshift = (int)((*(pkeys+1)) >> 24);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    55
      (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    56
    }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    57
    return c;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    58
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    59
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    60
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    61
/***********************************************************************
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    62
 * Initialize the encryption keys and the random header according to
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    63
 * the given password.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    64
 */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    65
static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    66
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    67
    *(pkeys+0) = 305419896L;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    68
    *(pkeys+1) = 591751049L;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    69
    *(pkeys+2) = 878082192L;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    70
    while (*passwd != '\0') {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    71
        update_keys(pkeys,pcrc_32_tab,(int)*passwd);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    72
        passwd++;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    73
    }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    74
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    75
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    76
#define zdecode(pkeys,pcrc_32_tab,c) \
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    77
    (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    78
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    79
#define zencode(pkeys,pcrc_32_tab,c,t) \
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    80
    (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    81
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    82
#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    83
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    84
#define RAND_HEAD_LEN  12
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    85
   /* "last resort" source for second part of crypt seed pattern */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    86
#  ifndef ZCR_SEED2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    87
#    define ZCR_SEED2 3141592654UL     /* use PI as default pattern */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    88
#  endif
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    89
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    90
static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    91
    const char *passwd;         /* password string */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    92
    unsigned char *buf;         /* where to write header */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    93
    int bufSize;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    94
    unsigned long* pkeys;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    95
    const unsigned long* pcrc_32_tab;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    96
    unsigned long crcForCrypting;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    97
{
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    98
    int n;                       /* index in random header */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    99
    int t;                       /* temporary */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   100
    int c;                       /* random byte */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   101
    unsigned char header[RAND_HEAD_LEN-2]; /* random header */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   102
    static unsigned calls = 0;   /* ensure different random header each time */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   103
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   104
    if (bufSize<RAND_HEAD_LEN)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   105
      return 0;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   106
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   107
    /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   108
     * output of rand() to get less predictability, since rand() is
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   109
     * often poorly implemented.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   110
     */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   111
    if (++calls == 1)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   112
    {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   113
        srand((unsigned)(time(NULL) ^ ZCR_SEED2));
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   114
    }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   115
    init_keys(passwd, pkeys, pcrc_32_tab);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   116
    for (n = 0; n < RAND_HEAD_LEN-2; n++)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   117
    {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   118
        c = (rand() >> 7) & 0xff;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   119
        header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   120
    }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   121
    /* Encrypt random header (last two bytes is high word of crc) */
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   122
    init_keys(passwd, pkeys, pcrc_32_tab);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   123
    for (n = 0; n < RAND_HEAD_LEN-2; n++)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   124
    {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   125
        buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   126
    }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   127
    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   128
    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   129
    return n;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   130
}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   131
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   132
#endif