doc/
2005-06-03 Marcus Brinkmann <marcus@g10code.de> * gpgme.texi (Verify): Add information about new fields in gpgme_signature_t. gpgme/ 2005-06-03 Marcus Brinkmann <marcus@g10code.de> * gpgme.h (struct _gpgme_signature): New members pubkey_algo and hash_algo. * verify.c (parse_valid_sig): Parse pubkey and hash algo numbers. (parse_new_sig): Parse pubkey, hash algo and timestamp for ERRSIG.
This commit is contained in:
parent
e5f1dad76d
commit
fcddcb674e
1
NEWS
1
NEWS
@ -24,6 +24,7 @@ gpgme_set_include_certs CHANGED DEFAULT
|
||||
GPGME_INCLUDE_CERTS_DEFAULT NEW
|
||||
gpgme_recipient_t NEW
|
||||
gpgme_decrypt_result_t EXTENDED: New field recipients.
|
||||
gpgme_verify_result_t EXTENDED: New fields pubkey_algo, hash_algo.
|
||||
GPGME_STATUS_SIG_SUBPACKET NEW
|
||||
GPGME_STATUS_NEED_PASSPHRASE_PIN NEW
|
||||
GPGME_STATUS_SC_OP_FAILURE NEW
|
||||
|
@ -1,5 +1,8 @@
|
||||
2005-06-03 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* gpgme.texi (Verify): Add information about new fields in
|
||||
gpgme_signature_t.
|
||||
|
||||
* gpgme.texi (Decrypt): Add gpgme_recipient_t.
|
||||
|
||||
2005-05-28 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
@ -3861,6 +3861,11 @@ The validity of the signature.
|
||||
@item gpgme_error_t validity_reason
|
||||
If a signature is not valid, this provides a reason why.
|
||||
|
||||
@item gpgme_pubkey_algo_t
|
||||
The public key algorithm used to create this signature.
|
||||
|
||||
@item gpgme_hash_algo_t
|
||||
The hash algorithm used to create this signature.
|
||||
@end table
|
||||
@end deftp
|
||||
|
||||
|
@ -1,5 +1,10 @@
|
||||
2005-06-03 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* gpgme.h (struct _gpgme_signature): New members pubkey_algo and
|
||||
hash_algo.
|
||||
* verify.c (parse_valid_sig): Parse pubkey and hash algo numbers.
|
||||
(parse_new_sig): Parse pubkey, hash algo and timestamp for ERRSIG.
|
||||
|
||||
(_gpgme_decrypt_status_handler): Fix last change.
|
||||
|
||||
* gpgme.h (struct _gpgme_recipient): New structure.
|
||||
|
@ -1247,6 +1247,12 @@ struct _gpgme_signature
|
||||
|
||||
gpgme_validity_t validity;
|
||||
gpgme_error_t validity_reason;
|
||||
|
||||
/* The public key algorithm used to create the signature. */
|
||||
gpgme_pubkey_algo_t pubkey_algo;
|
||||
|
||||
/* The hash algorithm used to create the signature. */
|
||||
gpgme_hash_algo_t hash_algo;
|
||||
};
|
||||
typedef struct _gpgme_signature *gpgme_signature_t;
|
||||
|
||||
|
125
gpgme/verify.c
125
gpgme/verify.c
@ -203,6 +203,7 @@ parse_new_sig (op_data_t opd, gpgme_status_code_t code, char *args)
|
||||
{
|
||||
gpgme_signature_t sig;
|
||||
char *end = strchr (args, ' ');
|
||||
char *tail;
|
||||
|
||||
if (end)
|
||||
{
|
||||
@ -248,39 +249,70 @@ parse_new_sig (op_data_t opd, gpgme_status_code_t code, char *args)
|
||||
break;
|
||||
|
||||
case GPGME_STATUS_ERRSIG:
|
||||
if (end)
|
||||
/* Parse the pubkey algo. */
|
||||
if (!end)
|
||||
goto parse_err_sig_fail;
|
||||
errno = 0;
|
||||
sig->pubkey_algo = strtol (end, &tail, 0);
|
||||
if (errno || end == tail || *tail != ' ')
|
||||
goto parse_err_sig_fail;
|
||||
end = tail;
|
||||
while (*end == ' ')
|
||||
end++;
|
||||
|
||||
/* Parse the hash algo. */
|
||||
if (!*end)
|
||||
goto parse_err_sig_fail;
|
||||
errno = 0;
|
||||
sig->hash_algo = strtol (end, &tail, 0);
|
||||
if (errno || end == tail || *tail != ' ')
|
||||
goto parse_err_sig_fail;
|
||||
end = tail;
|
||||
while (*end == ' ')
|
||||
end++;
|
||||
|
||||
/* Skip the sig class. */
|
||||
end = strchr (end, ' ');
|
||||
if (!end)
|
||||
goto parse_err_sig_fail;
|
||||
while (*end == ' ')
|
||||
end++;
|
||||
|
||||
/* Parse the timestamp. */
|
||||
sig->timestamp = _gpgme_parse_timestamp (end, &tail);
|
||||
if (sig->timestamp == -1 || end == tail || (*tail && *tail != ' '))
|
||||
return gpg_error (GPG_ERR_INV_ENGINE);
|
||||
end = tail;
|
||||
while (*end == ' ')
|
||||
end++;
|
||||
|
||||
/* Parse the return code. */
|
||||
if (end[0] && (!end[1] || end[1] == ' '))
|
||||
{
|
||||
int i = 0;
|
||||
/* The return code is the 6th argument, if it is 9, the
|
||||
problem is a missing key. */
|
||||
while (end && i < 4)
|
||||
switch (end[0])
|
||||
{
|
||||
end = strchr (end, ' ');
|
||||
if (end)
|
||||
end++;
|
||||
i++;
|
||||
}
|
||||
if (end && end[0] && (!end[1] || end[1] == ' '))
|
||||
{
|
||||
switch (end[0])
|
||||
{
|
||||
case '4':
|
||||
sig->status = gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM);
|
||||
break;
|
||||
|
||||
case '9':
|
||||
sig->status = gpg_error (GPG_ERR_NO_PUBKEY);
|
||||
break;
|
||||
|
||||
default:
|
||||
sig->status = gpg_error (GPG_ERR_GENERAL);
|
||||
}
|
||||
case '4':
|
||||
sig->status = gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM);
|
||||
break;
|
||||
|
||||
case '9':
|
||||
sig->status = gpg_error (GPG_ERR_NO_PUBKEY);
|
||||
break;
|
||||
|
||||
default:
|
||||
sig->status = gpg_error (GPG_ERR_GENERAL);
|
||||
}
|
||||
}
|
||||
else
|
||||
sig->status = gpg_error (GPG_ERR_GENERAL);
|
||||
break;
|
||||
goto parse_err_sig_fail;
|
||||
|
||||
goto parse_err_sig_ok;
|
||||
|
||||
parse_err_sig_fail:
|
||||
sig->status = gpg_error (GPG_ERR_GENERAL);
|
||||
parse_err_sig_ok:
|
||||
break;
|
||||
|
||||
default:
|
||||
return gpg_error (GPG_ERR_GENERAL);
|
||||
}
|
||||
@ -299,7 +331,6 @@ static gpgme_error_t
|
||||
parse_valid_sig (gpgme_signature_t sig, char *args)
|
||||
{
|
||||
char *end = strchr (args, ' ');
|
||||
|
||||
if (end)
|
||||
{
|
||||
*end = '\0';
|
||||
@ -316,6 +347,7 @@ parse_valid_sig (gpgme_signature_t sig, char *args)
|
||||
if (!sig->fpr)
|
||||
return gpg_error_from_errno (errno);
|
||||
|
||||
/* Skip the creation date. */
|
||||
end = strchr (end, ' ');
|
||||
if (end)
|
||||
{
|
||||
@ -329,6 +361,43 @@ parse_valid_sig (gpgme_signature_t sig, char *args)
|
||||
sig->exp_timestamp = _gpgme_parse_timestamp (end, &tail);
|
||||
if (sig->exp_timestamp == -1 || end == tail || (*tail && *tail != ' '))
|
||||
return gpg_error (GPG_ERR_INV_ENGINE);
|
||||
end = tail;
|
||||
|
||||
while (*end == ' ')
|
||||
end++;
|
||||
/* Skip the signature version. */
|
||||
end = strchr (end, ' ');
|
||||
if (end)
|
||||
{
|
||||
while (*end == ' ')
|
||||
end++;
|
||||
|
||||
/* Skip the reserved field. */
|
||||
end = strchr (end, ' ');
|
||||
if (end)
|
||||
{
|
||||
/* Parse the pubkey algo. */
|
||||
errno = 0;
|
||||
sig->pubkey_algo = strtol (end, &tail, 0);
|
||||
if (errno || end == tail || *tail != ' ')
|
||||
return gpg_error (GPG_ERR_INV_ENGINE);
|
||||
end = tail;
|
||||
|
||||
while (*end == ' ')
|
||||
end++;
|
||||
|
||||
if (*end)
|
||||
{
|
||||
/* Parse the hash algo. */
|
||||
|
||||
errno = 0;
|
||||
sig->hash_algo = strtol (end, &tail, 0);
|
||||
if (errno || end == tail || *tail != ' ')
|
||||
return gpg_error (GPG_ERR_INV_ENGINE);
|
||||
end = tail;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user