/* Return the key ID from the given packet. If this is not possible, 0 is returned */ u32 _cdk_pkt_get_keyid (cdk_packet_t pkt, u32 * keyid) { u32 lowbits; if (!pkt) return 0; switch (pkt->pkttype) { case CDK_PKT_PUBLIC_KEY: case CDK_PKT_PUBLIC_SUBKEY: lowbits = cdk_pk_get_keyid (pkt->pkt.public_key, keyid); break; case CDK_PKT_SECRET_KEY: case CDK_PKT_SECRET_SUBKEY: lowbits = cdk_sk_get_keyid (pkt->pkt.secret_key, keyid); break; case CDK_PKT_SIGNATURE: lowbits = cdk_sig_get_keyid (pkt->pkt.signature, keyid); break; default: lowbits = 0; break; } return lowbits; }
static int xml_add_sig (gnutls_string * xmlkey, int ext, cdk_pkt_signature_t sig) { const char *algo, *s; char tmp[32], keyid[16]; unsigned int kid[2]; int rc = 0; if (!xmlkey || !sig) { gnutls_assert (); return GNUTLS_E_INVALID_REQUEST; } s = " <SIGNATURE>\n"; _gnutls_string_append_str (xmlkey, s); sprintf (tmp, "%d", sig->version); rc = xml_add_tag (xmlkey, "VERSION", tmp); if (rc) return rc; if (ext) { sprintf (tmp, "%d", sig->sig_class); rc = xml_add_tag (xmlkey, "SIGCLASS", tmp); if (rc) return rc; } sprintf (tmp, "%d", sig->flags.expired); rc = xml_add_tag (xmlkey, "EXPIRED", tmp); if (rc) return rc; if (ext) { switch (sig->pubkey_algo) { case GCRY_PK_DSA: algo = "DSA"; break; case GCRY_PK_ELG: case GCRY_PK_ELG_E: algo = "ELG"; break; case GCRY_PK_RSA: case GCRY_PK_RSA_E: case GCRY_PK_RSA_S: algo = "RSA"; break; default: algo = "???"; /* unknown algorithm */ } rc = xml_add_tag (xmlkey, "PKALGO", algo); if (rc) return rc; switch (sig->digest_algo) { case GCRY_MD_SHA1: algo = "SHA1"; break; case GCRY_MD_RMD160: algo = "RMD160"; break; case GCRY_MD_MD5: algo = "MD5"; break; default: algo = "???"; } rc = xml_add_tag (xmlkey, "MDALGO", algo); if (rc) return rc; } sprintf (tmp, "%lu", sig->timestamp); rc = xml_add_tag (xmlkey, "CREATED", tmp); if (rc) return rc; cdk_sig_get_keyid (sig, kid); snprintf (keyid, 16, "%08lX%08lX", kid[0], kid[1]); rc = xml_add_tag (xmlkey, "KEYID", keyid); if (rc) return rc; s = " </SIGNATURE>\n"; _gnutls_string_append_str (xmlkey, s); return 0; }