Fix UIF DO handling.
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 27 Sep 2018 13:29:49 +0000 (22:29 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 27 Sep 2018 13:29:49 +0000 (22:29 +0900)
src/openpgp-do.c

index f55adea..8856cd1 100644 (file)
@@ -1797,6 +1797,10 @@ gpg_data_scan (const uint8_t *do_start, const uint8_t *do_end)
   digital_signature_counter = 0;
   uif_flags = 0;
 
+  /* Clear all data objects.  */
+  for (i = 0; i < NR_DO__LAST__; i++)
+    do_ptr[i] = NULL;
+
   /* When the card is terminated no data objects are valid.  */
   if (do_start == NULL)
     return;
@@ -1859,6 +1863,7 @@ gpg_data_scan (const uint8_t *do_start, const uint8_t *do_end)
              case NR_DO_UIF_AUT:
                uif_flags &= ~(3 << ((nr - NR_DO_UIF_SIG) * 2));
                uif_flags |= (second_byte & 3) << ((nr - NR_DO_UIF_SIG) * 2);
+               p++;
                break;
              case NR_COUNTER_123:
                p++;
@@ -1959,6 +1964,13 @@ gpg_data_copy (const uint8_t *p_start)
        p += 4;
       }
 
+  for (i = 0; i < 3; i++)
+    if ((v = (uif_flags & (3 << (i * 2)))))
+      {
+       flash_enum_write_internal (p, NR_DO_UIF_SIG + 1, v);
+       p += 2;
+      }
+
   data_objects_number_of_bytes = 0;
   for (i = 0; i < NR_DO__LAST__; i++)
     if (do_ptr[i] != NULL)