Add more error checks to sig_verify().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@511 7dcaeef0-15fb-0310-b436-a5af3365683c
Этот коммит содержится в:
родитель
a2cce56134
Коммит
55791d1fe6
134
libssh/dh.c
134
libssh/dh.c
@ -872,69 +872,99 @@ static int match(const char *group, const char *object){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sig_verify(SSH_SESSION *session, PUBLIC_KEY *pubkey, SIGNATURE *signature,
|
static int sig_verify(SSH_SESSION *session, PUBLIC_KEY *pubkey,
|
||||||
unsigned char *digest){
|
SIGNATURE *signature, unsigned char *digest) {
|
||||||
#ifdef HAVE_LIBGCRYPT
|
#ifdef HAVE_LIBGCRYPT
|
||||||
gcry_error_t valid=0;
|
gcry_error_t valid = 0;
|
||||||
gcry_sexp_t gcryhash;
|
gcry_sexp_t gcryhash;
|
||||||
#elif defined HAVE_LIBCRYPTO
|
#elif defined HAVE_LIBCRYPTO
|
||||||
int valid=0;
|
int valid = 0;
|
||||||
#endif
|
#endif
|
||||||
unsigned char hash[SHA_DIGEST_LEN+1];
|
unsigned char hash[SHA_DIGEST_LEN + 1] = {0};
|
||||||
sha1(digest,SHA_DIGEST_LEN,hash+1);
|
|
||||||
hash[0]=0;
|
sha1(digest,SHA_DIGEST_LEN, hash + 1);
|
||||||
|
|
||||||
#ifdef DEBUG_CRYPTO
|
#ifdef DEBUG_CRYPTO
|
||||||
ssh_print_hexa("hash to be verified with dsa",hash+1,SHA_DIGEST_LEN);
|
ssh_print_hexa("Hash to be verified with dsa", hash + 1, SHA_DIGEST_LEN);
|
||||||
#endif
|
#endif
|
||||||
switch(pubkey->type){
|
|
||||||
case TYPE_DSS:
|
switch(pubkey->type) {
|
||||||
|
case TYPE_DSS:
|
||||||
#ifdef HAVE_LIBGCRYPT
|
#ifdef HAVE_LIBGCRYPT
|
||||||
gcry_sexp_build(&gcryhash, NULL, "%b", SHA_DIGEST_LEN+1, hash);
|
valid = gcry_sexp_build(&gcryhash, NULL, "%b", SHA_DIGEST_LEN + 1, hash);
|
||||||
valid=gcry_pk_verify(signature->dsa_sign,gcryhash,pubkey->dsa_pub);
|
if (valid != 0) {
|
||||||
gcry_sexp_release(gcryhash);
|
ssh_set_error(session, SSH_FATAL,
|
||||||
if(valid==0)
|
"RSA error: %s", gcry_strerror(valid));
|
||||||
return 0;
|
return -1;
|
||||||
if (gcry_err_code(valid)!=GPG_ERR_BAD_SIGNATURE){
|
}
|
||||||
ssh_set_error(session,SSH_FATAL,"DSA error : %s", gcry_strerror(valid));
|
valid = gcry_pk_verify(signature->dsa_sign, gcryhash, pubkey->dsa_pub);
|
||||||
|
gcry_sexp_release(gcryhash);
|
||||||
|
if (valid == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gcry_err_code(valid) != GPG_ERR_BAD_SIGNATURE) {
|
||||||
|
ssh_set_error(session, SSH_FATAL,
|
||||||
|
"DSA error: %s", gcry_strerror(valid));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
#elif defined HAVE_LIBCRYPTO
|
#elif defined HAVE_LIBCRYPTO
|
||||||
valid=DSA_do_verify(hash+1,SHA_DIGEST_LEN,signature->dsa_sign,
|
valid = DSA_do_verify(hash + 1, SHA_DIGEST_LEN, signature->dsa_sign,
|
||||||
pubkey->dsa_pub);
|
pubkey->dsa_pub);
|
||||||
if(valid==1)
|
if (valid == 1) {
|
||||||
return 0;
|
return 0;
|
||||||
if(valid==-1){
|
}
|
||||||
ssh_set_error(session,SSH_FATAL,"DSA error : %s",ERR_error_string(ERR_get_error(),NULL));
|
|
||||||
|
if (valid == -1) {
|
||||||
|
ssh_set_error(session, SSH_FATAL,
|
||||||
|
"DSA error: %s", ERR_error_string(ERR_get_error(), NULL));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return -1;
|
ssh_set_error(session, SSH_FATAL, "Invalid DSA signature");
|
||||||
}
|
return -1;
|
||||||
ssh_set_error(session,SSH_FATAL,"Invalid DSA signature");
|
|
||||||
return -1;
|
case TYPE_RSA:
|
||||||
case TYPE_RSA:
|
case TYPE_RSA1:
|
||||||
case TYPE_RSA1:
|
|
||||||
#ifdef HAVE_LIBGCRYPT
|
#ifdef HAVE_LIBGCRYPT
|
||||||
gcry_sexp_build(&gcryhash,NULL,"(data(flags pkcs1)(hash sha1 %b))",SHA_DIGEST_LEN,hash+1);
|
valid = gcry_sexp_build(&gcryhash, NULL,
|
||||||
valid=gcry_pk_verify(signature->rsa_sign,gcryhash,pubkey->rsa_pub);
|
"(data(flags pkcs1)(hash sha1 %b))", SHA_DIGEST_LEN, hash + 1);
|
||||||
gcry_sexp_release(gcryhash);
|
if (valid != 0) {
|
||||||
if(valid==0)
|
ssh_set_error(session, SSH_FATAL,
|
||||||
return 0;
|
"RSA error: %s", gcry_strerror(valid));
|
||||||
if(gcry_err_code(valid)!=GPG_ERR_BAD_SIGNATURE){
|
return -1;
|
||||||
ssh_set_error(session,SSH_FATAL,"RSA error : %s",gcry_strerror(valid));
|
}
|
||||||
|
valid = gcry_pk_verify(signature->rsa_sign,gcryhash,pubkey->rsa_pub);
|
||||||
|
gcry_sexp_release(gcryhash);
|
||||||
|
if (valid == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (gcry_err_code(valid) != GPG_ERR_BAD_SIGNATURE) {
|
||||||
|
ssh_set_error(session, SSH_FATAL,
|
||||||
|
"RSA error: %s", gcry_strerror(valid));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
#elif defined HAVE_LIBCRYPTO
|
#elif defined HAVE_LIBCRYPTO
|
||||||
valid=RSA_verify(NID_sha1,hash+1,SHA_DIGEST_LEN,
|
valid = RSA_verify(NID_sha1, hash + 1, SHA_DIGEST_LEN,
|
||||||
signature->rsa_sign->string,string_len(signature->rsa_sign),pubkey->rsa_pub);
|
signature->rsa_sign->string, string_len(signature->rsa_sign),
|
||||||
if(valid==1)
|
pubkey->rsa_pub);
|
||||||
return 0;
|
if (valid == 1) {
|
||||||
if(valid==-1){
|
return 0;
|
||||||
ssh_set_error(session,SSH_FATAL,"RSA error : %s",ERR_error_string(ERR_get_error(),NULL));
|
}
|
||||||
|
if (valid == -1) {
|
||||||
|
ssh_set_error(session, SSH_FATAL,
|
||||||
|
"RSA error: %s", ERR_error_string(ERR_get_error(), NULL));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return -1;
|
ssh_set_error(session, SSH_FATAL, "Invalid RSA signature");
|
||||||
}
|
return -1;
|
||||||
ssh_set_error(session,SSH_FATAL,"Invalid RSA signature");
|
default:
|
||||||
return -1;
|
ssh_set_error(session, SSH_FATAL, "Unknown public key type");
|
||||||
default:
|
return -1;
|
||||||
ssh_set_error(session,SSH_FATAL,"Unknown public key type");
|
}
|
||||||
return -1;
|
|
||||||
}
|
return -1;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int signature_verify(SSH_SESSION *session,STRING *signature){
|
int signature_verify(SSH_SESSION *session,STRING *signature){
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user