diff --git a/pico-keys-sdk b/pico-keys-sdk index e627b3f..ffaf20d 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit e627b3fc865df1ffc573dfe33d0ebe864f8beea4 +Subproject commit ffaf20da5d65a2dfc6c92026014f818ec9382f21 diff --git a/src/fido/cbor_vendor.c b/src/fido/cbor_vendor.c index 501a22e..4eb5a04 100644 --- a/src/fido/cbor_vendor.c +++ b/src/fido/cbor_vendor.c @@ -266,6 +266,24 @@ int cbor_vendor_generic(uint8_t cmd, const uint8_t *data, size_t len) { } } #endif + else if (cmd == CTAP_VENDOR_MEMORY) { + if (vendorCmd == 0x01) { + CBOR_CHECK(cbor_encoder_create_map(&encoder, &mapEncoder, 5)); + CBOR_CHECK(cbor_encode_uint(&mapEncoder, 0x01)); + CBOR_CHECK(cbor_encode_uint(&mapEncoder, flash_free_space())); + CBOR_CHECK(cbor_encode_uint(&mapEncoder, 0x02)); + CBOR_CHECK(cbor_encode_uint(&mapEncoder, flash_used_space())); + CBOR_CHECK(cbor_encode_uint(&mapEncoder, 0x03)); + CBOR_CHECK(cbor_encode_uint(&mapEncoder, flash_total_space())); + CBOR_CHECK(cbor_encode_uint(&mapEncoder, 0x04)); + CBOR_CHECK(cbor_encode_uint(&mapEncoder, flash_num_files())); + CBOR_CHECK(cbor_encode_uint(&mapEncoder, 0x05)); + CBOR_CHECK(cbor_encode_uint(&mapEncoder, flash_size())); + } + else { + CBOR_ERROR(CTAP2_ERR_UNSUPPORTED_OPTION); + } + } else { CBOR_ERROR(CTAP2_ERR_UNSUPPORTED_OPTION); } diff --git a/src/fido/ctap.h b/src/fido/ctap.h index 6d22edf..ce5617a 100644 --- a/src/fido/ctap.h +++ b/src/fido/ctap.h @@ -126,6 +126,7 @@ typedef struct { #define CTAP_VENDOR_UNLOCK 0x03 #define CTAP_VENDOR_EA 0x04 #define CTAP_VENDOR_PHY_OPTS 0x05 +#define CTAP_VENDOR_MEMORY 0x06 #define CTAP_PERMISSION_MC 0x01 // MakeCredential #define CTAP_PERMISSION_GA 0x02 // GetAssertion diff --git a/tools/pico-fido-tool.py b/tools/pico-fido-tool.py index 377e6b6..963e70f 100644 --- a/tools/pico-fido-tool.py +++ b/tools/pico-fido-tool.py @@ -233,6 +233,7 @@ class Vendor: VENDOR_UNLOCK = 0x03 VENDOR_EA = 0x04 VENDOR_PHY = 0x05 + VENDOR_MEMORY = 0x06 @unique class PARAM(IntEnum): @@ -475,6 +476,13 @@ class Vendor: Vendor.SUBCMD.ENABLE, )[Vendor.RESP.PARAM] + def memory(self): + resp = self._call( + Vendor.CMD.VENDOR_MEMORY, + Vendor.SUBCMD.ENABLE, + ) + return { 'free': resp[1], 'used': resp[2], 'total': resp[3], 'files': resp[4], 'size': resp[5] } + def parse_args(): parser = argparse.ArgumentParser() subparser = parser.add_subparsers(title="commands", dest="command") @@ -503,6 +511,8 @@ def parse_args(): parser_phy_optdimm = subparser_phy.add_parser('led_dimmable', help='Enable/Disable LED dimming.') parser_phy_optdimm.add_argument('value', choices=['enable', 'disable'], help='Enable/Disable LED dimming.', nargs='?') + parser_mem = subparser.add_parser('memory', help='Get current memory usage.') + args = parser.parse_args() return args @@ -560,9 +570,17 @@ def phy(vdr, args): else: print('Command executed successfully. Please, restart your Pico Key.') +def memory(vdr, args): + mem = vdr.memory() + print(f'Memory usage:') + print(f'\tFree: {mem["free"]/1024:.2f} kilobytes ({mem["free"]*100/mem["total"]:.2f}%)') + print(f'\tUsed: {mem["used"]/1024:.2f} kilobytes ({mem["used"]*100/mem["total"]:.2f}%)') + print(f'\tTotal: {mem["total"]/1024:.2f} kilobytes') + print(f'\tFlash size: {mem["size"]/1024:.2f} kilobytes') + print(f'\tFiles: {mem["files"]}') def main(args): - print('Pico Fido Tool v1.8') + print('Pico Fido Tool v1.10') print('Author: Pol Henarejos') print('Report bugs to https://github.com/polhenarejos/pico-fido/issues') print('') @@ -582,6 +600,8 @@ def main(args): attestation(vdr, args) elif (args.command == 'phy'): phy(vdr, args) + elif (args.command == 'memory'): + memory(vdr, args) def run(): args = parse_args()