#!/usr/bin/python # # Copyright (c) 2016, NORDUnet A/S All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # - Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # - Neither the name of the NORDUnet nor the names of its contributors may # be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ Utility to transfer a new firmware to the bootloader. Example usage: ./bin/dfu path/to/firmware.bin Then reset the Cryptech Alpha board. """ import os import sys import time import struct import serial import argparse from binascii import crc32 CHUNK_SIZE = 4096 def parse_args(): """ Parse the command line arguments """ parser = argparse.ArgumentParser(description = "Device firmware upgrader", add_help = True, formatter_class = argparse.ArgumentDefaultsHelpFormatter, ) parser.add_argument('--verbose', dest='verbose', action='store_true', default=False, help='Verbose operation', ) parser.add_argument('--device', dest='device', default='/dev/ttyUSB0', help='Name of management port USB serial device', ) # positional argument(s) parser.add_argument('filename') return parser.parse_args() def _write(dst, data): for i in range(len(data)): dst.write(data[i]) time.sleep(0.1) if len(data) == 4: print("Wrote 0x{:02x}{:02x}{:02x}{:02x}".format(ord(data[0]), ord(data[1]), ord(data[2]), ord(data[3]))) else: print("Wrote {!r}".format(data)) def _read(dst, verbose=False): res = '' while True: x = dst.read(1) if not x: break res += x if res and verbose: print ("Read {!r}".format(res)) return res def send_file(filename, args): s = os.stat(filename) size = s.st_size src = open(filename, 'rb') chunk_size = CHUNK_SIZE print("Waiting for contact with the bootloader on device {!s}, reset the CrypTech Alpha...".format(args.device)) while True: try: dst = serial.Serial(args.device, 921600, timeout=0.1) except serial.SerialException: time.sleep(0.2) continue dst.write('\r') response = _read(dst, args.verbose) if 'OK' in response: dst.timeout=2 break print('\nUploading firmware\n') crc = 0 counter = 0 # 1. Write size of file (4 bytes) _write(dst, struct.pack('cf865e9
c82c39c


cf865e9
c82c39c










cf865e9
64e5fe8












b3744cd


282617c

f74b886
b3744cd
282617c












b3744cd
79559c5
5f152f5
f74b886

f50805b

f50805b
8c427a7
f50805b
282617c

f50805b
64e5fe8
ab7d78b

64e5fe8
ab7d78b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80