diff options
Diffstat (limited to 'lib/opencdk/new-packet.c')
-rw-r--r-- | lib/opencdk/new-packet.c | 1112 |
1 files changed, 531 insertions, 581 deletions
diff --git a/lib/opencdk/new-packet.c b/lib/opencdk/new-packet.c index acf2a7606d..7d61c2c415 100644 --- a/lib/opencdk/new-packet.c +++ b/lib/opencdk/new-packet.c @@ -32,13 +32,11 @@ /* Release an array of MPI values. */ -void -_cdk_free_mpibuf (size_t n, bigint_t * array) +void _cdk_free_mpibuf(size_t n, bigint_t * array) { - while (n--) - { - _gnutls_mpi_release (&array[n]); - } + while (n--) { + _gnutls_mpi_release(&array[n]); + } } @@ -48,201 +46,189 @@ _cdk_free_mpibuf (size_t n, bigint_t * array) * * Allocate a new packet. **/ -cdk_error_t -cdk_pkt_new (cdk_packet_t * r_pkt) +cdk_error_t cdk_pkt_new(cdk_packet_t * r_pkt) { - cdk_packet_t pkt; - - if (!r_pkt) - return CDK_Inv_Value; - pkt = cdk_calloc (1, sizeof *pkt); - if (!pkt) - return CDK_Out_Of_Core; - *r_pkt = pkt; - return 0; + cdk_packet_t pkt; + + if (!r_pkt) + return CDK_Inv_Value; + pkt = cdk_calloc(1, sizeof *pkt); + if (!pkt) + return CDK_Out_Of_Core; + *r_pkt = pkt; + return 0; } -static void -free_pubkey_enc (cdk_pkt_pubkey_enc_t enc) +static void free_pubkey_enc(cdk_pkt_pubkey_enc_t enc) { - size_t nenc; + size_t nenc; - if (!enc) - return; + if (!enc) + return; - nenc = cdk_pk_get_nenc (enc->pubkey_algo); - _cdk_free_mpibuf (nenc, enc->mpi); - cdk_free (enc); + nenc = cdk_pk_get_nenc(enc->pubkey_algo); + _cdk_free_mpibuf(nenc, enc->mpi); + cdk_free(enc); } -static void -free_literal (cdk_pkt_literal_t pt) +static void free_literal(cdk_pkt_literal_t pt) { - if (!pt) - return; - /* The buffer which is referenced in this packet is closed - elsewhere. To close it here would cause a double close. */ - cdk_free (pt); + if (!pt) + return; + /* The buffer which is referenced in this packet is closed + elsewhere. To close it here would cause a double close. */ + cdk_free(pt); } -void -_cdk_free_userid (cdk_pkt_userid_t uid) +void _cdk_free_userid(cdk_pkt_userid_t uid) { - if (!uid) - return; - - cdk_free (uid->prefs); - uid->prefs = NULL; - cdk_free (uid->attrib_img); - uid->attrib_img = NULL; - cdk_free (uid); + if (!uid) + return; + + cdk_free(uid->prefs); + uid->prefs = NULL; + cdk_free(uid->attrib_img); + uid->attrib_img = NULL; + cdk_free(uid); } -void -_cdk_free_signature (cdk_pkt_signature_t sig) +void _cdk_free_signature(cdk_pkt_signature_t sig) { - cdk_desig_revoker_t r; - size_t nsig; - - if (!sig) - return; - - nsig = cdk_pk_get_nsig (sig->pubkey_algo); - _cdk_free_mpibuf (nsig, sig->mpi); - - cdk_subpkt_free (sig->hashed); - sig->hashed = NULL; - cdk_subpkt_free (sig->unhashed); - sig->unhashed = NULL; - while (sig->revkeys) - { - r = sig->revkeys->next; - cdk_free (sig->revkeys); - sig->revkeys = r; - } - cdk_free (sig); + cdk_desig_revoker_t r; + size_t nsig; + + if (!sig) + return; + + nsig = cdk_pk_get_nsig(sig->pubkey_algo); + _cdk_free_mpibuf(nsig, sig->mpi); + + cdk_subpkt_free(sig->hashed); + sig->hashed = NULL; + cdk_subpkt_free(sig->unhashed); + sig->unhashed = NULL; + while (sig->revkeys) { + r = sig->revkeys->next; + cdk_free(sig->revkeys); + sig->revkeys = r; + } + cdk_free(sig); } -void -cdk_pk_release (cdk_pubkey_t pk) +void cdk_pk_release(cdk_pubkey_t pk) { - size_t npkey; - - if (!pk) - return; - - npkey = cdk_pk_get_npkey (pk->pubkey_algo); - _cdk_free_userid (pk->uid); - pk->uid = NULL; - cdk_free (pk->prefs); - pk->prefs = NULL; - _cdk_free_mpibuf (npkey, pk->mpi); - cdk_free (pk); + size_t npkey; + + if (!pk) + return; + + npkey = cdk_pk_get_npkey(pk->pubkey_algo); + _cdk_free_userid(pk->uid); + pk->uid = NULL; + cdk_free(pk->prefs); + pk->prefs = NULL; + _cdk_free_mpibuf(npkey, pk->mpi); + cdk_free(pk); } -void -cdk_sk_release (cdk_seckey_t sk) +void cdk_sk_release(cdk_seckey_t sk) { - size_t nskey; - - if (!sk) - return; - - nskey = cdk_pk_get_nskey (sk->pubkey_algo); - _cdk_free_mpibuf (nskey, sk->mpi); - cdk_free (sk->encdata); - sk->encdata = NULL; - cdk_pk_release (sk->pk); - sk->pk = NULL; - cdk_s2k_free (sk->protect.s2k); - sk->protect.s2k = NULL; - cdk_free (sk); + size_t nskey; + + if (!sk) + return; + + nskey = cdk_pk_get_nskey(sk->pubkey_algo); + _cdk_free_mpibuf(nskey, sk->mpi); + cdk_free(sk->encdata); + sk->encdata = NULL; + cdk_pk_release(sk->pk); + sk->pk = NULL; + cdk_s2k_free(sk->protect.s2k); + sk->protect.s2k = NULL; + cdk_free(sk); } /* Detach the openpgp packet from the packet structure and release the packet structure itself. */ -void -_cdk_pkt_detach_free (cdk_packet_t pkt, int *r_pkttype, void **ctx) +void _cdk_pkt_detach_free(cdk_packet_t pkt, int *r_pkttype, void **ctx) { - /* For now we just allow this for keys. */ - switch (pkt->pkttype) - { - case CDK_PKT_PUBLIC_KEY: - case CDK_PKT_PUBLIC_SUBKEY: - *ctx = pkt->pkt.public_key; - break; - - case CDK_PKT_SECRET_KEY: - case CDK_PKT_SECRET_SUBKEY: - *ctx = pkt->pkt.secret_key; - break; - - default: - *r_pkttype = 0; - return; - } - - /* The caller might expect a specific packet type and - is not interested to store it for later use. */ - if (r_pkttype) - *r_pkttype = pkt->pkttype; - - cdk_free (pkt); + /* For now we just allow this for keys. */ + switch (pkt->pkttype) { + case CDK_PKT_PUBLIC_KEY: + case CDK_PKT_PUBLIC_SUBKEY: + *ctx = pkt->pkt.public_key; + break; + + case CDK_PKT_SECRET_KEY: + case CDK_PKT_SECRET_SUBKEY: + *ctx = pkt->pkt.secret_key; + break; + + default: + *r_pkttype = 0; + return; + } + + /* The caller might expect a specific packet type and + is not interested to store it for later use. */ + if (r_pkttype) + *r_pkttype = pkt->pkttype; + + cdk_free(pkt); } -void -cdk_pkt_free (cdk_packet_t pkt) +void cdk_pkt_free(cdk_packet_t pkt) { - if (!pkt) - return; - - switch (pkt->pkttype) - { - case CDK_PKT_ATTRIBUTE: - case CDK_PKT_USER_ID: - _cdk_free_userid (pkt->pkt.user_id); - break; - case CDK_PKT_PUBLIC_KEY: - case CDK_PKT_PUBLIC_SUBKEY: - cdk_pk_release (pkt->pkt.public_key); - break; - case CDK_PKT_SECRET_KEY: - case CDK_PKT_SECRET_SUBKEY: - cdk_sk_release (pkt->pkt.secret_key); - break; - case CDK_PKT_SIGNATURE: - _cdk_free_signature (pkt->pkt.signature); - break; - case CDK_PKT_PUBKEY_ENC: - free_pubkey_enc (pkt->pkt.pubkey_enc); - break; - case CDK_PKT_MDC: - cdk_free (pkt->pkt.mdc); - break; - case CDK_PKT_ONEPASS_SIG: - cdk_free (pkt->pkt.onepass_sig); - break; - case CDK_PKT_LITERAL: - free_literal (pkt->pkt.literal); - break; - case CDK_PKT_COMPRESSED: - cdk_free (pkt->pkt.compressed); - break; - default: - break; - } - - /* Reset the packet type to avoid, when cdk_pkt_release() will be - used, that the second cdk_pkt_free() call will double free the data. */ - pkt->pkttype = 0; + if (!pkt) + return; + + switch (pkt->pkttype) { + case CDK_PKT_ATTRIBUTE: + case CDK_PKT_USER_ID: + _cdk_free_userid(pkt->pkt.user_id); + break; + case CDK_PKT_PUBLIC_KEY: + case CDK_PKT_PUBLIC_SUBKEY: + cdk_pk_release(pkt->pkt.public_key); + break; + case CDK_PKT_SECRET_KEY: + case CDK_PKT_SECRET_SUBKEY: + cdk_sk_release(pkt->pkt.secret_key); + break; + case CDK_PKT_SIGNATURE: + _cdk_free_signature(pkt->pkt.signature); + break; + case CDK_PKT_PUBKEY_ENC: + free_pubkey_enc(pkt->pkt.pubkey_enc); + break; + case CDK_PKT_MDC: + cdk_free(pkt->pkt.mdc); + break; + case CDK_PKT_ONEPASS_SIG: + cdk_free(pkt->pkt.onepass_sig); + break; + case CDK_PKT_LITERAL: + free_literal(pkt->pkt.literal); + break; + case CDK_PKT_COMPRESSED: + cdk_free(pkt->pkt.compressed); + break; + default: + break; + } + + /* Reset the packet type to avoid, when cdk_pkt_release() will be + used, that the second cdk_pkt_free() call will double free the data. */ + pkt->pkttype = 0; } @@ -253,13 +239,12 @@ cdk_pkt_free (cdk_packet_t pkt) * Free the contents of the given package and * release the memory of the structure. **/ -void -cdk_pkt_release (cdk_packet_t pkt) +void cdk_pkt_release(cdk_packet_t pkt) { - if (!pkt) - return; - cdk_pkt_free (pkt); - cdk_free (pkt); + if (!pkt) + return; + cdk_pkt_free(pkt); + cdk_free(pkt); } @@ -270,260 +255,253 @@ cdk_pkt_release (cdk_packet_t pkt) * * Allocate a new packet structure with the given packet type. **/ -cdk_error_t -cdk_pkt_alloc (cdk_packet_t * r_pkt, cdk_packet_type_t pkttype) +cdk_error_t cdk_pkt_alloc(cdk_packet_t * r_pkt, cdk_packet_type_t pkttype) { - cdk_packet_t pkt; - int rc; - - if (!r_pkt) - return CDK_Inv_Value; - - rc = cdk_pkt_new (&pkt); - if (rc) - return rc; - - switch (pkttype) - { - case CDK_PKT_USER_ID: - pkt->pkt.user_id = cdk_calloc (1, sizeof pkt->pkt.user_id); - if (!pkt->pkt.user_id) - return CDK_Out_Of_Core; - pkt->pkt.user_id->name = NULL; - break; - - case CDK_PKT_PUBLIC_KEY: - case CDK_PKT_PUBLIC_SUBKEY: - pkt->pkt.public_key = cdk_calloc (1, sizeof *pkt->pkt.public_key); - if (!pkt->pkt.public_key) - return CDK_Out_Of_Core; - break; - - case CDK_PKT_SECRET_KEY: - case CDK_PKT_SECRET_SUBKEY: - pkt->pkt.secret_key = cdk_calloc (1, sizeof *pkt->pkt.secret_key); - pkt->pkt.secret_key->pk = - cdk_calloc (1, sizeof *pkt->pkt.secret_key->pk); - if (!pkt->pkt.secret_key || !pkt->pkt.secret_key->pk) - return CDK_Out_Of_Core; - break; - - case CDK_PKT_SIGNATURE: - pkt->pkt.signature = cdk_calloc (1, sizeof *pkt->pkt.signature); - if (!pkt->pkt.signature) - return CDK_Out_Of_Core; - break; - - case CDK_PKT_PUBKEY_ENC: - pkt->pkt.pubkey_enc = cdk_calloc (1, sizeof *pkt->pkt.pubkey_enc); - if (!pkt->pkt.pubkey_enc) - return CDK_Out_Of_Core; - break; - - case CDK_PKT_MDC: - pkt->pkt.mdc = cdk_calloc (1, sizeof *pkt->pkt.mdc); - if (!pkt->pkt.mdc) - return CDK_Out_Of_Core; - break; - - case CDK_PKT_ONEPASS_SIG: - pkt->pkt.onepass_sig = cdk_calloc (1, sizeof *pkt->pkt.onepass_sig); - if (!pkt->pkt.onepass_sig) - return CDK_Out_Of_Core; - break; - - case CDK_PKT_LITERAL: - /* FIXME: We would need the size of the file name to allocate extra - bytes, otherwise the result would be useless. */ - pkt->pkt.literal = cdk_calloc (1, sizeof *pkt->pkt.literal); - if (!pkt->pkt.literal) - return CDK_Out_Of_Core; - pkt->pkt.literal->name = NULL; - break; - - default: - return CDK_Not_Implemented; - } - pkt->pkttype = pkttype; - *r_pkt = pkt; - return 0; + cdk_packet_t pkt; + int rc; + + if (!r_pkt) + return CDK_Inv_Value; + + rc = cdk_pkt_new(&pkt); + if (rc) + return rc; + + switch (pkttype) { + case CDK_PKT_USER_ID: + pkt->pkt.user_id = cdk_calloc(1, sizeof pkt->pkt.user_id); + if (!pkt->pkt.user_id) + return CDK_Out_Of_Core; + pkt->pkt.user_id->name = NULL; + break; + + case CDK_PKT_PUBLIC_KEY: + case CDK_PKT_PUBLIC_SUBKEY: + pkt->pkt.public_key = + cdk_calloc(1, sizeof *pkt->pkt.public_key); + if (!pkt->pkt.public_key) + return CDK_Out_Of_Core; + break; + + case CDK_PKT_SECRET_KEY: + case CDK_PKT_SECRET_SUBKEY: + pkt->pkt.secret_key = + cdk_calloc(1, sizeof *pkt->pkt.secret_key); + pkt->pkt.secret_key->pk = + cdk_calloc(1, sizeof *pkt->pkt.secret_key->pk); + if (!pkt->pkt.secret_key || !pkt->pkt.secret_key->pk) + return CDK_Out_Of_Core; + break; + + case CDK_PKT_SIGNATURE: + pkt->pkt.signature = + cdk_calloc(1, sizeof *pkt->pkt.signature); + if (!pkt->pkt.signature) + return CDK_Out_Of_Core; + break; + + case CDK_PKT_PUBKEY_ENC: + pkt->pkt.pubkey_enc = + cdk_calloc(1, sizeof *pkt->pkt.pubkey_enc); + if (!pkt->pkt.pubkey_enc) + return CDK_Out_Of_Core; + break; + + case CDK_PKT_MDC: + pkt->pkt.mdc = cdk_calloc(1, sizeof *pkt->pkt.mdc); + if (!pkt->pkt.mdc) + return CDK_Out_Of_Core; + break; + + case CDK_PKT_ONEPASS_SIG: + pkt->pkt.onepass_sig = + cdk_calloc(1, sizeof *pkt->pkt.onepass_sig); + if (!pkt->pkt.onepass_sig) + return CDK_Out_Of_Core; + break; + + case CDK_PKT_LITERAL: + /* FIXME: We would need the size of the file name to allocate extra + bytes, otherwise the result would be useless. */ + pkt->pkt.literal = cdk_calloc(1, sizeof *pkt->pkt.literal); + if (!pkt->pkt.literal) + return CDK_Out_Of_Core; + pkt->pkt.literal->name = NULL; + break; + + default: + return CDK_Not_Implemented; + } + pkt->pkttype = pkttype; + *r_pkt = pkt; + return 0; } -cdk_prefitem_t -_cdk_copy_prefs (const cdk_prefitem_t prefs) +cdk_prefitem_t _cdk_copy_prefs(const cdk_prefitem_t prefs) { - size_t n = 0; - struct cdk_prefitem_s *new_prefs; - - if (!prefs) - return NULL; - - for (n = 0; prefs[n].type; n++) - ; - new_prefs = cdk_calloc (1, sizeof *new_prefs * (n + 1)); - if (!new_prefs) - return NULL; - for (n = 0; prefs[n].type; n++) - { - new_prefs[n].type = prefs[n].type; - new_prefs[n].value = prefs[n].value; - } - new_prefs[n].type = CDK_PREFTYPE_NONE; - new_prefs[n].value = 0; - return new_prefs; + size_t n = 0; + struct cdk_prefitem_s *new_prefs; + + if (!prefs) + return NULL; + + for (n = 0; prefs[n].type; n++); + new_prefs = cdk_calloc(1, sizeof *new_prefs * (n + 1)); + if (!new_prefs) + return NULL; + for (n = 0; prefs[n].type; n++) { + new_prefs[n].type = prefs[n].type; + new_prefs[n].value = prefs[n].value; + } + new_prefs[n].type = CDK_PREFTYPE_NONE; + new_prefs[n].value = 0; + return new_prefs; } -cdk_error_t -_cdk_copy_userid (cdk_pkt_userid_t * dst, cdk_pkt_userid_t src) +cdk_error_t _cdk_copy_userid(cdk_pkt_userid_t * dst, cdk_pkt_userid_t src) { - cdk_pkt_userid_t u; + cdk_pkt_userid_t u; - if (!dst || !src) - return CDK_Inv_Value; + if (!dst || !src) + return CDK_Inv_Value; - *dst = NULL; - u = cdk_calloc (1, sizeof *u + strlen (src->name) + 2); - if (!u) - return CDK_Out_Of_Core; - u->name = (char *) u + sizeof (*u); + *dst = NULL; + u = cdk_calloc(1, sizeof *u + strlen(src->name) + 2); + if (!u) + return CDK_Out_Of_Core; + u->name = (char *) u + sizeof(*u); - memcpy (u, src, sizeof *u); - memcpy (u->name, src->name, strlen (src->name)); - u->prefs = _cdk_copy_prefs (src->prefs); - if (src->selfsig) - _cdk_copy_signature (&u->selfsig, src->selfsig); - *dst = u; + memcpy(u, src, sizeof *u); + memcpy(u->name, src->name, strlen(src->name)); + u->prefs = _cdk_copy_prefs(src->prefs); + if (src->selfsig) + _cdk_copy_signature(&u->selfsig, src->selfsig); + *dst = u; - return 0; + return 0; } -cdk_error_t -_cdk_copy_pubkey (cdk_pkt_pubkey_t * dst, cdk_pkt_pubkey_t src) +cdk_error_t _cdk_copy_pubkey(cdk_pkt_pubkey_t * dst, cdk_pkt_pubkey_t src) { - cdk_pkt_pubkey_t k; - int i; - - if (!dst || !src) - return CDK_Inv_Value; - - *dst = NULL; - k = cdk_calloc (1, sizeof *k); - if (!k) - return CDK_Out_Of_Core; - memcpy (k, src, sizeof *k); - if (src->uid) - _cdk_copy_userid (&k->uid, src->uid); - if (src->prefs) - k->prefs = _cdk_copy_prefs (src->prefs); - for (i = 0; i < cdk_pk_get_npkey (src->pubkey_algo); i++) - k->mpi[i] = _gnutls_mpi_copy (src->mpi[i]); - *dst = k; - - return 0; + cdk_pkt_pubkey_t k; + int i; + + if (!dst || !src) + return CDK_Inv_Value; + + *dst = NULL; + k = cdk_calloc(1, sizeof *k); + if (!k) + return CDK_Out_Of_Core; + memcpy(k, src, sizeof *k); + if (src->uid) + _cdk_copy_userid(&k->uid, src->uid); + if (src->prefs) + k->prefs = _cdk_copy_prefs(src->prefs); + for (i = 0; i < cdk_pk_get_npkey(src->pubkey_algo); i++) + k->mpi[i] = _gnutls_mpi_copy(src->mpi[i]); + *dst = k; + + return 0; } -cdk_error_t -_cdk_copy_seckey (cdk_pkt_seckey_t * dst, cdk_pkt_seckey_t src) +cdk_error_t _cdk_copy_seckey(cdk_pkt_seckey_t * dst, cdk_pkt_seckey_t src) { - cdk_pkt_seckey_t k; - int i; - - if (!dst || !src) - return CDK_Inv_Value; - - *dst = NULL; - k = cdk_calloc (1, sizeof *k); - if (!k) - return CDK_Out_Of_Core; - memcpy (k, src, sizeof *k); - _cdk_copy_pubkey (&k->pk, src->pk); - - if (src->encdata) - { - k->encdata = cdk_calloc (1, src->enclen + 1); - if (!k->encdata) - return CDK_Out_Of_Core; - memcpy (k->encdata, src->encdata, src->enclen); - } - - _cdk_s2k_copy (&k->protect.s2k, src->protect.s2k); - for (i = 0; i < cdk_pk_get_nskey (src->pubkey_algo); i++) - { - k->mpi[i] = _gnutls_mpi_copy (src->mpi[i]); - } - - *dst = k; - return 0; + cdk_pkt_seckey_t k; + int i; + + if (!dst || !src) + return CDK_Inv_Value; + + *dst = NULL; + k = cdk_calloc(1, sizeof *k); + if (!k) + return CDK_Out_Of_Core; + memcpy(k, src, sizeof *k); + _cdk_copy_pubkey(&k->pk, src->pk); + + if (src->encdata) { + k->encdata = cdk_calloc(1, src->enclen + 1); + if (!k->encdata) + return CDK_Out_Of_Core; + memcpy(k->encdata, src->encdata, src->enclen); + } + + _cdk_s2k_copy(&k->protect.s2k, src->protect.s2k); + for (i = 0; i < cdk_pk_get_nskey(src->pubkey_algo); i++) { + k->mpi[i] = _gnutls_mpi_copy(src->mpi[i]); + } + + *dst = k; + return 0; } -cdk_error_t -_cdk_copy_pk_to_sk (cdk_pkt_pubkey_t pk, cdk_pkt_seckey_t sk) +cdk_error_t _cdk_copy_pk_to_sk(cdk_pkt_pubkey_t pk, cdk_pkt_seckey_t sk) { - if (!pk || !sk) - return CDK_Inv_Value; - - sk->version = pk->version; - sk->expiredate = pk->expiredate; - sk->pubkey_algo = _pgp_pub_algo_to_cdk (pk->pubkey_algo); - sk->has_expired = pk->has_expired; - sk->is_revoked = pk->is_revoked; - sk->main_keyid[0] = pk->main_keyid[0]; - sk->main_keyid[1] = pk->main_keyid[1]; - sk->keyid[0] = pk->keyid[0]; - sk->keyid[1] = pk->keyid[1]; - - return 0; + if (!pk || !sk) + return CDK_Inv_Value; + + sk->version = pk->version; + sk->expiredate = pk->expiredate; + sk->pubkey_algo = _pgp_pub_algo_to_cdk(pk->pubkey_algo); + sk->has_expired = pk->has_expired; + sk->is_revoked = pk->is_revoked; + sk->main_keyid[0] = pk->main_keyid[0]; + sk->main_keyid[1] = pk->main_keyid[1]; + sk->keyid[0] = pk->keyid[0]; + sk->keyid[1] = pk->keyid[1]; + + return 0; } cdk_error_t -_cdk_copy_signature (cdk_pkt_signature_t * dst, cdk_pkt_signature_t src) +_cdk_copy_signature(cdk_pkt_signature_t * dst, cdk_pkt_signature_t src) { - cdk_pkt_signature_t s; - - if (!dst || !src) - return CDK_Inv_Value; - - *dst = NULL; - s = cdk_calloc (1, sizeof *s); - if (!s) - return CDK_Out_Of_Core; - memcpy (s, src, sizeof *src); - _cdk_subpkt_copy (&s->hashed, src->hashed); - _cdk_subpkt_copy (&s->unhashed, src->unhashed); - /* FIXME: Copy MPI parts */ - *dst = s; - - return 0; + cdk_pkt_signature_t s; + + if (!dst || !src) + return CDK_Inv_Value; + + *dst = NULL; + s = cdk_calloc(1, sizeof *s); + if (!s) + return CDK_Out_Of_Core; + memcpy(s, src, sizeof *src); + _cdk_subpkt_copy(&s->hashed, src->hashed); + _cdk_subpkt_copy(&s->unhashed, src->unhashed); + /* FIXME: Copy MPI parts */ + *dst = s; + + return 0; } -cdk_error_t -_cdk_pubkey_compare (cdk_pkt_pubkey_t a, cdk_pkt_pubkey_t b) +cdk_error_t _cdk_pubkey_compare(cdk_pkt_pubkey_t a, cdk_pkt_pubkey_t b) { - int na, nb, i; - - if (a->timestamp != b->timestamp || a->pubkey_algo != b->pubkey_algo) - return -1; - if (a->version < 4 && a->expiredate != b->expiredate) - return -1; - na = cdk_pk_get_npkey (a->pubkey_algo); - nb = cdk_pk_get_npkey (b->pubkey_algo); - if (na != nb) - return -1; - - for (i = 0; i < na; i++) - { - if (_gnutls_mpi_cmp (a->mpi[i], b->mpi[i])) - return -1; - } - - return 0; + int na, nb, i; + + if (a->timestamp != b->timestamp + || a->pubkey_algo != b->pubkey_algo) + return -1; + if (a->version < 4 && a->expiredate != b->expiredate) + return -1; + na = cdk_pk_get_npkey(a->pubkey_algo); + nb = cdk_pk_get_npkey(b->pubkey_algo); + if (na != nb) + return -1; + + for (i = 0; i < na; i++) { + if (_gnutls_mpi_cmp(a->mpi[i], b->mpi[i])) + return -1; + } + + return 0; } @@ -533,17 +511,15 @@ _cdk_pubkey_compare (cdk_pkt_pubkey_t a, cdk_pkt_pubkey_t b) * * Release the context. **/ -void -cdk_subpkt_free (cdk_subpkt_t ctx) +void cdk_subpkt_free(cdk_subpkt_t ctx) { - cdk_subpkt_t s; - - while (ctx) - { - s = ctx->next; - cdk_free (ctx); - ctx = s; - } + cdk_subpkt_t s; + + while (ctx) { + s = ctx->next; + cdk_free(ctx); + ctx = s; + } } @@ -555,10 +531,9 @@ cdk_subpkt_free (cdk_subpkt_t ctx) * Find the given packet type in the node. If no packet with this * type was found, return null otherwise pointer to the node. **/ -cdk_subpkt_t -cdk_subpkt_find (cdk_subpkt_t ctx, size_t type) +cdk_subpkt_t cdk_subpkt_find(cdk_subpkt_t ctx, size_t type) { - return cdk_subpkt_find_nth (ctx, type, 0); + return cdk_subpkt_find_nth(ctx, type, 0); } /** @@ -568,20 +543,18 @@ cdk_subpkt_find (cdk_subpkt_t ctx, size_t type) * * Return the amount of sub packets with this type. **/ -size_t -cdk_subpkt_type_count (cdk_subpkt_t ctx, size_t type) +size_t cdk_subpkt_type_count(cdk_subpkt_t ctx, size_t type) { - cdk_subpkt_t s; - size_t count; + cdk_subpkt_t s; + size_t count; - count = 0; - for (s = ctx; s; s = s->next) - { - if (s->type == type) - count++; - } + count = 0; + for (s = ctx; s; s = s->next) { + if (s->type == type) + count++; + } - return count; + return count; } @@ -593,20 +566,18 @@ cdk_subpkt_type_count (cdk_subpkt_t ctx, size_t type) * * Return the nth sub packet of the given type. **/ -cdk_subpkt_t -cdk_subpkt_find_nth (cdk_subpkt_t ctx, size_t type, size_t idx) +cdk_subpkt_t cdk_subpkt_find_nth(cdk_subpkt_t ctx, size_t type, size_t idx) { - cdk_subpkt_t s; - size_t pos; + cdk_subpkt_t s; + size_t pos; - pos = 0; - for (s = ctx; s; s = s->next) - { - if (s->type == type && pos++ == idx) - return s; - } + pos = 0; + for (s = ctx; s; s = s->next) { + if (s->type == type && pos++ == idx) + return s; + } - return NULL; + return NULL; } @@ -616,19 +587,18 @@ cdk_subpkt_find_nth (cdk_subpkt_t ctx, size_t type, size_t idx) * * Create a new sub packet node with the size of @size. **/ -cdk_subpkt_t -cdk_subpkt_new (size_t size) +cdk_subpkt_t cdk_subpkt_new(size_t size) { - cdk_subpkt_t s; + cdk_subpkt_t s; - if (!size) - return NULL; - s = cdk_calloc (1, sizeof *s + size + 2); - if (!s) - return NULL; - s->d = (byte*)s + sizeof (*s); + if (!size) + return NULL; + s = cdk_calloc(1, sizeof *s + size + 2); + if (!s) + return NULL; + s->d = (byte *) s + sizeof(*s); - return s; + return s; } @@ -641,15 +611,15 @@ cdk_subpkt_new (size_t size) * Extract the data from the given sub packet. The type is returned * in @r_type and the size in @r_nbytes. **/ -const byte * -cdk_subpkt_get_data (cdk_subpkt_t ctx, size_t * r_type, size_t * r_nbytes) +const byte *cdk_subpkt_get_data(cdk_subpkt_t ctx, size_t * r_type, + size_t * r_nbytes) { - if (!ctx || !r_nbytes) - return NULL; - if (r_type) - *r_type = ctx->type; - *r_nbytes = ctx->size; - return ctx->d; + if (!ctx || !r_nbytes) + return NULL; + if (r_type) + *r_type = ctx->type; + *r_nbytes = ctx->size; + return ctx->d; } @@ -660,111 +630,98 @@ cdk_subpkt_get_data (cdk_subpkt_t ctx, size_t * r_type, size_t * r_nbytes) * * Add the node in @node to the root node @root. **/ -cdk_error_t -cdk_subpkt_add (cdk_subpkt_t root, cdk_subpkt_t node) +cdk_error_t cdk_subpkt_add(cdk_subpkt_t root, cdk_subpkt_t node) { - cdk_subpkt_t n1; - - if (!root) - return CDK_Inv_Value; - for (n1 = root; n1->next; n1 = n1->next) - ; - n1->next = node; - return 0; + cdk_subpkt_t n1; + + if (!root) + return CDK_Inv_Value; + for (n1 = root; n1->next; n1 = n1->next); + n1->next = node; + return 0; } -byte * -_cdk_subpkt_get_array (cdk_subpkt_t s, int count, size_t * r_nbytes) +byte *_cdk_subpkt_get_array(cdk_subpkt_t s, int count, size_t * r_nbytes) { - cdk_subpkt_t list; - byte *buf; - size_t n, nbytes; - - if (!s) - { - if (r_nbytes) - *r_nbytes = 0; - return NULL; - } - - for (n = 0, list = s; list; list = list->next) - { - n++; /* type */ - n += list->size; - if (list->size < 192) - n++; - else if (list->size < 8384) - n += 2; - else - n += 5; - } - buf = cdk_calloc (1, n + 1); - if (!buf) - return NULL; - - n = 0; - for (list = s; list; list = list->next) - { - nbytes = 1 + list->size; /* type */ - if (nbytes < 192) - buf[n++] = nbytes; - else if (nbytes < 8384) - { - nbytes -= 192; - buf[n++] = nbytes / 256 + 192; - buf[n++] = nbytes & 0xff; - } - else - { - buf[n++] = 0xFF; - buf[n++] = nbytes >> 24; - buf[n++] = nbytes >> 16; - buf[n++] = nbytes >> 8; - buf[n++] = nbytes; - } - - buf[n++] = list->type; - memcpy (buf + n, list->d, list->size); - n += list->size; - } - - if (count) - { - cdk_free (buf); - buf = NULL; - } - if (r_nbytes) - *r_nbytes = n; - return buf; + cdk_subpkt_t list; + byte *buf; + size_t n, nbytes; + + if (!s) { + if (r_nbytes) + *r_nbytes = 0; + return NULL; + } + + for (n = 0, list = s; list; list = list->next) { + n++; /* type */ + n += list->size; + if (list->size < 192) + n++; + else if (list->size < 8384) + n += 2; + else + n += 5; + } + buf = cdk_calloc(1, n + 1); + if (!buf) + return NULL; + + n = 0; + for (list = s; list; list = list->next) { + nbytes = 1 + list->size; /* type */ + if (nbytes < 192) + buf[n++] = nbytes; + else if (nbytes < 8384) { + nbytes -= 192; + buf[n++] = nbytes / 256 + 192; + buf[n++] = nbytes & 0xff; + } else { + buf[n++] = 0xFF; + buf[n++] = nbytes >> 24; + buf[n++] = nbytes >> 16; + buf[n++] = nbytes >> 8; + buf[n++] = nbytes; + } + + buf[n++] = list->type; + memcpy(buf + n, list->d, list->size); + n += list->size; + } + + if (count) { + cdk_free(buf); + buf = NULL; + } + if (r_nbytes) + *r_nbytes = n; + return buf; } -cdk_error_t -_cdk_subpkt_copy (cdk_subpkt_t * r_dst, cdk_subpkt_t src) +cdk_error_t _cdk_subpkt_copy(cdk_subpkt_t * r_dst, cdk_subpkt_t src) { - cdk_subpkt_t root, p, node; - - if (!src || !r_dst) - return CDK_Inv_Value; - - root = NULL; - for (p = src; p; p = p->next) - { - node = cdk_subpkt_new (p->size); - if (node) - { - memcpy (node->d, p->d, p->size); - node->type = p->type; - node->size = p->size; - } - if (!root) - root = node; - else - cdk_subpkt_add (root, node); - } - *r_dst = root; - return 0; + cdk_subpkt_t root, p, node; + + if (!src || !r_dst) + return CDK_Inv_Value; + + root = NULL; + for (p = src; p; p = p->next) { + node = cdk_subpkt_new(p->size); + if (node) { + memcpy(node->d, p->d, p->size); + node->type = p->type; + node->size = p->size; + } + if (!root) + root = node; + else + cdk_subpkt_add(root, node); + } + *r_dst = root; + return 0; } @@ -778,43 +735,38 @@ _cdk_subpkt_copy (cdk_subpkt_t * r_dst, cdk_subpkt_t src) * Set the packet data of the given root and set the type of it. **/ void -cdk_subpkt_init (cdk_subpkt_t node, size_t type, - const void *buf, size_t buflen) +cdk_subpkt_init(cdk_subpkt_t node, size_t type, + const void *buf, size_t buflen) { - if (!node) - return; - node->type = type; - node->size = buflen; - memcpy (node->d, buf, buflen); + if (!node) + return; + node->type = type; + node->size = buflen; + memcpy(node->d, buf, buflen); } /* FIXME: We need to think of a public interface for it. */ -const byte * -cdk_key_desig_revoker_walk (cdk_desig_revoker_t root, - cdk_desig_revoker_t * ctx, - int *r_class, int *r_algid) +const byte *cdk_key_desig_revoker_walk(cdk_desig_revoker_t root, + cdk_desig_revoker_t * ctx, + int *r_class, int *r_algid) { - cdk_desig_revoker_t n; - - if (!*ctx) - { - *ctx = root; - n = root; - } - else - { - n = (*ctx)->next; - *ctx = n; - } - - if (n && r_class && r_algid) - { - *r_class = n->r_class; - *r_algid = n->algid; - } - - return n ? n->fpr : NULL; + cdk_desig_revoker_t n; + + if (!*ctx) { + *ctx = root; + n = root; + } else { + n = (*ctx)->next; + *ctx = n; + } + + if (n && r_class && r_algid) { + *r_class = n->r_class; + *r_algid = n->algid; + } + + return n ? n->fpr : NULL; } @@ -826,18 +778,16 @@ cdk_key_desig_revoker_walk (cdk_desig_revoker_t root, * Try to find the next node after @root with type. * If type is 0, the next node will be returned. **/ -cdk_subpkt_t -cdk_subpkt_find_next (cdk_subpkt_t root, size_t type) +cdk_subpkt_t cdk_subpkt_find_next(cdk_subpkt_t root, size_t type) { - cdk_subpkt_t node; + cdk_subpkt_t node; - for (node = root->next; node; node = node->next) - { - if (!type) - return node; - else if (node->type == type) - return node; - } + for (node = root->next; node; node = node->next) { + if (!type) + return node; + else if (node->type == type) + return node; + } - return NULL; + return NULL; } |