|
|
|
@ -1370,8 +1370,22 @@ unsigned pgp_add_directsig(
|
|
|
|
|
pgp_sig_info_t *siginfo)
|
|
|
|
|
{
|
|
|
|
|
pgp_directsig_t *directsigp;
|
|
|
|
|
unsigned directsigidx;
|
|
|
|
|
|
|
|
|
|
/* Detect duplicate direct sig */
|
|
|
|
|
directsigp = key->directsigs;
|
|
|
|
|
|
|
|
|
|
for (directsigidx = 0 ; directsigidx < key->directsigc;
|
|
|
|
|
directsigidx++, directsigp++)
|
|
|
|
|
{
|
|
|
|
|
if( directsigp->packet.length == sigpkt->length &&
|
|
|
|
|
memcmp(directsigp->packet.raw, sigpkt->raw, sigpkt->length) == 0)
|
|
|
|
|
{
|
|
|
|
|
/* signature already exist */
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* TODO detect duplicate sig */
|
|
|
|
|
|
|
|
|
|
EXPAND_ARRAY(key, directsig);
|
|
|
|
|
directsigp = &key->directsigs[key->directsigc++];
|
|
|
|
@ -1389,35 +1403,51 @@ unsigned pgp_update_userid(
|
|
|
|
|
const pgp_subpacket_t *sigpkt,
|
|
|
|
|
pgp_sig_info_t *siginfo)
|
|
|
|
|
{
|
|
|
|
|
unsigned idx = 0;
|
|
|
|
|
unsigned uididx = 0;
|
|
|
|
|
unsigned uidsigidx = 0;
|
|
|
|
|
uint8_t **uidp;
|
|
|
|
|
pgp_uidsig_t *uidsig;
|
|
|
|
|
pgp_uidsig_t *uidsigp;
|
|
|
|
|
|
|
|
|
|
/* Try to find identical userID */
|
|
|
|
|
uidp = key->uids;
|
|
|
|
|
for (idx = 0 ; idx < key->uidc; idx++, uidp++) {
|
|
|
|
|
if (strcmp((char *)*uidp, (char *)userid) == 0) {
|
|
|
|
|
for (uididx = 0 ; uididx < key->uidc; uididx++, uidp++)
|
|
|
|
|
{
|
|
|
|
|
if (strcmp((char *)*uidp, (char *)userid) == 0)
|
|
|
|
|
{
|
|
|
|
|
/* Found one. check for duplicate uidsig */
|
|
|
|
|
uidsigp = key->uidsigs;
|
|
|
|
|
for (uidsigidx = 0 ; uidsigidx < key->uidsigc;
|
|
|
|
|
uidsigidx++, uidsigp++)
|
|
|
|
|
{
|
|
|
|
|
if(uidsigp->uid == uididx &&
|
|
|
|
|
uidsigp->packet.length == sigpkt->length &&
|
|
|
|
|
memcmp(uidsigp->packet.raw, sigpkt->raw,
|
|
|
|
|
sigpkt->length) == 0)
|
|
|
|
|
{
|
|
|
|
|
/* signature already exists */
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Add a new one if none found */
|
|
|
|
|
if(idx==key->uidc){
|
|
|
|
|
if(uididx==key->uidc){
|
|
|
|
|
EXPAND_ARRAY(key, uid);
|
|
|
|
|
uidp = &key->uids[key->uidc++];
|
|
|
|
|
*uidp = NULL;
|
|
|
|
|
pgp_copy_userid(uidp, userid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* TODO detect duplicate sig */
|
|
|
|
|
|
|
|
|
|
/* Add uid sig info, pointing to that uid */
|
|
|
|
|
EXPAND_ARRAY(key, uidsig);
|
|
|
|
|
uidsig = &key->uidsigs[key->uidsigc++];
|
|
|
|
|
uidsig->uid = idx;
|
|
|
|
|
uidsigp = &key->uidsigs[key->uidsigc++];
|
|
|
|
|
uidsigp->uid = uididx;
|
|
|
|
|
|
|
|
|
|
/* store sig info and packet */
|
|
|
|
|
copy_sig_info(&uidsig->siginfo, siginfo);
|
|
|
|
|
pgp_copy_packet(&uidsig->packet, sigpkt);
|
|
|
|
|
copy_sig_info(&uidsigp->siginfo, siginfo);
|
|
|
|
|
pgp_copy_packet(&uidsigp->packet, sigpkt);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
@ -1429,9 +1459,10 @@ unsigned pgp_update_subkey(
|
|
|
|
|
const pgp_subpacket_t *sigpkt,
|
|
|
|
|
pgp_sig_info_t *siginfo)
|
|
|
|
|
{
|
|
|
|
|
unsigned idx = 0;
|
|
|
|
|
unsigned subkeyidx = 0;
|
|
|
|
|
unsigned subkeysigidx = 0;
|
|
|
|
|
pgp_subkey_t *subkeyp;
|
|
|
|
|
pgp_subkeysig_t *subkeysig;
|
|
|
|
|
pgp_subkeysig_t *subkeysigp;
|
|
|
|
|
uint8_t subkeyid[PGP_KEY_ID_SIZE];
|
|
|
|
|
|
|
|
|
|
pgp_keyid(subkeyid, PGP_KEY_ID_SIZE,
|
|
|
|
@ -1441,14 +1472,29 @@ unsigned pgp_update_subkey(
|
|
|
|
|
|
|
|
|
|
/* Try to find identical subkey ID */
|
|
|
|
|
subkeyp = key->subkeys;
|
|
|
|
|
for (idx = 0 ; idx < key->subkeyc; idx++, subkeyp++) {
|
|
|
|
|
if(memcmp(subkeyid, subkeyp->id,
|
|
|
|
|
PGP_KEY_ID_SIZE) == 0 ){
|
|
|
|
|
for (subkeyidx = 0 ; subkeyidx < key->subkeyc; subkeyidx++, subkeyp++)
|
|
|
|
|
{
|
|
|
|
|
if(memcmp(subkeyid, subkeyp->id, PGP_KEY_ID_SIZE) == 0 )
|
|
|
|
|
{
|
|
|
|
|
/* Found same subkey. Detect duplicate sig */
|
|
|
|
|
for (subkeysigidx = 0 ; subkeysigidx < key->subkeysigc;
|
|
|
|
|
subkeysigidx++, subkeysigp++)
|
|
|
|
|
{
|
|
|
|
|
if(subkeysigp->subkey == subkeyidx &&
|
|
|
|
|
subkeysigp->packet.length == sigpkt->length &&
|
|
|
|
|
memcmp(subkeysigp->packet.raw, sigpkt->raw,
|
|
|
|
|
sigpkt->length) == 0)
|
|
|
|
|
{
|
|
|
|
|
/* signature already exists */
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* Add a new one if none found */
|
|
|
|
|
if(idx==key->subkeyc){
|
|
|
|
|
if(subkeyidx==key->subkeyc){
|
|
|
|
|
if(subkeytype == PGP_PTAG_CT_PUBLIC_KEY &&
|
|
|
|
|
key->type != PGP_PTAG_CT_PUBLIC_KEY){
|
|
|
|
|
/* cannot create secret subkey from public */
|
|
|
|
@ -1471,17 +1517,15 @@ unsigned pgp_update_subkey(
|
|
|
|
|
memcpy(subkeyp->id, subkeyid, PGP_KEY_ID_SIZE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* TODO detect duplicate sig */
|
|
|
|
|
|
|
|
|
|
/* Add subkey sig info, pointing to that subkey */
|
|
|
|
|
EXPAND_ARRAY(key, subkeysig);
|
|
|
|
|
subkeysig = &key->subkeysigs[key->subkeysigc++];
|
|
|
|
|
subkeysig->subkey = idx;
|
|
|
|
|
subkeysigp = &key->subkeysigs[key->subkeysigc++];
|
|
|
|
|
subkeysigp->subkey = subkeyidx;
|
|
|
|
|
|
|
|
|
|
/* store sig info and packet */
|
|
|
|
|
copy_sig_info(&subkeysig->siginfo,
|
|
|
|
|
copy_sig_info(&subkeysigp->siginfo,
|
|
|
|
|
siginfo);
|
|
|
|
|
pgp_copy_packet(&subkeysig->packet, sigpkt);
|
|
|
|
|
pgp_copy_packet(&subkeysigp->packet, sigpkt);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|