added possibility to handle specify mulitple keys for all operations

therefore the api has changed a bit and this release is not compatible with the previously betareleases
This commit is contained in:
Thilo Raufeisen 2005-10-24 17:33:59 +00:00
parent 838760860b
commit d927552662
2 changed files with 115 additions and 120 deletions

122
gnupg.c
View file

@ -58,8 +58,21 @@ static zend_object_handlers gnupg_object_handlers;
RETURN_FALSE;
/* }}} */
/* {{{ free encryptkeys */
static void gnupg_free_encryptkeys(gnupg_object *intern TSRMLS_DC){
if(intern){
if(intern->encrypt_size > 0){
gpgme_key_release (*intern->encryptkeys);
erealloc(intern->encryptkeys,0);
}
intern->encryptkeys = NULL;
intern->encrypt_size = 0;
}
}
/* }}} */
/* {{{ free_resource */
static void gnupg_free_resource_ptr(gnupg_object *intern TSRMLS_DC){
int idx;
if(intern){
if(intern->ctx){
gpgme_signers_clear (intern->ctx);
@ -67,6 +80,7 @@ static void gnupg_free_resource_ptr(gnupg_object *intern TSRMLS_DC){
intern->ctx = NULL;
}
zval_dtor(&intern->passphrase);
gnupg_free_encryptkeys(intern);
efree(intern);
}
}
@ -126,7 +140,8 @@ zend_object_value gnupg_objects_new(zend_class_entry *class_type TSRMLS_DC){
gpgme_set_armor (ctx,1);
gnupg_ptr = emalloc(sizeof(gnupg_object));
gnupg_ptr->ctx = ctx;
gnupg_ptr->encryptkey = NULL;
gnupg_ptr->encryptkeys = NULL;
gnupg_ptr->encrypt_size= 0;
gnupg_ptr->signmode = GPGME_SIG_MODE_CLEAR;
intern->gnupg_ptr = gnupg_ptr;
@ -140,9 +155,8 @@ static zend_function_entry gnupg_methods[] = {
ZEND_ME(gnupg, verify, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, geterror, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, setpassphrase, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, setsignerkey, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, clearsignerkey, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, setencryptkey, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, clearsignkeys, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, clearencryptkeys, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, setarmor, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, encrypt, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, decrypt, NULL, ZEND_ACC_PUBLIC)
@ -153,18 +167,19 @@ static zend_function_entry gnupg_methods[] = {
ZEND_ME(gnupg, sign, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, encryptsign, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, decryptverify, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, addsignkey, NULL, ZEND_ACC_PUBLIC)
ZEND_ME(gnupg, addencryptkey, NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
#endif /* ZEND_ENGINE_2 */
static zend_function_entry gnupg_functions[] = {
PHP_FE(gnupg_init, NULL)
PHP_FE(gnupg_keyinfo, NULL)
PHP_FE(gnupg_setsignerkey, NULL)
PHP_FE(gnupg_setpassphrase, NULL)
PHP_FE(gnupg_sign, NULL)
PHP_FE(gnupg_verify, NULL)
PHP_FE(gnupg_clearsignerkey, NULL)
PHP_FE(gnupg_setencryptkey, NULL)
PHP_FE(gnupg_clearsignkeys, NULL)
PHP_FE(gnupg_clearencryptkeys, NULL)
PHP_FE(gnupg_setarmor, NULL)
PHP_FE(gnupg_encrypt, NULL)
PHP_FE(gnupg_decrypt, NULL)
@ -175,6 +190,8 @@ static zend_function_entry gnupg_functions[] = {
PHP_FE(gnupg_encryptsign, NULL)
PHP_FE(gnupg_decryptverify, NULL)
PHP_FE(gnupg_geterror, NULL)
PHP_FE(gnupg_addsignkey, NULL)
PHP_FE(gnupg_addencryptkey, NULL)
{NULL, NULL, NULL}
};
/* }}} */
@ -193,17 +210,6 @@ static void gnupg_declare_long_constant(const char *const_name, long value TSRML
}
/* }}} */
/* {{{ properties */
/*
void register_gnupgProperties(TSRMLS_D){
#ifdef ZEND_ENGINE_2
zend_declare_property_long (gnupg_class_entry, "protocol", 8, GPGME_PROTOCOL_OpenPGP, ZEND_ACC_PROTECTED TSRMLS_DC);
zend_declare_property_string (gnupg_class_entry, "error", 5, "", ZEND_ACC_PROTECTED TSRMLS_DC);
#endif
}
*/
/* }}} */
/* {{{ gnupg_module_entry
*/
zend_module_entry gnupg_module_entry = {
@ -218,7 +224,7 @@ zend_module_entry gnupg_module_entry = {
NULL,
PHP_MINFO(gnupg),
#if ZEND_MODULE_API_NO >= 20010901
"0.4",
"0.5",
#endif
STANDARD_MODULE_PROPERTIES
};
@ -341,7 +347,7 @@ PHP_FUNCTION(gnupg_init){
intern = emalloc(sizeof(gnupg_object));
gpgme_new (&intern->ctx);
intern->signmode = GPGME_SIG_MODE_CLEAR;
intern->encryptkey = NULL;
intern->encryptkeys = NULL;
gpgme_set_armor (intern->ctx,1);
ZEND_REGISTER_RESOURCE(return_value,intern,le_gnupg);
}
@ -571,12 +577,8 @@ PHP_FUNCTION(gnupg_keyinfo)
}
/* }}} */
/* {{{ proto bool gnupg_setsignerkey(string key)
* sets the private key for the next sign operation.
* please note, that the given key must return only 1 result from the keyring
* it should be the best to provide a fingerprint here
*/
PHP_FUNCTION(gnupg_setsignerkey){
/* {{{ proto bool gnupg_addsignkey(string key) */
PHP_FUNCTION(gnupg_addsignkey){
char *key_id = NULL;
int key_id_len;
zval *res;
@ -599,9 +601,6 @@ PHP_FUNCTION(gnupg_setsignerkey){
if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1)) != GPG_ERR_NO_ERROR){
GNUPG_ERR("get_key failed");
}
gpgme_signers_clear (intern->ctx);
if((intern->err = gpgme_signers_add(intern->ctx, gpgme_key))!=GPG_ERR_NO_ERROR){
GNUPG_ERR("could not add signer");
}
@ -609,18 +608,13 @@ PHP_FUNCTION(gnupg_setsignerkey){
}
/* }}} */
/* {{{ proto bool gnupg_setencryptkey(string key)
* sets the public key for next encrypt operation.
* please note, that the given key must return only 1 result from the keyring
* it should be the best to provide a fingerprint here
*/
PHP_FUNCTION(gnupg_setencryptkey){
/* {{{ proto bool gnupg_addencryptkey(string key) */
PHP_FUNCTION(gnupg_addencryptkey){
char *key_id = NULL;
int key_id_len;
zval *res;
gpgme_sign_result_t result;
gpgme_key_t gpgme_key;
gpgme_key_t gpgme_key = NULL;
GNUPG_GETOBJ();
@ -638,10 +632,10 @@ PHP_FUNCTION(gnupg_setencryptkey){
if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 0)) != GPG_ERR_NO_ERROR){
GNUPG_ERR("get_key failed");
}
if(intern->encryptkey){
gpgme_key_release(intern->encryptkey);
}
intern->encryptkey = gpgme_key;
intern->encryptkeys = erealloc(intern->encryptkeys, sizeof(intern->encryptkeys) * (intern->encrypt_size + 1));
intern->encryptkeys[intern->encrypt_size] = gpgme_key;
intern->encrypt_size++;
intern->encryptkeys[intern->encrypt_size] = NULL;
RETURN_TRUE;
}
/* }}} */
@ -649,7 +643,7 @@ PHP_FUNCTION(gnupg_setencryptkey){
/* {{{ proto bool gnupg_clearsignerkey(void)
* removes all keys which are set for signing
*/
PHP_FUNCTION(gnupg_clearsignerkey){
PHP_FUNCTION(gnupg_clearsignkeys){
zval *res;
GNUPG_GETOBJ();
@ -669,7 +663,7 @@ PHP_FUNCTION(gnupg_clearsignerkey){
/* {{{ proto bool gnupg_clearencryptkey(void)
* removes all keys which are set for encryption
*/
PHP_FUNCTION(gnupg_clearencryptkey){
PHP_FUNCTION(gnupg_clearencryptkeys){
zval *res;
GNUPG_GETOBJ();
@ -680,8 +674,7 @@ PHP_FUNCTION(gnupg_clearencryptkey){
}
ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg);
}
gpgme_key_release (intern->encryptkey);
gnupg_free_encryptkeys(intern);
RETURN_TRUE;
}
@ -734,9 +727,6 @@ PHP_FUNCTION(gnupg_sign){
if(!result->signatures){
GNUPG_ERR("no signature in result");
}
if(result->signatures->next){
GNUPG_ERR("unexpected numbers of signatures created");
}
userret = gpgme_data_release_and_get_mem(out,&ret_size);
if(ret_size < 1){
RETURN_FALSE;
@ -774,7 +764,7 @@ PHP_FUNCTION(gnupg_encrypt){
}
ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg);
}
if(!intern->encryptkey){
if(!intern->encryptkeys){
GNUPG_ERR("no key for encryption set");
}
if((intern->err = gpgme_data_new_from_mem (&in, value, value_len, 0))!=GPG_ERR_NO_ERROR){
@ -783,7 +773,7 @@ PHP_FUNCTION(gnupg_encrypt){
if((intern->err = gpgme_data_new(&out))!=GPG_ERR_NO_ERROR){
GNUPG_ERR("could not create out-data buffer");
}
if((intern->err = gpgme_op_encrypt(intern->ctx, &intern->encryptkey, GPGME_ENCRYPT_ALWAYS_TRUST, in, out))!=GPG_ERR_NO_ERROR){
if((intern->err = gpgme_op_encrypt(intern->ctx, intern->encryptkeys, GPGME_ENCRYPT_ALWAYS_TRUST, in, out))!=GPG_ERR_NO_ERROR){
GNUPG_ERR("encrypt failed");
}
result = gpgme_op_encrypt_result (intern->ctx);
@ -791,11 +781,11 @@ PHP_FUNCTION(gnupg_encrypt){
GNUPG_ERR("Invalid recipient encountered");
}
userret = gpgme_data_release_and_get_mem(out,&ret_size);
gpgme_data_release (in);
free (out);
if(ret_size < 1){
RETURN_FALSE;
}
gpgme_data_release (in);
free (out);
RETURN_STRINGL (userret,ret_size,1);
}
/* }}} */
@ -828,7 +818,7 @@ PHP_FUNCTION(gnupg_encryptsign){
ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg);
}
if(!intern->encryptkey){
if(!intern->encryptkeys){
GNUPG_ERR("no key for encryption set");
}
gpgme_set_passphrase_cb (intern->ctx, (void*) passphrase_cb, intern);
@ -838,7 +828,7 @@ PHP_FUNCTION(gnupg_encryptsign){
if((intern->err = gpgme_data_new(&out))!=GPG_ERR_NO_ERROR){
GNUPG_ERR("could not create out-data buffer");
}
if((intern->err = gpgme_op_encrypt_sign(intern->ctx, &intern->encryptkey, GPGME_ENCRYPT_ALWAYS_TRUST, in, out))!=GPG_ERR_NO_ERROR){
if((intern->err = gpgme_op_encrypt_sign(intern->ctx, intern->encryptkeys, GPGME_ENCRYPT_ALWAYS_TRUST, in, out))!=GPG_ERR_NO_ERROR){
GNUPG_ERR("encrypt-sign failed");
}
@ -873,14 +863,16 @@ PHP_FUNCTION(gnupg_verify){
char *sigtext = NULL;
int value_len;
int tmp;
zval *plaintext;
zval *plaintext = NULL;
zval *res;
zval *sig;
char *userret;
int ret_size;
gpgme_data_t in, out;
gpgme_verify_result_t result;
gpgme_signature_t signature;
GNUPG_GETOBJ();
@ -894,7 +886,6 @@ PHP_FUNCTION(gnupg_verify){
}
ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg);
}
if((intern->err = gpgme_data_new_from_mem (&in, value, value_len, 0))!=GPG_ERR_NO_ERROR){
GNUPG_ERR("could not create in-data buffer");
}
@ -908,17 +899,20 @@ PHP_FUNCTION(gnupg_verify){
if(!result->signatures){
GNUPG_ERR ("no signature found");
}
if(result->signatures->next){
GNUPG_ERR ("multiple signatures found");
}
array_init (return_value);
signature = result->signatures;
while(signature){
ALLOC_INIT_ZVAL (sig);
array_init (sig);
add_assoc_string (sig, "fingerprint", signature->fpr, 1);
add_assoc_long (sig, "validity", signature->validity );
add_assoc_long (sig, "timestamp", signature->timestamp );
add_assoc_long (sig, "status", signature->status );
add_assoc_string (return_value, "fingerprint", result->signatures->fpr, 1);
add_assoc_long (return_value, "validity", result->signatures->validity );
add_assoc_long (return_value, "timestamp", result->signatures->timestamp );
add_assoc_long (return_value, "status", result->signatures->status );
add_next_index_zval (return_value, sig);
signature = signature->next;
}
userret = gpgme_data_release_and_get_mem(out,&ret_size);
if(plaintext){
ZVAL_STRINGL (plaintext,userret,ret_size,1);

View file

@ -39,10 +39,11 @@ extern zend_module_entry gnupg_module_entry;
typedef struct _gnupg_object{
gpgme_ctx_t ctx;
zval passphrase;
gpgme_key_t encryptkey;
gpgme_error_t err;
char* errortxt;
int signmode;
gpgme_key_t *encryptkeys;
unsigned int encrypt_size;
} gnupg_object;
typedef struct _ze_gnupg_object{
@ -61,12 +62,11 @@ PHP_FUNCTION(gnupg_keyinfo);
PHP_FUNCTION(gnupg_verify);
PHP_FUNCTION(gnupg_geterror);
PHP_FUNCTION(gnupg_setpassphrase);
PHP_FUNCTION(gnupg_setsignerkey);
PHP_FUNCTION(gnupg_setencryptkey);
PHP_FUNCTION(gnupg_setsignmode);
PHP_FUNCTION(gnupg_setarmor);
PHP_FUNCTION(gnupg_sign);
PHP_FUNCTION(gnupg_clearsignerkey);
PHP_FUNCTION(gnupg_clearsignkeys);
PHP_FUNCTION(gnupg_clearencryptkeys);
PHP_FUNCTION(gnupg_getprotocol);
PHP_FUNCTION(gnupg_encrypt);
PHP_FUNCTION(gnupg_encryptsign);
@ -75,7 +75,8 @@ PHP_FUNCTION(gnupg_decryptverify);
PHP_FUNCTION(gnupg_export);
PHP_FUNCTION(gnupg_import);
PHP_FUNCTION(gnupg_init);
PHP_FUNCTION(gnupg_addsignkey);
PHP_FUNCTION(gnupg_addencryptkey);
#ifdef ZTS
#define GNUPG_G(v) TSRMG(gnupg_globals_id, zend_gnupg_globals *, v)