Subversion Repositories freemyipod

Rev

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

Rev 395 Rev 396
Line 24... Line 24...
24
import sys
24
import sys
25
import struct
25
import struct
26
import usb.core
26
import usb.core
27
import libembiosdata
27
import libembiosdata
28
 
28
 
-
 
29
from misc import Bunch, Error
29
from functools import wraps
30
from functools import wraps
30
 
31
 
31
class Error(Exception):
-
 
32
    def __init__(self, value=None):
-
 
33
        self.value = value
-
 
34
    def __str__(self):
-
 
35
        if self.value != None:
-
 
36
            return repr(self.value)
-
 
37
 
-
 
38
class ArgumentError(Error):
32
class ArgumentError(Error):
39
    pass
33
    pass
40
 
34
 
41
class DeviceNotFoundError(Error):
35
class DeviceNotFoundError(Error):
42
    pass
36
    pass
Line 47... Line 41...
47
class SendError(Error):
41
class SendError(Error):
48
    pass
42
    pass
49
 
43
 
50
class ReceiveError(Error):
44
class ReceiveError(Error):
51
    pass
45
    pass
52
 
-
 
53
 
-
 
54
class Bunch(dict):
-
 
55
    """
-
 
56
        This is a dict whose items can also be accessed with
-
 
57
        bunchinstance.something.
-
 
58
    """
-
 
59
    def __init__(self, **kw):
-
 
60
        dict.__init__(self, kw)
-
 
61
        self.__dict__ = self
-
 
62
    
46
    
63
    def __getstate__(self):
-
 
64
        return self
-
 
65
    
-
 
66
    def __setstate__(self, state):
-
 
67
        self.update(state)
-
 
68
        self.__dict__ = self
-
 
69
 
-
 
70
 
47
 
71
def command(timeout = None):
48
def command(timeout = None):
72
    """
49
    """
73
        Decorator for all commands.
50
        Decorator for all commands.
74
        It adds the "timeout" variable to all commands.
51
        It adds the "timeout" variable to all commands.
Line 94... Line 71...
94
            ret = func(*args)
71
            ret = func(*args)
95
            # postcommand stuff
72
            # postcommand stuff
96
            if timeout is not None:
73
            if timeout is not None:
97
                self.lib.dev.timeout = oldtimeout
74
                self.lib.dev.timeout = oldtimeout
98
            return ret
75
            return ret
-
 
76
        func._command = True
-
 
77
        wrapper.func = func
99
        return wrapper
78
        return wrapper
100
    return decorator
79
    return decorator
101
 
80
 
102
 
81
 
103
class Embios(object):
82
class Embios(object):
Line 960... Line 939...
960
            raise ReceiveError("Packet too big")
939
            raise ReceiveError("Packet too big")
961
        return self.receive(self.endpoint.din, size)
940
        return self.receive(self.endpoint.din, size)
962
 
941
 
963
 
942
 
964
if __name__ == "__main__":
943
if __name__ == "__main__":
965
    # Some tests
-
 
966
    import sys
-
 
967
    embios = Embios()
-
 
968
    resp = embios.getversioninfo()
-
 
969
    sys.stdout.write("Embios device version information: " + libembiosdata.swtypes[resp.swtypeid] + " v" + str(resp.majorv) + "." + str(resp.minorv) + 
-
 
970
                     "." + str(resp.patchv) + " r" + str(resp.revision) + " running on " + libembiosdata.hwtypes[resp.hwtypeid] + "\n")
-
 
971
    resp = embios.getusermemrange()
-
 
972
    sys.stdout.write("Usermemrange: "+hex(resp.lower)+" - "+hex(resp.upper)+"\n")
-
 
973
    memaddr = resp.lower
-
 
974
    maxlen = resp.upper - resp.lower
-
 
975
    f = open("./embios.py", "rb")
-
 
976
    sys.stdout.write("Loading test file (embios.py) to send over USB...\n")
-
 
977
    datastr = f.read()[:maxlen]
-
 
978
    sys.stdout.write("Sending data...\n")
-
 
979
    embios.write(memaddr, datastr)
-
 
980
    sys.stdout.write("Encrypting data with the hardware key...\n")
-
 
981
    embios.aesencrypt(memaddr, len(datastr), 0)
-
 
982
    sys.stdout.write("Reading data back and saving it to 'libembios-test-encrypted.bin'...\n")
-
 
983
    f = open("./libembios-test-encrypted.bin", "wb")
-
 
984
    f.write(embios.read(memaddr, len(datastr)))
-
 
985
    sys.stdout.write("Decrypting the data again...\n")
-
 
986
    embios.aesdecrypt(memaddr, len(datastr), 0)
-
 
987
    sys.stdout.write("Reading data back from device...\n")
-
 
988
    readdata = embios.read(memaddr, len(datastr))
-
 
989
    if readdata == datastr:
-
 
990
        sys.stdout.write("Data matches!")
-
 
991
    else:
-
 
992
        sys.stdout.write("Data does NOT match. Something went wrong")
-
 
993
944
    from misc import Logger
-
 
945
    logger = Logger()
-
 
946
    if sys.argv[1] == "test":
-
 
947
        # Some tests
-
 
948
        import sys
-
 
949
        embios = Embios()
-
 
950
        resp = embios.getversioninfo()
-
 
951
        logger.log("Embios device version information: " + libembiosdata.swtypes[resp.swtypeid] + " v" + str(resp.majorv) + "." + str(resp.minorv) + 
-
 
952
                         "." + str(resp.patchv) + " r" + str(resp.revision) + " running on " + libembiosdata.hwtypes[resp.hwtypeid] + "\n")
-
 
953
        resp = embios.getusermemrange()
-
 
954
        logger.log("Usermemrange: "+hex(resp.lower)+" - "+hex(resp.upper)+"\n")
-
 
955
        memaddr = resp.lower
-
 
956
        maxlen = resp.upper - resp.lower
-
 
957
        f = open("./embios.py", "rb")
-
 
958
        logger.log("Loading test file (embios.py) to send over USB...\n")
-
 
959
        datastr = f.read()[:maxlen]
-
 
960
        logger.log("Sending data...\n")
-
 
961
        embios.write(memaddr, datastr)
-
 
962
        logger.log("Encrypting data with the hardware key...\n")
-
 
963
        embios.aesencrypt(memaddr, len(datastr), 0)
-
 
964
        logger.log("Reading data back and saving it to 'libembios-test-encrypted.bin'...\n")
-
 
965
        f = open("./libembios-test-encrypted.bin", "wb")
-
 
966
        f.write(embios.read(memaddr, len(datastr)))
-
 
967
        logger.log("Decrypting the data again...\n")
-
 
968
        embios.aesdecrypt(memaddr, len(datastr), 0)
-
 
969
        logger.log("Reading data back from device...\n")
-
 
970
        readdata = embios.read(memaddr, len(datastr))
-
 
971
        if readdata == datastr:
-
 
972
            logger.log("Data matches!")
-
 
973
        else:
-
 
974
            logger.log("Data does NOT match. Something went wrong")
-
 
975
    
-
 
976
    elif sys.argv[1] == "gendoc":
-
 
977
        # Generates Documentation
-
 
978
        from misc import gendoc
-
 
979
        logger.log("Generating documentation\n")
-
 
980
        cmddict = {}
-
 
981
        for attr, value in Embios.__dict__.iteritems():
-
 
982
            if getattr(value, 'func', False):
-
 
983
                if getattr(value.func, '_command', False):
-
 
984
                    cmddict[value.func.__name__] = value
-
 
985
        logger.log(gendoc(cmddict))
-
 
986
994
987