definition of separate passphrases per signkey is now possible

setsignkey now takes an optional second parameter for the passphrase
setpassphrase was removed
This commit is contained in:
Thilo Raufeisen 2005-10-24 20:40:55 +00:00
parent d927552662
commit 012e445989
2 changed files with 34 additions and 38 deletions

69
gnupg.c
View file

@ -79,8 +79,9 @@ static void gnupg_free_resource_ptr(gnupg_object *intern TSRMLS_DC){
gpgme_release (intern->ctx); gpgme_release (intern->ctx);
intern->ctx = NULL; intern->ctx = NULL;
} }
zval_dtor(&intern->passphrase);
gnupg_free_encryptkeys(intern); gnupg_free_encryptkeys(intern);
zend_hash_destroy(intern->signkeys);
FREE_HASHTABLE(intern->signkeys);
efree(intern); efree(intern);
} }
} }
@ -143,6 +144,8 @@ zend_object_value gnupg_objects_new(zend_class_entry *class_type TSRMLS_DC){
gnupg_ptr->encryptkeys = NULL; gnupg_ptr->encryptkeys = NULL;
gnupg_ptr->encrypt_size= 0; gnupg_ptr->encrypt_size= 0;
gnupg_ptr->signmode = GPGME_SIG_MODE_CLEAR; gnupg_ptr->signmode = GPGME_SIG_MODE_CLEAR;
ALLOC_HASHTABLE(gnupg_ptr->signkeys);
zend_hash_init(gnupg_ptr->signkeys, 0, NULL, NULL, 0);
intern->gnupg_ptr = gnupg_ptr; intern->gnupg_ptr = gnupg_ptr;
return retval; return retval;
@ -154,7 +157,6 @@ static zend_function_entry gnupg_methods[] = {
ZEND_ME(gnupg, keyinfo, NULL, ZEND_ACC_PUBLIC) ZEND_ME(gnupg, keyinfo, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, verify, NULL, ZEND_ACC_PUBLIC) ZEND_ME(gnupg, verify, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, geterror, NULL, ZEND_ACC_PUBLIC) ZEND_ME(gnupg, geterror, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, setpassphrase, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, clearsignkeys, NULL, ZEND_ACC_PUBLIC) ZEND_ME(gnupg, clearsignkeys, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, clearencryptkeys, NULL, ZEND_ACC_PUBLIC) ZEND_ME(gnupg, clearencryptkeys, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, setarmor, NULL, ZEND_ACC_PUBLIC) ZEND_ME(gnupg, setarmor, NULL, ZEND_ACC_PUBLIC)
@ -175,7 +177,6 @@ static zend_function_entry gnupg_methods[] = {
static zend_function_entry gnupg_functions[] = { static zend_function_entry gnupg_functions[] = {
PHP_FE(gnupg_init, NULL) PHP_FE(gnupg_init, NULL)
PHP_FE(gnupg_keyinfo, NULL) PHP_FE(gnupg_keyinfo, NULL)
PHP_FE(gnupg_setpassphrase, NULL)
PHP_FE(gnupg_sign, NULL) PHP_FE(gnupg_sign, NULL)
PHP_FE(gnupg_verify, NULL) PHP_FE(gnupg_verify, NULL)
PHP_FE(gnupg_clearsignkeys, NULL) PHP_FE(gnupg_clearsignkeys, NULL)
@ -322,18 +323,29 @@ PHP_MINFO_FUNCTION(gnupg)
/* {{{ callback func for setting the passphrase /* {{{ callback func for setting the passphrase
*/ */
gpgme_error_t passphrase_cb (gnupg_object *intern, const char *uid_hint, const char *passphrase_info,int last_was_bad, int fd){ gpgme_error_t passphrase_cb (gnupg_object *intern, const char *uid_hint, const char *passphrase_info,int last_was_bad, int fd){
char uid[16];
int idx;
char *passphrase;
if(last_was_bad){ if(last_was_bad){
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Incorrent passphrase"); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Incorrent passphrase");
return 1; return 1;
} }
if(Z_STRLEN(intern->passphrase) < 1){ for(idx=0;idx<16;idx++){
php_error_docref(NULL TSRMLS_CC, E_WARNING, "no passphrase set"); uid[idx] = uid_hint[idx];
}
uid[16] = '\0';
if(zend_hash_find(intern->signkeys,(char *) uid,17,(void **) &passphrase)==FAILURE){
php_error_docref(NULL TSRMLS_CC, E_WARNING, "no passphrase set 1");
return 1; return 1;
} }
write (fd, Z_STRVAL(intern->passphrase), Z_STRLEN(intern->passphrase)); if(!passphrase){
php_error_docref(NULL TSRMLS_CC, E_WARNING, "no passphrase set 2");
return 1;
}
write (fd, passphrase, strlen(passphrase));
write (fd, "\n", 1); write (fd, "\n", 1);
return 0; return 0;
} }
/* }}} */ /* }}} */
@ -417,32 +429,6 @@ PHP_FUNCTION(gnupg_setsignmode){
} }
/* }}} */ /* }}} */
/* {{{ proto bool gnupg_setpassphrase(string passphrase)
* sets the passphrase for all next operations
*/
PHP_FUNCTION(gnupg_setpassphrase){
zval *tmp;
zval *res;
GNUPG_GETOBJ();
if(this){
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &tmp) == FAILURE){
return;
}
}else{
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz", &res, &tmp) == FAILURE){
return;
}
ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg);
}
intern->passphrase = *tmp;
zval_copy_ctor(&intern->passphrase);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto string gnupg_geterror(void) /* {{{ proto string gnupg_geterror(void)
* returns the last errormessage * returns the last errormessage
*/ */
@ -581,19 +567,21 @@ PHP_FUNCTION(gnupg_keyinfo)
PHP_FUNCTION(gnupg_addsignkey){ PHP_FUNCTION(gnupg_addsignkey){
char *key_id = NULL; char *key_id = NULL;
int key_id_len; int key_id_len;
char *passphrase = NULL;
int passphrase_len;
zval *res; zval *res;
gpgme_sign_result_t result;
gpgme_key_t gpgme_key; gpgme_key_t gpgme_key;
gpgme_subkey_t gpgme_subkey;
GNUPG_GETOBJ(); GNUPG_GETOBJ();
if(this){ if(this){
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &key_id, &key_id_len) == FAILURE){ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &key_id, &key_id_len, &passphrase, &passphrase_len) == FAILURE){
return; return;
} }
}else{ }else{
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &key_id, &key_id_len) == FAILURE){ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s", &res, &key_id, &key_id_len, &passphrase, &passphrase_len) == FAILURE){
return; return;
} }
ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg);
@ -601,6 +589,15 @@ PHP_FUNCTION(gnupg_addsignkey){
if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1)) != GPG_ERR_NO_ERROR){ if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1)) != GPG_ERR_NO_ERROR){
GNUPG_ERR("get_key failed"); GNUPG_ERR("get_key failed");
} }
if(passphrase){
gpgme_subkey = gpgme_key->subkeys;
while(gpgme_subkey){
if(gpgme_subkey->can_sign == 1){
zend_hash_add(intern->signkeys, (char *) gpgme_subkey->keyid, (uint) strlen(gpgme_subkey->keyid)+1, passphrase, (uint) passphrase_len+1, NULL);
}
gpgme_subkey = gpgme_subkey->next;
}
}
if((intern->err = gpgme_signers_add(intern->ctx, gpgme_key))!=GPG_ERR_NO_ERROR){ if((intern->err = gpgme_signers_add(intern->ctx, gpgme_key))!=GPG_ERR_NO_ERROR){
GNUPG_ERR("could not add signer"); GNUPG_ERR("could not add signer");
} }

