static void imported_object (GckObject *object, const gchar *destination) { gulong attr_types[3]; GckAttributes *attrs; const GckAttribute *id; CK_OBJECT_CLASS klass; const gchar *message; GError *err = NULL; gchar *label, *hex; attr_types[0] = CKA_LABEL; attr_types[1] = CKA_CLASS; attr_types[2] = CKA_ID; attrs = gck_object_get_full (object, attr_types, G_N_ELEMENTS (attr_types), NULL, &err); if (attrs == NULL) { gkr_tool_handle_error (&err, "couldn't get imported object info"); return; } if (!gck_attributes_find_string (attrs, CKA_LABEL, &label)) label = g_strdup ("unknown"); if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &klass)) klass = CKO_DATA; id = gck_attributes_find (attrs, CKA_ID); switch (klass) { case CKO_CERTIFICATE: message = "%s: imported certificate: %s\n"; break; case CKO_DATA: message = "%s: imported data: %s\n"; break; case CKO_PRIVATE_KEY: message = "%s: imported private key: %s\n"; break; case CKO_PUBLIC_KEY: message = "%s: imported public key: %s\n"; break; case CKO_SECRET_KEY: message = "%s: imported secret key: %s\n"; break; default: message = "%s: imported object: %s\n"; break; }; g_print (message, destination, label); if (id) { hex = egg_hex_encode (id->value, id->length); g_print ("\tidentifier: %s\n", hex); g_free (hex); } gck_attributes_unref (attrs); g_free (label); }
gboolean gkd_ssh_agent_proto_write_public_v1 (EggBuffer *resp, GckAttributes *attrs) { const GckAttribute *attr; gulong bits; g_assert (resp); g_assert (attrs); /* This is always an RSA key. */ /* Write out the number of bits of the key */ if (!gck_attributes_find_ulong (attrs, CKA_MODULUS_BITS, &bits)) g_return_val_if_reached (FALSE); egg_buffer_add_uint32 (resp, bits); /* Write out the exponent */ attr = gck_attributes_find (attrs, CKA_PUBLIC_EXPONENT); g_return_val_if_fail (attr, FALSE); if (!gkd_ssh_agent_proto_write_mpi_v1 (resp, attr)) return FALSE; /* Write out the modulus */ attr = gck_attributes_find (attrs, CKA_MODULUS); g_return_val_if_fail (attr, FALSE); if (!gkd_ssh_agent_proto_write_mpi_v1 (resp, attr)) return FALSE; return TRUE; }
gboolean gkd_ssh_agent_proto_write_public (EggBuffer *resp, GckAttributes *attrs) { gboolean ret = FALSE; const gchar *salgo; gulong algo; g_assert (resp); g_assert (attrs); if (!gck_attributes_find_ulong (attrs, CKA_KEY_TYPE, &algo)) g_return_val_if_reached (FALSE); salgo = gkd_ssh_agent_proto_algo_to_keytype (algo); g_assert (salgo); egg_buffer_add_string (resp, salgo); switch (algo) { case CKK_RSA: ret = gkd_ssh_agent_proto_write_public_rsa (resp, attrs); break; case CKK_DSA: ret = gkd_ssh_agent_proto_write_public_dsa (resp, attrs); break; default: g_return_val_if_reached (FALSE); break; } return ret; }
GNode * _gcr_subject_public_key_for_attributes (GckAttributes *attributes) { gboolean ret = FALSE; gulong key_type; gulong klass; GNode *asn = NULL; if (!gck_attributes_find_ulong (attributes, CKA_CLASS, &klass)) { _gcr_debug ("no class in attributes"); return NULL; } if (klass == CKO_CERTIFICATE) { return cert_subject_public_key_from_attributes (attributes); } else if (klass == CKO_PUBLIC_KEY || klass == CKO_PRIVATE_KEY) { if (!gck_attributes_find_ulong (attributes, CKA_KEY_TYPE, &key_type)) { _gcr_debug ("no key type in attributes"); return NULL; } asn = egg_asn1x_create (pkix_asn1_tab, "SubjectPublicKeyInfo"); g_return_val_if_fail (asn, NULL); if (key_type == CKK_RSA) { ret = rsa_subject_public_key_from_attributes (attributes, asn); } else if (key_type == CKK_DSA) { ret = dsa_subject_public_key_from_attributes (attributes, klass, asn); } else { _gcr_debug ("unsupported key type: %lu", key_type); ret = FALSE; } if (ret == FALSE) { egg_asn1x_destroy (asn); asn = NULL; } } return asn; }
static void gcr_key_renderer_real_render (GcrRenderer *renderer, GcrViewer *viewer) { GcrKeyRenderer *self; GcrDisplayView *view; const gchar *text = ""; GckAttributes *attrs; gpointer fingerprint; gsize n_fingerprint; gchar *display; gulong klass; gulong key_type; guint size; self = GCR_KEY_RENDERER (renderer); if (GCR_IS_DISPLAY_VIEW (viewer)) { view = GCR_DISPLAY_VIEW (viewer); } else { g_warning ("GcrKeyRenderer only works with internal specific " "GcrViewer returned by gcr_viewer_new()."); return; } _gcr_display_view_begin (view, renderer); attrs = calculate_attrs (self); if (attrs == NULL) { _gcr_display_view_end (view, renderer); return; } if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) || !gck_attributes_find_ulong (attrs, CKA_KEY_TYPE, &key_type)) { g_warning ("private key does not have the CKA_CLASS and CKA_KEY_TYPE attributes"); _gcr_display_view_end (view, renderer); gck_attributes_unref (attrs); return; } _gcr_display_view_set_icon (view, renderer, self->pv->icon); display = calculate_label (self); _gcr_display_view_append_title (view, renderer, display); g_free (display); if (klass == CKO_PRIVATE_KEY) { if (key_type == CKK_RSA) text = _("Private RSA Key"); else if (key_type == CKK_DSA) text = _("Private DSA Key"); else if (key_type == CKK_EC) text = _("Private Elliptic Curve Key"); else text = _("Private Key"); } else if (klass == CKO_PUBLIC_KEY) { if (key_type == CKK_RSA) text = _("Public DSA Key"); else if (key_type == CKK_DSA) text = _("Public DSA Key"); else if (key_type == CKK_EC) text = _("Public Elliptic Curve Key"); else text = _("Public Key"); } _gcr_display_view_append_content (view, renderer, text, NULL); size = _gcr_subject_public_key_attributes_size (attrs); if (size > 0) { display = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%u bit", "%u bits", size), size); _gcr_display_view_append_content (view, renderer, _("Strength"), display); g_free (display); } _gcr_display_view_start_details (view, renderer); if (key_type == CKK_RSA) text = _("RSA"); else if (key_type == CKK_DSA) text = _("DSA"); else if (key_type == CKK_EC) text = _("Elliptic Curve"); else text = _("Unknown"); _gcr_display_view_append_value (view, renderer, _("Algorithm"), text, FALSE); if (size == 0) display = g_strdup (_("Unknown")); else display = g_strdup_printf ("%u", size); _gcr_display_view_append_value (view, renderer, _("Size"), display, FALSE); g_free (display); /* Fingerprints */ _gcr_display_view_append_heading (view, renderer, _("Fingerprints")); fingerprint = calculate_fingerprint (self, attrs, G_CHECKSUM_SHA1, &n_fingerprint); if (fingerprint) { _gcr_display_view_append_hex (view, renderer, _("SHA1"), fingerprint, n_fingerprint); g_free (fingerprint); } fingerprint = calculate_fingerprint (self, attrs, G_CHECKSUM_SHA256, &n_fingerprint); if (fingerprint) { _gcr_display_view_append_hex (view, renderer, _("SHA256"), fingerprint, n_fingerprint); g_free (fingerprint); } _gcr_display_view_end (view, renderer); gck_attributes_unref (attrs); }