Data Object 0x7f21 is now optional

This commit is contained in:
NIIBE Yutaka
2011-12-21 14:14:28 +09:00
parent c0ab2ae830
commit a0c8cf2ff4
7 changed files with 66 additions and 14 deletions

View File

@@ -1,3 +1,20 @@
2011-12-21 Niibe Yutaka <gniibe@fsij.org>
* src/openpgp-do.c (gpg_do_get_data) [CERTDO_SUPPORT]: ifdef out.
* src/gnuk.ld.in (.gnuk_ch_certificate): Only valid
when --enable-certdo.
* src/flash.c (flash_check_blank) [CERTDO_SUPPORT]: ifdef out.
(flash_erase_binary) [CERTDO_SUPPORT]: Likewise.
(flash_write_binary) [CERTDO_SUPPORT]: Likewise.
* src/configure (certdo): New.
(--enable-certdo, --disable-certdo): New options.
Remove cheking for /dev/random.
* src/config.h.in (@CERTDO_DEFINE@): New.
2011-12-20 Niibe Yutaka <gniibe@fsij.org> 2011-12-20 Niibe Yutaka <gniibe@fsij.org>
* src/usb_msc.c (msc_handle_command): SCSI_START_STOP_UNIT command * src/usb_msc.c (msc_handle_command): SCSI_START_STOP_UNIT command

6
NEWS
View File

@@ -4,6 +4,12 @@ Gnuk NEWS - User visible changes
Released 2012-01-XX, by NIIBE Yutaka Released 2012-01-XX, by NIIBE Yutaka
** CERT.3 Data Object (0x7f21) is now optional
As there's no valid use case for this data object and it does not
work as current version of GnuPG, this is now optional feature.
You can enable this data object by specifying --enable-certdo at
configure time.
** With DnD pinentry, user can cancel pin input ** With DnD pinentry, user can cancel pin input
Now, user can cancel pin input by unmounting device before finishing Now, user can cancel pin input by unmounting device before finishing
DnD. DnD.

View File

@@ -5,3 +5,4 @@
@DFU_DEFINE@ @DFU_DEFINE@
@PINPAD_DEFINE@ @PINPAD_DEFINE@
@PINPAD_MORE_DEFINE@ @PINPAD_MORE_DEFINE@
@CERTDO_DEFINE@

34
src/configure vendored
View File

@@ -26,12 +26,7 @@ verbose=no
with_dfu=default with_dfu=default
debug=no debug=no
pinpad=no pinpad=no
certdo=no
# check /dev/random
if test ! -e /dev/random; then
echo "/dev/random is required." >&2
exit 1
fi
# Process each option # Process each option
for option; do for option; do
@@ -57,6 +52,10 @@ for option; do
pinpad=$optarg ;; pinpad=$optarg ;;
--disable-pinpad) --disable-pinpad)
pinpad=no ;; pinpad=no ;;
--enable-certdo)
certdo=yes ;;
--disable-certdo)
certdo=no ;;
--with-dfu) --with-dfu)
with_dfu=yes ;; with_dfu=yes ;;
--without-dfu) --without-dfu)
@@ -88,6 +87,7 @@ Configuration:
--enable-debug debug with virtual COM port [no] --enable-debug debug with virtual COM port [no]
--enable-pinpad={dnd,cir,dial} --enable-pinpad={dnd,cir,dial}
PIN entry support [no] PIN entry support [no]
--enable-certdo support CERT.3 data object [no]
--with-dfu build image for DFU [<target specific>] --with-dfu build image for DFU [<target specific>]
EOF EOF
exit 0 exit 0
@@ -170,16 +170,34 @@ else
echo "PIN pad option enabled ($pinpad)" echo "PIN pad option enabled ($pinpad)"
fi fi
# --enable-certdo option
if test "$certdo" = "yes"; then
CERTDO_DEFINE="#define CERTDO_SUPPORT 1"
echo "CERT.3 Data Object is supported (Note: it is not supported by GnuPG)"
else
CERTDO_DEFINE="#undef CERTDO_SUPPORT"
echo "CERT.3 Data Object is not supported"
fi
sed -e "s%@BOARD_DIR@%$BOARD_DIR%" \ sed -e "s%@BOARD_DIR@%$BOARD_DIR%" \
-e "s%@DEBUG_MAKE_OPTION@%$DEBUG_MAKE_OPTION%" \ -e "s%@DEBUG_MAKE_OPTION@%$DEBUG_MAKE_OPTION%" \
-e "s%@PINPAD_MAKE_OPTION@%$PINPAD_MAKE_OPTION%" \ -e "s%@PINPAD_MAKE_OPTION@%$PINPAD_MAKE_OPTION%" \
< Makefile.in > Makefile < Makefile.in > Makefile
sed -e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \ if test "$certdo" = "yes"; then
sed -e "/^@CERTDO_SUPPORT_START@$/ d" -e "/^@CERTDO_SUPPORT_END@$/ d" \
-e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \
-e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \ -e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \
< gnuk.ld.in > gnuk.ld < gnuk.ld.in > gnuk.ld
else
sed -e "/^@CERTDO_SUPPORT_START@$/,/^@CERTDO_SUPPORT_END@$/ d" \
-e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \
-e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \
< gnuk.ld.in > gnuk.ld
fi
sed -e "s/@DEBUG_DEFINE@/$DEBUG_DEFINE/" \ sed -e "s/@DEBUG_DEFINE@/$DEBUG_DEFINE/" \
-e "s/@DFU_DEFINE@/$DFU_DEFINE/" \
-e "s/@PINPAD_DEFINE@/$PINPAD_DEFINE/" \ -e "s/@PINPAD_DEFINE@/$PINPAD_DEFINE/" \
-e "s/@PINPAD_MORE_DEFINE@/$PINPAD_MORE_DEFINE/" \ -e "s/@PINPAD_MORE_DEFINE@/$PINPAD_MORE_DEFINE/" \
-e "s/@DFU_DEFINE@/$DFU_DEFINE/" \ -e "s/@CERTDO_DEFINE@/$CERTDO_DEFINE/" \
< config.h.in > config.h < config.h.in > config.h
exit 0 exit 0