View file

@ -38,12 +38,12 @@ extern zend_module_entry gnupg_module_entry;
typedef struct _gnupg_object{ typedef struct _gnupg_object{
gpgme_ctx_t ctx; gpgme_ctx_t ctx;
zval passphrase;
gpgme_error_t err; gpgme_error_t err;
char* errortxt; char* errortxt;
int signmode; int signmode;
gpgme_key_t *encryptkeys; gpgme_key_t *encryptkeys;
unsigned int encrypt_size; unsigned int encrypt_size;
HashTable *signkeys;
} gnupg_object; } gnupg_object;
typedef struct _ze_gnupg_object{ typedef struct _ze_gnupg_object{
@ -61,7 +61,6 @@ PHP_FUNCTION(gnupg_construct);
PHP_FUNCTION(gnupg_keyinfo); PHP_FUNCTION(gnupg_keyinfo);
PHP_FUNCTION(gnupg_verify); PHP_FUNCTION(gnupg_verify);
PHP_FUNCTION(gnupg_geterror); PHP_FUNCTION(gnupg_geterror);
PHP_FUNCTION(gnupg_setpassphrase);
PHP_FUNCTION(gnupg_setsignmode); PHP_FUNCTION(gnupg_setsignmode);
PHP_FUNCTION(gnupg_setarmor); PHP_FUNCTION(gnupg_setarmor);
PHP_FUNCTION(gnupg_sign); PHP_FUNCTION(gnupg_sign);