fix things around write_binary

This commit is contained in:
NIIBE Yutaka
2011-02-09 14:06:57 +09:00
parent 677fc00489
commit 6f19c97afd
7 changed files with 42 additions and 41 deletions

View File

@@ -27,9 +27,12 @@ NIIBE Yutaka:
boards/CQ_STARM/board.h
boards/CQ_STARM/board.mk
boards/CQ_STARM/mcuconf.h
Wrote a tool for DfuSe:
Wrote tools for DfuSe:
tool/dfuse.py
tool/dump_mem.py
tool/intel_hex.py
Wrote a tool for Gnuk:
tool/gnuk_put_binary.py
Wrote:
gnuk.svg
src/configure

View File

@@ -1,3 +1,18 @@
2011-02-09 NIIBE Yutaka <gniibe@fsij.org>
* src/usb_prop.c (gnukStringSerial): Updated.
* tool/gnuk_put_binary.py (gnuk_token.__del__): Removed.
Releasing the interface is done in PyUSB.
* tool/dfuse.py (DFU_STM32.__del__): Removed.
* src/openpgp.c (cmd_write_binary): Support random bits and card
holder certificate as well.
* src/openpgp-do.c (do_openpgpcard_aid): Add volatile to prevent
compiler optimization to access AID.
2011-02-08 NIIBE Yutaka <gniibe@fsij.org>
* tool/gnuk_put_binary.py: Renamed (was: gnuk_update_binary.py).

View File

@@ -416,7 +416,7 @@ const uint8_t openpgpcard_aid[] = {
static int
do_openpgpcard_aid (uint16_t tag, int with_tag)
{
const uint16_t *vid_p = (const uint16_t *)&openpgpcard_aid[8];
uint16_t vid = *((const volatile uint16_t *)&openpgpcard_aid[8]);
if (with_tag)
{
@@ -424,7 +424,7 @@ do_openpgpcard_aid (uint16_t tag, int with_tag)
*res_p++ = 16;
}
if (*vid_p == 0xffff || *vid_p == 0x0000)
if (vid == 0xffff || vid == 0x0000)
{
const uint8_t *u = unique_device_id ();

View File

@@ -870,7 +870,7 @@ cmd_update_binary (void)
}
if ((cmd_APDU[2] & 0x80))
if ((cmd_APDU[2] & 0x7f) <= 0x01)
if ((cmd_APDU[2] & 0x7f) <= FILEID_RANDOM)
{
file_selection = FILE_EF_CH_CERTIFICATE + (cmd_APDU[2] & 0x7f);
r = flash_erase_binary (file_selection - FILE_EF_CH_CERTIFICATE);
@@ -941,7 +941,7 @@ cmd_write_binary (void)
}
if ((cmd_APDU[2] & 0x80))
if ((cmd_APDU[2] & 0x7f) == FILEID_SERIAL_NO)
if ((cmd_APDU[2] & 0x7f) <= FILEID_SERIAL_NO)
{
file_selection = FILE_EF_CH_CERTIFICATE + (cmd_APDU[2] & 0x7f);
offset = 0;
@@ -953,7 +953,9 @@ cmd_write_binary (void)
}
else
{
if (file_selection != FILEID_SERIAL_NO)
if (file_selection != FILE_EF_CH_CERTIFICATE
&& file_selection != FILE_EF_RANDOM
&& file_selection != FILEID_SERIAL_NO)
{
GPG_COMMAND_NOT_ALLOWED ();
return;

View File

@@ -37,19 +37,14 @@
#endif
static uint8_t gnukStringSerial[] = {
14*2+2, /* bLength */
13*2+2, /* bLength */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
#if defined(SERIAL_NUMBER_IN_AID)
'F', 0, /* 'F' for Fixed */
#else
'C', 0, /* 'C' for Chip uniqure ID */
#endif
'-', 0,
'0', 0, '.', 0, '8', 0, /* Version number of Gnuk */
'0', 0, '.', 0, '1', 0, '0', 0, /* Version number of Gnuk */
'-', 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
};
#define ID_OFFSET 12
static void
gnuk_device_init (void)
@@ -59,10 +54,10 @@ gnuk_device_init (void)
for (i = 0; i < 4; i++)
{
gnukStringSerial[i*4+14] = (u[i*2] >> 4) + 'A';
gnukStringSerial[i*4+15] = 0;
gnukStringSerial[i*4+16] = (u[i*2+1] & 0x0f) + 'A';
gnukStringSerial[i*4+17] = 0;
gnukStringSerial[i*4+ID_OFFSET+0] = (u[i*2] >> 4) + 'A';
gnukStringSerial[i*4+ID_OFFSET+1] = 0;
gnukStringSerial[i*4+ID_OFFSET+2] = (u[i*2+1] & 0x0f) + 'A';
gnukStringSerial[i*4+ID_OFFSET+3] = 0;
}
pInformation->Current_Configuration = 0;

View File

@@ -119,13 +119,6 @@ class DFU_STM32:
# Initialize members
self.__blocknum = 0
def __del__(self):
try:
self.__devhandle.releaseInterface()
del self.__devhandle
except:
pass
def ll_getdev(self):
return self.__devhandle

View File

@@ -25,7 +25,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
from intel_hex import *
from struct import *
import sys, time, os, binascii
import sys, time, os, binascii, string
# INPUT: binary file
@@ -81,14 +81,6 @@ class gnuk_token:
self.__timeout = 10000
self.__seq = 0
def __del__(self):
try:
self.__devhandle.releaseInterface()
del self.__devhandle
except:
pass
def icc_get_result(self):
msg = self.__devhandle.bulkRead(self.__bulkin, 1024, self.__timeout)
if len(msg) < 10:
@@ -249,6 +241,7 @@ def main(fileid, is_update, data):
else:
icc.cmd_write_binary(fileid, data)
icc.cmd_select_openpgp()
if fileid == 0:
data = data[:-2]
data_in_device = icc.cmd_get_data(0x7f, 0x21)
compare(data, data_in_device)
@@ -265,16 +258,16 @@ if __name__ == '__main__':
fileid = 2 # serial number
filename = sys.argv[2]
f = open(filename)
email = os.environ['MAIL']
email = os.environ['EMAIL']
serial_data_hex = None
for line in f.readlines():
field = string.split(line)
if field[0] == os.environ['MAIL']:
if field[0] == email:
serial_data_hex = field[1].replace(':','')
f.close()
if not serial_data_hex:
print "No serial number"
exit 1
exit(1)
print "Writing serial number"
data = binascii.unhexlify(serial_data_hex)
elif sys.argv[1] == '-r':
@@ -291,7 +284,7 @@ if __name__ == '__main__':
print "Updating random bits"
else:
fileid = 0 # Card holder certificate
filename = sys.argv[2]
filename = sys.argv[1]
f = open(filename)
data = f.read()
f.close()