static CK_ATTRIBUTE_PTR get_unlock_options_from_prompt (GkmWrapPrompt *self, CK_ULONG_PTR n_options) { CK_ATTRIBUTE_PTR options; CK_BBOOL bval; g_assert (GKM_IS_WRAP_PROMPT (self)); g_assert (n_options); *n_options = 2; options = pool_alloc (self, sizeof (CK_ATTRIBUTE) * (*n_options)); /* CKA_TOKEN */ bval = TRUE; options[0].type = CKA_TOKEN; options[0].pValue = pool_dup (self, &bval, sizeof (bval)); options[0].ulValueLen = sizeof (bval); /* CKA_GNOME_TRANSIENT */ bval = TRUE; options[1].type = CKA_GNOME_TRANSIENT; options[1].pValue = pool_dup (self, &bval, sizeof (bval)); options[1].ulValueLen = sizeof (bval); return options; }
static CK_ATTRIBUTE_PTR get_unlock_options_from_prompt (GkmWrapPrompt *self, CK_ULONG_PTR n_options) { CK_ATTRIBUTE_PTR options; const gchar *choice; CK_BBOOL bval; CK_ULONG uval; guint ttl; g_assert (GKM_WRAP_IS_PROMPT (self)); g_assert (n_options); if (!gku_prompt_has_response (GKU_PROMPT (self))) return NULL; ttl = gku_prompt_get_unlock_ttl (GKU_PROMPT (self)); choice = gku_prompt_get_unlock_choice (GKU_PROMPT (self)); g_return_val_if_fail (choice, NULL); *n_options = 4; options = pool_alloc (self, sizeof (CK_ATTRIBUTE) * (*n_options)); /* CKA_TOKEN */ bval = TRUE; options[0].type = CKA_TOKEN; options[0].pValue = pool_dup (self, &bval, sizeof (bval)); options[0].ulValueLen = sizeof (bval); /* CKA_MATE_TRANSIENT */ bval = TRUE; options[1].type = CKA_MATE_TRANSIENT; options[1].pValue = pool_dup (self, &bval, sizeof (bval)); options[1].ulValueLen = sizeof (bval); /* CKA_G_DESTRUCT_IDLE */ uval = g_str_equal (choice, GCR_UNLOCK_OPTION_IDLE) ? ttl : 0; options[2].type = CKA_G_DESTRUCT_IDLE; options[2].pValue = pool_dup (self, &uval, sizeof (uval)); options[2].ulValueLen = sizeof (uval); /* CKA_G_DESTRUCT_AFTER */ uval = g_str_equal (choice, GCR_UNLOCK_OPTION_TIMEOUT) ? ttl : 0; options[3].type = CKA_G_DESTRUCT_AFTER; options[3].pValue = pool_dup (self, &uval, sizeof (uval)); options[3].ulValueLen = sizeof (uval); return options; }
static CK_ATTRIBUTE_PTR get_attributes_from_object (GkmWrapPrompt *self, CK_ULONG *n_attrs) { CK_ATTRIBUTE attrs[6]; CK_ULONG i; CK_RV rv; g_assert (GKM_WRAP_IS_PROMPT (self)); g_assert (n_attrs); g_assert (self->module); memset (attrs, 0, sizeof (attrs)); attrs[0].type = CKA_LABEL; attrs[1].type = CKA_ID; attrs[2].type = CKA_CLASS; attrs[3].type = CKA_G_LOGIN_COLLECTION; attrs[4].type = CKA_MATE_UNIQUE; attrs[5].type = CKA_MATE_INTERNAL_SHA1; rv = (self->module->C_GetAttributeValue) (self->session, self->object, attrs, G_N_ELEMENTS (attrs)); if (rv != CKR_OK && rv != CKR_ATTRIBUTE_TYPE_INVALID) { g_warning ("Couldn't retrieve information about object to unlock: %s", gkm_util_rv_to_string (rv)); return NULL; } /* Allocate for each value, note we're null terminating values */ for (i = 0; i < G_N_ELEMENTS (attrs); ++i) { if (attrs[i].ulValueLen != (CK_ULONG)-1) attrs[i].pValue = pool_alloc (self, attrs[i].ulValueLen + 1); } /* Now get the actual values */ rv = (self->module->C_GetAttributeValue) (self->session, self->object, attrs, G_N_ELEMENTS (attrs)); if (rv != CKR_OK && rv != CKR_ATTRIBUTE_TYPE_INVALID) { g_warning ("couldn't retrieve credential template for prompt: %s", gkm_util_rv_to_string (rv)); return NULL; } *n_attrs = G_N_ELEMENTS (attrs); return pool_dup (self, attrs, sizeof (attrs)); }