diff -r 59bb7c4d6172 -r 0f5e3a7fb6af buildframework/helium/tools/iad/iadinfo.py --- a/buildframework/helium/tools/iad/iadinfo.py Fri Feb 05 11:59:41 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1095 +0,0 @@ -#============================================================================ -#Name : iadinfo.py -#Part of : Helium - -#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -#All rights reserved. -#This component and the accompanying materials are made available -#under the terms of the License "Eclipse Public License v1.0" -#which accompanies this distribution, and is available -#at the URL "http://www.eclipse.org/legal/epl-v10.html". -# -#Initial Contributors: -#Nokia Corporation - initial contribution. -# -#Contributors: -# -#Description: -#=============================================================================== - -import optparse -import sys, os -import struct -import zlib -import pdb - -PyASN1Availabe = True - -try : - from pyasn1.codec.der import decoder - from pyasn1.type import univ, base -except : - PyASN1Availabe = False - -def _findItem(item, itemParent, index, objectIdentifier) : - if isinstance(item, base.AbstractSimpleAsn1Item) : - if item == objectIdentifier : - return itemParent[index + 1] - else: - for i in range(len(item)) : - found = _findItem(item[i], item, i, objectIdentifier) - if found: - return found - -def findItem(decodedCert, objectIdentifier) : - return _findItem(decodedCert, None, 0, objectIdentifier) - - -class CertificateOrganization : - def __init__(self) : - pass - - def parse(self, decodedCert) : - self.commonName = findItem(decodedCert, (2, 5, 4, 3)) - self.countryCode = findItem(decodedCert, (2, 5, 4, 6)) - self.locality = findItem(decodedCert, (2, 5, 4, 7)) - self.state = findItem(decodedCert, (2, 5, 4, 8)) - self.street = findItem(decodedCert, (2, 5, 4, 9)) - self.organization = findItem(decodedCert, (2, 5, 4, 10)) - - def readableStr(self) : - buf = "" - if self.commonName : - buf += self.commonName.prettyPrint() + "\n" - if self.countryCode : - buf += self.countryCode.prettyPrint() + "\n" - if self.locality : - buf += self.locality.prettyPrint() + "\n" - if self.state : - buf += self.state.prettyPrint() + "\n" - if self.street : - buf += self.street.prettyPrint() + "\n" - if self.organization : - buf += self.organization.prettyPrint() - return buf - -class CertificateInfo : - def __init__(self) : - pass - - def parse(self, decodedCert) : - self.issuer = CertificateOrganization() - self.issuer.parse(decodedCert[0][3]) - - self.signer = CertificateOrganization() - self.signer.parse(decodedCert[0][5]) - - def readableStr(self) : - buf = "Signer:\n " + "\n ".join(self.signer.readableStr().split('\n')) + "\n" - buf += "Issuer:\n " + "\n ".join(self.issuer.readableStr().split('\n')) + "\n" - return buf - - -class SISFileHeader : - def __init__(self) : - self.uid1 = 0 - self.uid2 = 0 - self.uid3 = 0 - self.uidChecksum = 0 - -class SISField : - def __init__(self) : - self.type = 0 - self.length = None - self.subFields = [] - - def readFieldLength(self, fileReader) : - length = fileReader.readBytesAsUint(4) - if length & 0x80000000 > 0 : - length = length << 32 - length |= fileReader.readBytesAsUint(4) - return length - - def findField(self, fieldType, startIndex=0) : - result = None - index = startIndex - - for field in self.subFields[startIndex:] : - if field.type == fieldType : - result = field - break - ++ index - return (result, index) - - def readableStr(self) : - return "" - - def traverse(self, handler, depth=0) : - handler.handleField(self, depth) - for field in self.subFields : - field.traverse(handler, depth + 1) - -class SISUnsupportedField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fileReader.readPlainBytes(self.length) - -class SISStringField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.data = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - buf = fileReader.readPlainBytes(self.length) - self.data = u"" - while len(buf) > 0 : - temp = buf[:2] - buf = buf[2:] - self.data += unichr(ord(temp[0]) | ord(temp[1]) << 8) - - def readableStr(self) : - return self.data - -class SISArrayField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - type = fileReader.readBytesAsInt(4) - l = self.length - 4 - while l > 0 : - field = SISFieldTypes[type]() - field.type = type - field.initFromFile(fileReader) - self.subFields.append(field) - - l -= field.length + 4 # field length + the length field - padding = fileReader.skipPadding() - l -= padding - -class SISCompressedField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.algorithm = None - self.uncompressedDataSize = None - self.data = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - self.algorithm = fileReader.readBytesAsUint(4) - self.uncompressedDataSize = fileReader.readBytesAsUint(8) - data = fileReader.readPlainBytes(self.length - 4 - 8) - if self.algorithm == 0 : - self.data = data - elif self.algorithm == 1 : - self.data = zlib.decompress(data) - -class SISVersionField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.version = (- 1, - 1, - 1) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - major = fileReader.readBytesAsInt(4) - minor = fileReader.readBytesAsInt(4) - build = fileReader.readBytesAsInt(4) - self.version = (major, minor, build) - - def readableStr(self) : - return str(self.version) - -class SISVersionRangeField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.fromVersion = None - self.toVersion = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.fromVersion = fieldParser.parseField(fileReader) - if self.length - fieldParser.lastReadBytes > 0 : - self.toVersion = fieldParser.parseField(fileReader) - -class SISDateField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.year = None - self.month = None - self.day = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - self.year = fileReader.readBytesAsUint(2) - self.month = fileReader.readBytesAsUint(1) - self.day = fileReader.readBytesAsUint(1) - - def readableStr(self) : - return str(self.year) + "." + str(self.month) + "." + str(self.day) - -class SISTimeField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.hours = None - self.minutes = None - self.seconds = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - self.hours = fileReader.readBytesAsUint(1) - self.minutes = fileReader.readBytesAsUint(1) - self.seconds = fileReader.readBytesAsUint(1) - - def readableStr(self) : - return str(self.hours) + ":" + str(self.minutes) + ":" + str(self.seconds) - -class SISDateTimeField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.date = None - self.time = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.date = fieldParser.parseField(fileReader) - self.time = fieldParser.parseField(fileReader) - -class SISUidField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.uid = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - self.uid = fileReader.readBytesAsUint(4) - - def readableStr(self) : - return hex(self.uid) - -class SISLanguageField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.language = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - self.language = fileReader.readBytesAsUint(4) - - def readableStr(self) : - return str(self.language) - -class SISContentsField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - field = fieldParser.parseField(fileReader) - while field : - if field.type == 3 : # compressed - bufferReader = SISBufferReader(field.data) - field = fieldParser.parseField(bufferReader) - self.subFields.append(field) - field = fieldParser.parseField(fileReader) - -class SISControllerField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - bufferReader = SISBufferReader(fileReader.readPlainBytes(self.length)) - field = fieldParser.parseField(bufferReader) - while field : - self.subFields.append(field) - field = fieldParser.parseField(bufferReader) - -class SISInfoField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.installType = None - self.installFlags = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # UID - self.subFields.append(fieldParser.parseField(fileReader)) # Vendor name unique - self.subFields.append(fieldParser.parseField(fileReader)) # names - self.subFields.append(fieldParser.parseField(fileReader)) # vendor names - self.subFields.append(fieldParser.parseField(fileReader)) # version - self.subFields.append(fieldParser.parseField(fileReader)) # creation time - self.installType = fileReader.readBytesAsUint(1) - self.installFlags = fileReader.readBytesAsUint(1) - -class SISSupportedLanguagesField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # languages - -class SISSupportedOptionsField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # options - -class SISPrerequisitiesField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # target devices - self.subFields.append(fieldParser.parseField(fileReader)) # dependencies - - -class SISDependencyField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # UID - field = fieldParser.parseField(fileReader) - # Version range field is optional - if field.type == VersionRangeField : - self.subFields.append(field) # version range - self.subFields.append(fieldParser.parseField(fileReader)) # dependency names - else : - self.subFields.append(field) # dependency names - -class SISPropertiesField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # properties - -class SISPropertyField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.key = None - self.value = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - self.key = fileReader.readBytesAsInt(4) - self.value = fileReader.readBytesAsInt(4) - -# There is a type for this field, but there is no definition of the field contents -class SISSignaturesField(SISUnsupportedField) : - pass - -class SISCertificateChainField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # certificate data - -class SISLogoField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # logo file - -class SISFileDescriptionField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.operation = None - self.operationOptions = None - self.compressedLength = None - self.uncompressedLength = None - self.fileIndex = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - - self.subFields.append(fieldParser.parseField(fileReader)) - self.subFields.append(fieldParser.parseField(fileReader)) - field = fieldParser.parseField(fileReader) - self.subFields.append(field) - if field.type == 41 : # read field was capabilities ==> there is one more field left - self.subFields.append(fieldParser.parseField(fileReader)) - - self.operation = fileReader.readBytesAsUint(4) - self.operationOptions = fileReader.readBytesAsUint(4) - self.compressedLength = fileReader.readBytesAsUint(8) - self.uncompressedLength = fileReader.readBytesAsUint(8) - self.fileIndex = fileReader.readBytesAsUint(4) - - def readableStr(self) : - return "index: " + str(self.fileIndex) - -class SISHashField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.algorithm = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.algorithm = fileReader.readBytesAsUint(4) - self.subFields.append(fieldParser.parseField(fileReader)) # logo file - -class SISIfField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # expression - self.subFields.append(fieldParser.parseField(fileReader)) # install block - self.subFields.append(fieldParser.parseField(fileReader)) # else ifs - -class SISElseIfField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # expression - self.subFields.append(fieldParser.parseField(fileReader)) # install block - -class SISInstallBlockField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.files = None - self.embeddedSISFiles = None - self.ifBlocks = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) - self.subFields.append(fieldParser.parseField(fileReader)) - self.subFields.append(fieldParser.parseField(fileReader)) - -class SISExpressionField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.operator = None - self.integerValue = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.operator = fileReader.readBytesAsUint(4) - self.integerValue = fileReader.readBytesAsInt(4) - - if self.operator == 10 or self.operator == 13 : - self.subFields.append(fieldParser.parseField(fileReader)) - if self.operator == 1 or self.operator == 2 or self.operator == 3 or self.operator == 4 or self.operator == 5 or self.operator == 6 or self.operator == 7 or self.operator == 8 or self.operator == 11 or self.operator == 12 : - self.subFields.append(fieldParser.parseField(fileReader)) - if not (self.operator == 13 or self.operator == 14 or self.operator == 15 or self.operator == 16 or self.operator == 10) : - self.subFields.append(fieldParser.parseField(fileReader)) - -class SISDataField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # data units - -class SISDataUnitField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # file data - -class SISFileDataField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # raw file data - -class SISSupportedOptionField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # names - -class SISControllerChecksumField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.checksum = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - self.checksum = fileReader.readBytesAsUint(2) - -class SISDataChecksumField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.checksum = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - self.checksum = fileReader.readBytesAsUint(2) - -class SISSignatureField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # signature algorithm - self.subFields.append(fieldParser.parseField(fileReader)) # signature data - -class SISBlobField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.data = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - self.data = fileReader.readPlainBytes(self.length) - -class SISSignatureAlgorithmField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # algorithm identifier - -class SISSignatureCertificateChainField(SISField) : - def __init__(self) : - SISField.__init__(self) - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - fieldParser = SISFieldParser() - self.subFields.append(fieldParser.parseField(fileReader)) # signatures - self.subFields.append(fieldParser.parseField(fileReader)) # certificate chain - -class SISDataIndexField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.dataIndex = None - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - self.dataIndex = fileReader.readBytesAsUint(4) - -class SISCapabilitiesField(SISField) : - def __init__(self) : - SISField.__init__(self) - self.capabilities = 0 - self.readableCaps = [] - - def initFromFile(self, fileReader) : - self.length = self.readFieldLength(fileReader) - self.capabilities = fileReader.readBytesAsUint(self.length) - - for i in range(20) : - if (self.capabilities >> i) & 0x01 : - self.readableCaps.append(CapabilityNames[i]) - - def readableStr(self) : - return " ".join(self.readableCaps) - -SISFieldTypes = { - 1 : SISStringField, - 2 : SISArrayField, - 3 : SISCompressedField, - 4 : SISVersionField, - 5 : SISVersionRangeField, - 6 : SISDateField, - 7 : SISTimeField, - 8 : SISDateTimeField, - 9 : SISUidField, - 10 : SISUnsupportedField, - 11 : SISLanguageField, - 12 : SISContentsField, - 13 : SISControllerField, - 14 : SISInfoField, - 15 : SISSupportedLanguagesField, - 16 : SISSupportedOptionsField, - 17 : SISPrerequisitiesField, - 18 : SISDependencyField, - 19 : SISPropertiesField, - 20 : SISPropertyField, - 21 : SISSignaturesField, - 22 : SISCertificateChainField, - 23 : SISLogoField, - 24 : SISFileDescriptionField, - 25 : SISHashField, - 26 : SISIfField, - 27 : SISElseIfField, - 28 : SISInstallBlockField, - 29 : SISExpressionField, - 30 : SISDataField, - 31 : SISDataUnitField, - 32 : SISFileDataField, - 33 : SISSupportedOptionField, - 34 : SISControllerChecksumField, - 35 : SISDataChecksumField, - 36 : SISSignatureField, - 37 : SISBlobField, - 38 : SISSignatureAlgorithmField, - 39 : SISSignatureCertificateChainField, - 40 : SISDataIndexField, - 41 : SISCapabilitiesField - } - -[StringField, - ArrayField, - CompressedField, - VersionField, - VersionRangeField, - DateField, - TimeField, - DateTimeField, - UidField, - UnusedField, - LanguageField, - ContentsField, - ControllerField, - InfoField, - SupportedLanguagesField, - SupportedOptionsField, - PrerequisitiesField, - DependencyField, - PropertiesField, - PropertyField, - SignaturesField, - CertificateChainField, - LogoField, - FileDescriptionField, - HashField, - IfField, - ElseIfField, - InstallBlockField, - ExpressionField, - DataField, - DataUnitField, - FileDataField, - SupportedOptionField, - ControllerChecksumField, - DataChecksumField, - SignatureField, - BlobField, - SignatureAlgorithmField, - SignatureCertificateChainField, - DataIndexField, - CapabilitiesField] = range(1, 42) - -FieldNames = { - 0 : "ROOT", - StringField : "StringField", - ArrayField : "ArrayField", - CompressedField : "CompressedField", - VersionField : "VersionField", - VersionRangeField : "VersionRangeField", - DateField : "DateField", - TimeField : "TimeField", - DateTimeField : "DateTimeField", - UidField : "UidField", - UnusedField : "UnusedField", - LanguageField : "LanguageField", - ContentsField : "ContentsField", - ControllerField : "ControllerField", - InfoField : "InfoField", - SupportedLanguagesField : "SupportedLanguagesField", - SupportedOptionsField : "SupportedOptionsField", - PrerequisitiesField : "PrerequisitiesField", - DependencyField : "DependencyField", - PropertiesField : "PropertiesField", - PropertyField : "PropertyField", - SignaturesField : "SignaturesField", - CertificateChainField : "CertificateChainField", - LogoField : "LogoField", - FileDescriptionField : "FileDescriptionField", - HashField : "HashField", - IfField : "IfField", - ElseIfField : "ElseIfField", - InstallBlockField : "InstallBlockField", - ExpressionField : "ExpressionField", - DataField : "DataField", - DataUnitField : "DataUnitField", - FileDataField : "FileDataField", - SupportedOptionField : "SupportedOptionField", - ControllerChecksumField : "ControllerChecksumField", - DataChecksumField : "DataChecksumField", - SignatureField : "SignatureField", - BlobField : "BlobField", - SignatureAlgorithmField : "SignatureAlgorithmField", - SignatureCertificateChainField : "SignatureCertificateChainField", - DataIndexField : "DataIndexField", - CapabilitiesField : "CapabilitiesField" -} - -CapabilityNames = { - 0 : "TCB", - 1 : "CommDD", - 2 : "PowerMgmt", - 3 : "MultimediaDD", - 4 : "ReadDeviceData", - 5 : "WriteDeviceData", - 6 : "DRM", - 7 : "TrustedUI", - 8 : "ProtServ", - 9 : "DiskAdmin", - 10 : "NetworkControl", - 11 : "AllFiles", - 12 : "SwEvent", - 13 : "NetworkServices", - 14 : "LocalServices", - 15 : "ReadUserData", - 16 : "WriteUserData", - 17 : "Location", - 18 : "SurroundingsDD", - 19 : "UserEnvironment" - } - -InstallTypes = { - 0: "SA", - 1: "SP", - 2: "PU", - 3: "PA", - 4: "PP" - } - -class SISReader : - def __init__(self) : - self.bytesRead = 0 - - def readUnsignedBytes(self, numBytes) : - buf = self.readPlainBytes(numBytes) - if len(buf) < numBytes : - return [] - - format = "" - for i in range(numBytes) : - format += "B" - return struct.unpack(format, buf) - - def readSignedBytes(self, numBytes) : - buf = self.readPlainBytes(numBytes) - if len(buf) < numBytes : - return [] - - format = "" - for i in range(numBytes) : - format += "b" - return struct.unpack(format, buf) - - def readBytesAsUint(self, numBytes) : - result = 0 - bytes = self.readUnsignedBytes(numBytes) - if len(bytes) == numBytes : - for i in range(numBytes) : - result |= bytes[i] << (i * 8) - - return result - - def readBytesAsInt(self, numBytes) : - result = 0 - bytes = self.readSignedBytes(numBytes) - if len(bytes) == numBytes : - for i in range(numBytes) : - result |= bytes[i] << (i * 8) - - return result - - def skipPadding(self) : - result = 0 - if self.bytesRead % 4 != 0 : - paddingLength = 4 - self.bytesRead % 4 - self.readPlainBytes(paddingLength) - result = paddingLength - - return result - - def readPlainBytes(self, numBytes) : - pass - -class SISFileReader(SISReader) : - def __init__(self, inStream) : - SISReader.__init__(self) - self.inStream = inStream - self.eof = False - self.bytesRead = 0 - - def readPlainBytes(self, numBytes) : - if self.eof : - return "" - - if numBytes == 0 : - return "" - - buf = "" - buf = self.inStream.read(numBytes) - if len(buf) < numBytes : - self.eof = True - return "" - - self.bytesRead += numBytes - - return buf - - def isEof(self) : - return self.eof - -class SISBufferReader(SISReader) : - def __init__(self, buffer) : - self.buffer = buffer - self.bytesRead = 0 - - def readPlainBytes(self, numBytes) : - if self.isEof() : - return "" - - if numBytes == 0 : - return "" - - result = self.buffer[self.bytesRead:self.bytesRead + numBytes] - - self.bytesRead += numBytes - - return result - - def isEof(self) : - return self.bytesRead >= len(self.buffer) - -class SISFieldParser : - def __init__(self) : - self.lastReadBytes = 0 - - def parseField(self, fileReader) : - """Reads the next field from the fileReader stream and returns it""" - field = None - self.lastReadBytes = 0 - type = fileReader.readBytesAsUint(4) - self.lastReadBytes += 4 - if type != 0 : - field = SISFieldTypes[type]() - field.type = type - field.initFromFile(fileReader) - self.lastReadBytes += field.length + 4 # Field length + length field - self.lastReadBytes += fileReader.skipPadding() - return field - -class SISInfo(SISField) : - def __init__(self) : - SISField.__init__(self) - self.fin = None - self.fileHeader = SISFileHeader() - - def parse(self, filename) : - fin = open(filename, 'rb') - fileReader = SISFileReader(fin) - self.parseHeader(fileReader) - self.parseSISFields(fileReader) - - def parseHeader(self, fileReader) : - self.fileHeader.uid1 = fileReader.readBytesAsUint(4) - self.fileHeader.uid2 = fileReader.readBytesAsUint(4) - self.fileHeader.uid3 = fileReader.readBytesAsUint(4) - self.fileHeader.uidChecksum = fileReader.readBytesAsUint(4) - - def parseSISFields(self, fileReader) : - parser = SISFieldParser() - while not fileReader.isEof() : - self.subFields.append(parser.parseField(fileReader)) - -class Handler : - def __init__(self) : - self.files = [] - self.fileDatas = [] - self.signatureCertificateChains = [] - - def handleField(self, field, depth) : - if field.type == FileDescriptionField : - self.files.append(field) - elif field.type == FileDataField : - self.fileDatas.append(field) - elif field.type == SignatureCertificateChainField : - self.signatureCertificateChains.append(field) - - def execute(self, options) : - for f in self.files : - if options.info : - buf = " " + f.findField(StringField)[0].readableStr() - caps = f.findField(CapabilitiesField)[0] - if caps : - buf += " [" + " ".join(f.findField(CapabilitiesField)[0].readableCaps) + "]" - print buf - if options.extract : - parts = f.findField(StringField)[0].readableStr().split("\\") - if len(parts[len(parts) - 1]) > 0 : - path = os.path.abspath(options.extract) - path += os.sep + os.sep.join(parts[1: - 1]) - if not os.path.exists(path) : - os.makedirs(path) - newFile = file(path + os.sep + parts[len(parts) - 1], "wb") - newFile.write(self.fileDatas[f.fileIndex].findField(CompressedField)[0].data) - newFile.close() - for s in self.signatureCertificateChains : - if options.certificate: - buf = s.findField(CertificateChainField)[0].subFields[0].data - print "Certificate chain:" - i = 1 - while len(buf) > 0 : - print " Certificate " + str(i) + ":" - i += 1 - decoded = decoder.decode(buf) - cer = CertificateInfo() - cer.parse(decoded[0]) - readableStr = cer.readableStr() - print " " + "\n ".join(readableStr.split('\n')) - buf = decoded[1] - -class ContentPrinter : - def __init__(self) : - pass - - def handleField(self, field, depth) : - buf = "" - for i in range(depth) : - buf += " " - buf += FieldNames[field.type] + " " - if len(field.readableStr()) > 0 : - buf += field.readableStr() - print buf - -class IADHandler : - def __init__(self) : - self.packageVersion = (0, 0, 0) - self.packageUid = 0 - self.vendorName = "" - self.packageNames = [] - self.packageNamesFields = [] - self.languages = [] - self.platformDependencies = [] - self.packageDependencies = [] - self.installType = 0 - self.installFlags = 0 - - def handleDependency(self, field) : - dep = [0, - 1, - 1, - 1, - 1, - 1, - 1] - dep[0] = field.subFields[0].uid - if field.subFields[1] and field.subFields[1].type == VersionRangeField : - r = field.subFields[1] - if r.fromVersion != None : - dep[1] = r.fromVersion.version[0] - dep[2] = r.fromVersion.version[1] - dep[3] = r.fromVersion.version[2] - if r.toVersion != None : - dep[4] = r.toVersion.version[0] - dep[5] = r.toVersion.version[1] - dep[6] = r.toVersion.version[2] - return dep - - def handleField(self, field, depth) : - if field.type == InfoField : - self.packageVersion = field.subFields[4].version - self.packageVersionField = field.subFields[4] - self.packageUid = field.subFields[0].uid - self.packageUidField = field.subFields[0] - self.vendorName = field.subFields[1].data - self.vendorNameField = field.subFields[1] - self.installType = field.installType - self.installFlags = field.installFlags - for name in field.subFields[2].subFields : - self.packageNames.append(name.data) - elif field.type == LanguageField : - self.languages.append(field.language) - elif field.type == PrerequisitiesField : - for f in field.subFields[0].subFields : - dependency = self.handleDependency(f) - self.platformDependencies.append(dependency) - for f in field.subFields[1].subFields : - dependency = self.handleDependency(f) - self.packageDependencies.append(dependency) - - def getInfo (self, fileName) : - sisInfo = SISInfo() - sisInfo.parse(fileName) - handler = IADHandler() - sisInfo.traverse(handler) - info = "\n" \ - + " " + hex(handler.packageUid) + "\n" \ - + " " + handler.vendorName + "\n" \ - + " " \ - + "" + repr(handler.packageVersion[0]) + "" \ - + "" + repr(handler.packageVersion[1]) + "" \ - + "" + repr(handler.packageVersion[2]) + "" \ - + "\n" \ - + " " + InstallTypes[self.installType] + "\n" - for num, name in enumerate(handler.packageNames) : - info += " " + name + "\n" - for language in handler.languages : - info += " " + repr(language) + "\n" - for platDep in handler.platformDependencies : - info += " " + hex(platDep[0]) + "\n" - info += " " \ - + "" + repr(platDep[1]) + "" \ - + "" + repr(platDep[2]) + "" -# info += "" + repr(platDep[3]) + "" - info += "\n " \ - + "" + repr(platDep[4]) + "" \ - + "" + repr(platDep[5]) + "" -# info += "" + repr(platDep[6]) + "" - info += "\n" \ - + " \n" - for packageDep in handler.packageDependencies : - info += " " + hex(packageDep[0]) + "\n" - info += " " \ - + "" + repr(packageDep[1]) + "" \ - + "" + repr(packageDep[2]) + "" -# info += "" + repr(packageDep[3]) + "" - info += "\n " \ - + "" + repr(packageDep[4]) + "" \ - + "" + repr(packageDep[5]) + "" -# info += "" + repr(packageDep[6]) + "" - info += "\n" \ - + " \n" - info += "\n" - return info - -if __name__ == "__main__" : - handler = IADHandler() - print (handler.getInfo (sys.argv[1]))