releasing/blocks/framework/src/SymbianUtils/Evalid.py
author kelvzhu
Thu, 02 Sep 2010 15:02:14 +0800
changeset 632 934f9131337b
permissions -rw-r--r--
Delivery Blocks to SF
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
632
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
     1
#
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
     2
# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
     3
# All rights reserved.
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
     4
# This component and the accompanying materials are made available
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
     6
# which accompanies this distribution, and is available
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
     8
#
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
     9
# Initial Contributors:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    11
#
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    12
# Contributors:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    13
#
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    14
# Description:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    15
# Generate checksums for different types of files
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    16
#
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    17
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    18
import sys
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    19
import os
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    20
import re
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    21
import struct
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    22
import subprocess
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    23
import platform
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    24
try:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    25
    from hashlib import md5
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    26
except ImportError:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    27
    import md5
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    28
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    29
import SymbianUtils
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    30
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    31
class Evalid(object):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    32
    '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    33
    Provide some of the functionality found in epoc32/tools/EvalidCompare.pm
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    34
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    35
    generateSignature() - use appropriate method to calculate checksum for a file
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    36
    getUid() - extract Uid from file
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    37
    '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    38
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    39
    class ExternalError(SymbianUtils.SymbianUtilsError):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    40
        """ An external utility exited with an error """
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    41
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    42
    ext = ".exe" if platform.system() == "Windows" else ""
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    43
    binPath = os.path.normpath(os.path.join(os.path.dirname(__file__), "bin"))
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    44
    NM = os.path.join(binPath, "nm" + ext)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    45
    ELFDUMP = os.path.join(binPath, "elfdump" + ext)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    46
    ELF2E32 = os.path.join(binPath, "elf2e32" + ext)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    47
    PE_DUMP = os.path.join(binPath, "pe_dump" + ext)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    48
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    49
    ELF_DLL_NAME = re.compile(r"#<DLL>(\S+\.\S+)#<\\DLL>")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    50
    ELF_DEBUG = re.compile(r"^\.(rel\.)?debug_")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    51
    ELF_P_HEAD = re.compile(r"^\tProgram header offset.*$")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    52
    ELF_S_HEAD = re.compile(r"^\tSection header offset.*$")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    53
    PRECOMP_IGNORE = re.compile(r'^# \d+ ".*"( \d)?$')
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    54
    E32_EMPTY = re.compile("Time Stamp:|E32ImageFile|Header CRC:")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    55
    E32_LOWER = re.compile("imports from")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    56
    INTEL_OBJECTPATH_WIN  = re.compile(r"\.\.\\[^(]*\\")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    57
    INTEL_OBJECTPATH_NIX  = re.compile("\.\.\/[^(]*\/")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    58
    INTEL_DLLTOOL = re.compile("^(.+ (_head|_))\w+_(EPOC32_\w+(_LIB|_iname))$", re.I)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    59
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    60
    @classmethod
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    61
    def typeLookup(cls, type):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    62
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    63
        Return the internally used identifier string for the type
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    64
        @todo: Warning
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    65
        @param type: The type
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    66
        @type type: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    67
        @return: Internally used type identifier
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    68
        @rtype: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    69
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    70
        if type in ("e32", "default", "elf", "preprocessed_text", "intel", "intel_pe"):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    71
            return type
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    72
        elif type in ("file", "symbol"):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    73
            return "default"
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    74
        elif type in ("staticlib", "dso"):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    75
            return "elf"
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    76
        elif type in ("exe", "plugin", "dll"):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    77
            return "e32"
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    78
        else:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    79
            #sys.stderr.write("warning - unknown hashtype %s.\n"%type)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    80
            return "default"
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    81
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    82
    @classmethod
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    83
    def generateSignature(cls, path, fileType):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    84
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    85
        Generic dispatcher method for file types. Use the appropriate method for
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    86
        I{type} to generate the signature for file at I{path}.
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    87
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    88
        @param path: The path where the file is located
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    89
        @type path: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    90
        @return: checksum
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    91
        @rtype: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    92
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    93
        if not isinstance(path, basestring):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    94
            raise TypeError, "path must be a string"
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    95
        if not path:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    96
            raise ValueError, "path must not be zero length"
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    97
        path = os.path.normpath(path)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    98
        fileType = cls.typeLookup(fileType)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
    99
        methodName = "sig_" + fileType
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   100
        if hasattr(cls, methodName):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   101
            method = getattr(cls, methodName)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   102
            return method(path)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   103
        else:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   104
            raise NotImplementedError("No signature generator for type %s" % fileType)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   105
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   106
    @staticmethod
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   107
    def getUid(index, file):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   108
        '''Get UID of file
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   109
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   110
        @param index: Which UID
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   111
        @param file: Absolute path
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   112
        @return: UID
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   113
        @rtype: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   114
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   115
        if index not in (1, 2, 3):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   116
            raise ValueError("Index can only be one of 1, 2 or 3")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   117
        if os.path.getsize(file) < 12:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   118
            return None
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   119
        start = (index-1) * 4
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   120
        finish = start + 4
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   121
        f = open(file, "rb")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   122
        head = f.read(12)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   123
        f.close()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   124
        return struct.unpack("<l", head[start:finish])[0]
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   125
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   126
    @staticmethod
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   127
    def getMd5():
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   128
        '''A convenicence method to use appropriate library regardless of Python
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   129
        version. Maintain compatibility while using hashlib whenever possible.
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   130
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   131
        @return: md5 object
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   132
        @rtype: md5
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   133
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   134
        if hasattr(md5, "new"):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   135
            return md5.new()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   136
        else:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   137
            return md5()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   138
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   139
    # Signatures for various formats
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   140
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   141
    @classmethod
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   142
    def sig_e32(cls, path):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   143
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   144
        Return the checksum of significant parts using elf2e32
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   145
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   146
        @param path: The absolute path
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   147
        @type path: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   148
        @return: checksum
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   149
        @rtype: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   150
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   151
        bin = cls.ELF2E32 + " --dump --e32input="
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   152
        m = cls.getMd5()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   153
        fo = os.popen(bin+path, "r", -1)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   154
        for line in fo:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   155
            if cls.E32_EMPTY.search(line):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   156
                line = ""
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   157
            if cls.E32_LOWER.search(line):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   158
                line = line.lower()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   159
            m.update(line)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   160
        if fo.close():
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   161
            raise cls.ExternalError("elf2e32 failed at %s" % path)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   162
        return m.hexdigest()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   163
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   164
    @classmethod
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   165
    def sig_default(cls, path):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   166
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   167
        Calculate the checksum of the file without filtering.
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   168
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   169
        @param path: The absolute path
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   170
        @type path: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   171
        @return: checksum
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   172
        @rtype: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   173
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   174
        m = cls.getMd5()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   175
        f = open(path, "rb")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   176
        while True:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   177
            buf = f.read(32*1024)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   178
            if not buf:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   179
                break
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   180
            m.update(buf)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   181
        f.close()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   182
        return m.hexdigest()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   183
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   184
    @classmethod
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   185
    def sig_elf(cls, path):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   186
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   187
        Return the checksum of significant parts using elfdump
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   188
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   189
        @param path: The absolute path
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   190
        @type path: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   191
        @return: checksum
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   192
        @rtype: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   193
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   194
        bin = cls.ELFDUMP + " -i "
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   195
        def firstGroupToLc(match):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   196
            return ("#<DLL>" + match.group(1).lower() + "#<\\DLL>")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   197
        m = cls.getMd5()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   198
        fo = os.popen(bin+path, "r", -1)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   199
        for line in fo:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   200
            if cls.ELF_P_HEAD.match(line):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   201
                line = "Program header offset\n"
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   202
            if cls.ELF_S_HEAD.match(line):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   203
                line = "Section header offset\n"
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   204
            line = cls.ELF_DLL_NAME.sub(firstGroupToLc, line)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   205
            if cls.ELF_DEBUG.match(line):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   206
                line = ""
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   207
            #sys.stderr.write(line)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   208
            m.update(line)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   209
        if fo.close():
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   210
            raise cls.ExternalError("elfdump failed at %s" % path)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   211
        return m.hexdigest()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   212
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   213
    @classmethod
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   214
    def sig_preprocessed_text(cls, path):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   215
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   216
        Return the checksum of significant parts of preprocessed text
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   217
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   218
        @param path: The absolute path
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   219
        @type path: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   220
        @return: checksum
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   221
        @rtype: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   222
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   223
        m = cls.getMd5()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   224
        f = open(path, "rb")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   225
        for line in f:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   226
            line = line.replace("\r\n", "\n")
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   227
            if cls.PRECOMP_IGNORE.search(line):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   228
                line = "\n"
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   229
            m.update(line)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   230
        f.close()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   231
        return m.hexdigest()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   232
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   233
    @classmethod
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   234
    def sig_intel_pe(cls, path):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   235
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   236
        Return the checksum of significant parts of pe_dump output
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   237
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   238
        @param path: The absolute path
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   239
        @type path: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   240
        @return: checksum
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   241
        @rtype: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   242
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   243
        m = cls.getMd5()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   244
        fo = os.popen("%s %s" % (cls.PE_DUMP, path), "r", -1)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   245
        for line in fo:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   246
            m.update(line)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   247
        if fo.close():
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   248
            raise cls.ExternalError("pe_dump failed at %s" % path)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   249
        return m.hexdigest()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   250
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   251
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   252
    @classmethod
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   253
    def sig_intel(cls, path):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   254
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   255
        Return the checksum of significant parts using nm
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   256
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   257
        @param path: The absolute path
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   258
        @type path: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   259
        @return: checksum
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   260
        @rtype: String
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   261
        '''
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   262
        m = cls.getMd5()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   263
        try:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   264
            s = subprocess.Popen([cls.NM, "--no-sort", path], env=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   265
            out, err = s.communicate()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   266
        except OSError, e:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   267
            raise cls.ExternalError, "nm failed at %s: %s" % (path, str(e))
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   268
        if s.returncode != 0:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   269
            raise cls.ExternalError, "nm failed at %s: %s" % (path, err)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   270
        for line in out.splitlines():
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   271
            # no need for regexps here
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   272
            if line.endswith(":\n") \
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   273
                or line.startswith("BFD: ") \
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   274
                or cls.INTEL_OBJECTPATH_WIN.search(line) \
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   275
                or cls.INTEL_OBJECTPATH_NIX.search(line):
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   276
                line = "\n"
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   277
            match = cls.INTEL_DLLTOOL.search(line)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   278
            if match:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   279
                line = "%s_..._%s" % (match.groups()[0], match.groups()[2])
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   280
                line = line.upper()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   281
            m.update(line)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   282
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   283
        if s.returncode != 0:
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   284
            raise cls.ExternalError("nm failed at %s" % path)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   285
        return m.hexdigest()
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   286
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   287
def main():
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   288
    path = sys.argv[1]
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   289
    ftype = sys.argv[2]
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   290
    print Evalid.generateSignature(path, ftype)
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   291
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   292
if __name__ == "__main__":
934f9131337b Delivery Blocks to SF
kelvzhu
parents:
diff changeset
   293
    main()