uim: implement 'UIM Change PIN'

This commit is contained in:
Aleksander Morgado 2016-01-30 10:25:43 -08:00
parent 517af334d1
commit 2c0b445027
3 changed files with 177 additions and 0 deletions

View File

@ -461,6 +461,66 @@
{ "name" : "SW2",
"format" : "guint8" } ] } ] },
// *********************************************************************************
{ "name" : "Change PIN",
"type" : "Message",
"service" : "UIM",
"id" : "0x0028",
"version" : "1.0",
"input" : [ { "name" : "Session Information",
"id" : "0x01",
"mandatory" : "yes",
"type" : "TLV",
"format" : "sequence",
"contents" : [ { "name" : "Session Type",
"format" : "guint8",
"public-format" : "QmiUimSessionType" },
{ "name" : "Application Identifier",
"format" : "string" } ] },
{ "name" : "Info",
"id" : "0x02",
"mandatory" : "yes",
"type" : "TLV",
"format" : "sequence",
"contents" : [ { "name" : "PIN ID",
"format" : "guint8",
"public-format" : "QmiUimPinId" },
{ "name" : "Old PIN",
"format" : "string" },
{ "name" : "New PIN",
"format" : "string" } ] },
{ "name" : "Response In Indication Token",
"id" : "0x11",
"mandatory" : "no",
"type" : "TLV",
"format" : "guint32" } ],
"output" : [ { "common-ref" : "Operation Result" },
{ "name" : "Retries Remaining",
"id" : "0x10",
"mandatory" : "no",
"type" : "TLV",
"format" : "sequence",
"contents" : [ { "name" : "Verify Retries Left",
"format" : "guint8" },
{ "name" : "Unblock Retries Left",
"format" : "guint8" } ],
"prerequisites": [ { "common-ref" : "No Success" } ] },
{ "name" : "Response In Indication Token",
"id" : "0x12",
"mandatory" : "no",
"type" : "TLV",
"format" : "guint32",
"prerequisites" : [ { "common-ref" : "Success" } ] },
{ "name" : "Card Result",
"id" : "0x13",
"mandatory" : "no",
"type" : "TLV",
"format" : "sequence",
"contents" : [ { "name" : "SW1",
"format" : "guint8" },
{ "name" : "SW2",
"format" : "guint8" } ] } ] },
// *********************************************************************************
{ "name" : "Get Card Status",
"type" : "Message",

View File

@ -250,6 +250,7 @@
<xi:include href="xml/qmi-message-uim-set-pin-protection.xml"/>
<xi:include href="xml/qmi-message-uim-verify-pin.xml"/>
<xi:include href="xml/qmi-message-uim-unblock-pin.xml"/>
<xi:include href="xml/qmi-message-uim-change-pin.xml"/>
<xi:include href="xml/qmi-message-uim-read-transparent.xml"/>
<xi:include href="xml/qmi-message-uim-read-record.xml"/>
<xi:include href="xml/qmi-message-uim-get-file-attributes.xml"/>

View File

@ -46,6 +46,7 @@ static gchar *read_transparent_str;
static gchar *set_pin_protection_str;
static gchar *verify_pin_str;
static gchar *unblock_pin_str;
static gchar *change_pin_str;
static gchar *get_file_attributes_str;
static gboolean get_card_status_flag;
static gboolean get_supported_messages_flag;
@ -65,6 +66,10 @@ static GOptionEntry entries[] = {
"Unblock PIN",
"[(PIN1|PIN2|UPIN),(PUK),(new PIN)]",
},
{ "uim-change-pin", 0, 0, G_OPTION_ARG_STRING, &change_pin_str,
"Change PIN",
"[(PIN1|PIN2|UPIN),(old PIN),(new PIN)]",
},
{ "uim-read-transparent", 0, 0, G_OPTION_ARG_STRING, &read_transparent_str,
"Read a transparent file given the file path",
"[0xNNNN,0xNNNN,...]"
@ -119,6 +124,7 @@ qmicli_uim_options_enabled (void)
n_actions = (!!set_pin_protection_str +
!!verify_pin_str +
!!unblock_pin_str +
!!change_pin_str +
!!read_transparent_str +
!!get_file_attributes_str +
get_card_status_flag +
@ -423,6 +429,96 @@ unblock_pin_ready (QmiClientUim *client,
operation_shutdown (TRUE);
}
static QmiMessageUimChangePinInput *
change_pin_input_create (const gchar *str)
{
QmiMessageUimChangePinInput *input = NULL;
gchar **split;
QmiUimPinId pin_id;
gchar *old_pin;
gchar *new_pin;
/* Prepare inputs.
* Format of the string is:
* "[(PIN1|PIN2),(old PIN),(new PIN)]"
*/
split = g_strsplit (str, ",", -1);
if (qmicli_read_uim_pin_id_from_string (split[0], &pin_id) &&
qmicli_read_non_empty_string (split[1], "old PIN", &old_pin) &&
qmicli_read_non_empty_string (split[2], "new PIN", &new_pin)) {
GError *error = NULL;
input = qmi_message_uim_change_pin_input_new ();
if (!qmi_message_uim_change_pin_input_set_info (
input,
pin_id,
old_pin,
new_pin,
&error) ||
!qmi_message_uim_change_pin_input_set_session_information (
input,
QMI_UIM_SESSION_TYPE_CARD_SLOT_1,
"", /* ignored */
&error)) {
g_printerr ("error: couldn't create input data bundle: '%s'\n",
error->message);
g_error_free (error);
qmi_message_uim_change_pin_input_unref (input);
input = NULL;
}
}
g_strfreev (split);
return input;
}
static void
change_pin_ready (QmiClientUim *client,
GAsyncResult *res)
{
QmiMessageUimChangePinOutput *output;
GError *error = NULL;
output = qmi_client_uim_change_pin_finish (client, res, &error);
if (!output) {
g_printerr ("error: operation failed: %s\n", error->message);
g_error_free (error);
operation_shutdown (FALSE);
return;
}
if (!qmi_message_uim_change_pin_output_get_result (output, &error)) {
guint8 verify_retries_left;
guint8 unblock_retries_left;
g_printerr ("error: couldn't change PIN: %s\n", error->message);
g_error_free (error);
if (qmi_message_uim_change_pin_output_get_retries_remaining (
output,
&verify_retries_left,
&unblock_retries_left,
NULL)) {
g_printerr ("[%s] Retries left:\n"
"\tVerify: %u\n"
"\tUnblock: %u\n",
qmi_device_get_path_display (ctx->device),
verify_retries_left,
unblock_retries_left);
}
qmi_message_uim_change_pin_output_unref (output);
operation_shutdown (FALSE);
return;
}
g_print ("[%s] PIN changed successfully\n",
qmi_device_get_path_display (ctx->device));
qmi_message_uim_change_pin_output_unref (output);
operation_shutdown (TRUE);
}
static void
get_supported_messages_ready (QmiClientUim *client,
GAsyncResult *res)
@ -1035,6 +1131,26 @@ qmicli_uim_run (QmiDevice *device,
return;
}
/* Request to change the PIN? */
if (change_pin_str) {
QmiMessageUimChangePinInput *input;
g_debug ("Asynchronously changing PIN...");
input = change_pin_input_create (change_pin_str);
if (!input) {
operation_shutdown (FALSE);
return;
}
qmi_client_uim_change_pin (ctx->client,
input,
10,
ctx->cancellable,
(GAsyncReadyCallback)change_pin_ready,
NULL);
qmi_message_uim_change_pin_input_unref (input);
return;
}
/* Request to read a transparent file? */
if (read_transparent_str) {
QmiMessageUimReadTransparentInput *input;