guint _gcr_subject_public_key_calculate_size (GNode *subject_public_key) { GBytes *key; GNode *params; guint key_size = 0; guint n_bits; GQuark oid; /* Figure out the algorithm */ oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (subject_public_key, "algorithm", "algorithm", NULL)); g_return_val_if_fail (oid != 0, 0); /* RSA keys are stored in the main subjectPublicKey field */ if (oid == GCR_OID_PKIX1_RSA) { key = egg_asn1x_get_bits_as_raw (egg_asn1x_node (subject_public_key, "subjectPublicKey", NULL), &n_bits); g_return_val_if_fail (key != NULL, 0); key_size = calculate_rsa_key_size (key); g_bytes_unref (key); /* The DSA key size is discovered by the prime in params */ } else if (oid == GCR_OID_PKIX1_DSA) { params = egg_asn1x_node (subject_public_key, "algorithm", "parameters", NULL); key_size = calculate_dsa_params_size (params); } else { g_message ("unsupported key algorithm: %s", g_quark_to_string (oid)); } return key_size; }
static guint calculate_key_size (GcrCertificateInfo *info) { GNode *asn; gconstpointer data, params; gsize n_data, n_params; guint key_size = 0, n_bits; guchar *key = NULL; GQuark oid; data = egg_asn1x_get_raw_element (egg_asn1x_node (info->asn1, "tbsCertificate", "subjectPublicKeyInfo", NULL), &n_data); g_return_val_if_fail (data != NULL, 0); asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "SubjectPublicKeyInfo", data, n_data); g_return_val_if_fail (asn, 0); /* Figure out the algorithm */ oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "algorithm", "algorithm", NULL)); g_return_val_if_fail (oid, 0); /* RSA keys are stored in the main subjectPublicKey field */ if (oid == OID_RSA_KEY) { /* A bit string so we cannot process in place */ key = egg_asn1x_get_bits_as_raw (egg_asn1x_node (asn, "subjectPublicKey", NULL), NULL, &n_bits); g_return_val_if_fail (key, 0); key_size = calculate_rsa_key_size (key, n_bits / 8); g_free (key); /* The DSA key size is discovered by the prime in params */ } else if (oid == OID_DSA_KEY) { params = egg_asn1x_get_raw_element (egg_asn1x_node (asn, "algorithm", "parameters", NULL), &n_params); key_size = calculate_dsa_params_size (params, n_params); } else { g_message ("unsupported key algorithm in certificate: %s", g_quark_to_string (oid)); } egg_asn1x_destroy (asn); return key_size; }