View File

@@ -581,6 +581,7 @@ flash_cnt123_clear (const uint8_t **addr_p)
} }
#if defined(CERTDO_SUPPORT)
static int static int
flash_check_blank (const uint8_t *page, int size) flash_check_blank (const uint8_t *page, int size)
{ {
@@ -592,17 +593,16 @@ flash_check_blank (const uint8_t *page, int size)
return 1; return 1;
} }
#endif
#define FLASH_CH_CERTIFICATE_SIZE 2048 #define FLASH_CH_CERTIFICATE_SIZE 2048
int int
flash_erase_binary (uint8_t file_id) flash_erase_binary (uint8_t file_id)
{ {
const uint8_t *p; #if defined(CERTDO_SUPPORT)
if (file_id == FILEID_CH_CERTIFICATE) if (file_id == FILEID_CH_CERTIFICATE)
{ {
p = &ch_certificate_start; const uint8_t *p = &ch_certificate_start;
if (flash_check_blank (p, FLASH_CH_CERTIFICATE_SIZE) == 0) if (flash_check_blank (p, FLASH_CH_CERTIFICATE_SIZE) == 0)
{ {
flash_erase_page ((uint32_t)p); flash_erase_page ((uint32_t)p);
@@ -614,6 +614,9 @@ flash_erase_binary (uint8_t file_id)
return 0; return 0;
} }
else else
#else
(void)file_id;
#endif
return -1; return -1;
} }
@@ -625,12 +628,15 @@ flash_write_binary (uint8_t file_id, const uint8_t *data,
uint16_t maxsize; uint16_t maxsize;
const uint8_t *p; const uint8_t *p;
#if defined(CERTDO_SUPPORT)
if (file_id == FILEID_CH_CERTIFICATE) if (file_id == FILEID_CH_CERTIFICATE)
{ {
maxsize = FLASH_CH_CERTIFICATE_SIZE; maxsize = FLASH_CH_CERTIFICATE_SIZE;
p = &ch_certificate_start; p = &ch_certificate_start;
} }
else if (file_id == FILEID_SERIAL_NO) else
#endif
if (file_id == FILEID_SERIAL_NO)
{ {
maxsize = 6; maxsize = 6;
p = &openpgpcard_aid[8]; p = &openpgpcard_aid[8];

View File

@@ -115,6 +115,7 @@ SECTIONS
PROVIDE(end = .); PROVIDE(end = .);
_end = .; _end = .;
@CERTDO_SUPPORT_START@
.gnuk_ch_certificate : .gnuk_ch_certificate :
{ {
. = ALIGN (@FLASH_PAGE_SIZE@); . = ALIGN (@FLASH_PAGE_SIZE@);
@@ -123,6 +124,7 @@ SECTIONS
. += 1920; . += 1920;
. = ALIGN (@FLASH_PAGE_SIZE@); . = ALIGN (@FLASH_PAGE_SIZE@);
} > flash =0xffffffff } > flash =0xffffffff
@CERTDO_SUPPORT_END@
.gnuk_flash : .gnuk_flash :
{ {

View File

@@ -1241,6 +1241,7 @@ copy_do (const struct do_table_entry *do_p, int with_tag)
void void
gpg_do_get_data (uint16_t tag, int with_tag) gpg_do_get_data (uint16_t tag, int with_tag)
{ {
#if defined(CERTDO_SUPPORT)
if (tag == GPG_DO_CH_CERTIFICATE) if (tag == GPG_DO_CH_CERTIFICATE)
{ {
res_APDU_pointer = &ch_certificate_start; res_APDU_pointer = &ch_certificate_start;
@@ -1255,6 +1256,7 @@ gpg_do_get_data (uint16_t tag, int with_tag)
res_APDU_size += 4 + 2; res_APDU_size += 4 + 2;
} }
else else
#endif
{ {
const struct do_table_entry *do_p = get_do_entry (tag); const struct do_table_entry *do_p = get_do_entry (tag);