summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemi Collet <remi@remirepo.net>2021-02-15 08:23:56 +0100
committerRemi Collet <remi@remirepo.net>2021-02-15 08:23:56 +0100
commit4efa260e22648741cb25f2d8d51418c3491c46a9 (patch)
treee0c13eca39a0ff189e9689ac924d73600a28cbdf
parentb78ba312b02b5706b35adc5bd2db3337b4e1a3fd (diff)
Update to 1.5.0RC1HEADmaster
open https://github.com/php-gnupg/php-gnupg/pull/25 missing files in pecl archive open https://github.com/php-gnupg/php-gnupg/pull/26 also cleanup socket files open https://github.com/php-gnupg/php-gnupg/pull/27 fix build with old libgpgme 1.3 use gnupg version 2 (Fedora and EL-8)
-rw-r--r--.gitignore2
-rw-r--r--PHPINFO6
-rw-r--r--REFLECTION371
-rw-r--r--gnupg-build.patch73
-rw-r--r--gnupgt.inc211
-rw-r--r--php-pecl-gnupg.spec74
-rw-r--r--vars.inc69
7 files changed, 714 insertions, 92 deletions
diff --git a/.gitignore b/.gitignore
index 1ab5c4f..01f0400 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,7 @@
+clog
package-*.xml
*.tgz
+*.tar.bz2
*.tar.gz
*.tar.xz
*.tar.xz.asc
diff --git a/PHPINFO b/PHPINFO
new file mode 100644
index 0000000..c81c7ec
--- /dev/null
+++ b/PHPINFO
@@ -0,0 +1,6 @@
+
+gnupg
+
+gnupg support => enabled
+GPGme Version => 1.14.0
+Extension Version => 1.5.0RC1
diff --git a/REFLECTION b/REFLECTION
index 970733d..33e0a7e 100644
--- a/REFLECTION
+++ b/REFLECTION
@@ -1,39 +1,65 @@
-Extension [ <persistent> extension #86 gnupg version 1.4.0 ] {
-
- - Constants [25] {
- Constant [ integer GNUPG_SIG_MODE_NORMAL ] { 0 }
- Constant [ integer GNUPG_SIG_MODE_DETACH ] { 1 }
- Constant [ integer GNUPG_SIG_MODE_CLEAR ] { 2 }
- Constant [ integer GNUPG_VALIDITY_UNKNOWN ] { 0 }
- Constant [ integer GNUPG_VALIDITY_UNDEFINED ] { 1 }
- Constant [ integer GNUPG_VALIDITY_NEVER ] { 2 }
- Constant [ integer GNUPG_VALIDITY_MARGINAL ] { 3 }
- Constant [ integer GNUPG_VALIDITY_FULL ] { 4 }
- Constant [ integer GNUPG_VALIDITY_ULTIMATE ] { 5 }
- Constant [ integer GNUPG_PROTOCOL_OpenPGP ] { 0 }
- Constant [ integer GNUPG_PROTOCOL_CMS ] { 1 }
- Constant [ integer GNUPG_SIGSUM_VALID ] { 1 }
- Constant [ integer GNUPG_SIGSUM_GREEN ] { 2 }
- Constant [ integer GNUPG_SIGSUM_RED ] { 4 }
- Constant [ integer GNUPG_SIGSUM_KEY_REVOKED ] { 16 }
- Constant [ integer GNUPG_SIGSUM_KEY_EXPIRED ] { 32 }
- Constant [ integer GNUPG_SIGSUM_SIG_EXPIRED ] { 64 }
- Constant [ integer GNUPG_SIGSUM_KEY_MISSING ] { 128 }
- Constant [ integer GNUPG_SIGSUM_CRL_MISSING ] { 256 }
- Constant [ integer GNUPG_SIGSUM_CRL_TOO_OLD ] { 512 }
- Constant [ integer GNUPG_SIGSUM_BAD_POLICY ] { 1024 }
- Constant [ integer GNUPG_SIGSUM_SYS_ERROR ] { 2048 }
- Constant [ integer GNUPG_ERROR_WARNING ] { 1 }
- Constant [ integer GNUPG_ERROR_EXCEPTION ] { 2 }
- Constant [ integer GNUPG_ERROR_SILENT ] { 3 }
+Extension [ <persistent> extension #120 gnupg version 1.5.0RC1 ] {
+
+ - Constants [36] {
+ Constant [ int GNUPG_SIG_MODE_NORMAL ] { 0 }
+ Constant [ int GNUPG_SIG_MODE_DETACH ] { 1 }
+ Constant [ int GNUPG_SIG_MODE_CLEAR ] { 2 }
+ Constant [ int GNUPG_VALIDITY_UNKNOWN ] { 0 }
+ Constant [ int GNUPG_VALIDITY_UNDEFINED ] { 1 }
+ Constant [ int GNUPG_VALIDITY_NEVER ] { 2 }
+ Constant [ int GNUPG_VALIDITY_MARGINAL ] { 3 }
+ Constant [ int GNUPG_VALIDITY_FULL ] { 4 }
+ Constant [ int GNUPG_VALIDITY_ULTIMATE ] { 5 }
+ Constant [ int GNUPG_PROTOCOL_OpenPGP ] { 0 }
+ Constant [ int GNUPG_PROTOCOL_CMS ] { 1 }
+ Constant [ int GNUPG_SIGSUM_VALID ] { 1 }
+ Constant [ int GNUPG_SIGSUM_GREEN ] { 2 }
+ Constant [ int GNUPG_SIGSUM_RED ] { 4 }
+ Constant [ int GNUPG_SIGSUM_KEY_REVOKED ] { 16 }
+ Constant [ int GNUPG_SIGSUM_KEY_EXPIRED ] { 32 }
+ Constant [ int GNUPG_SIGSUM_SIG_EXPIRED ] { 64 }
+ Constant [ int GNUPG_SIGSUM_KEY_MISSING ] { 128 }
+ Constant [ int GNUPG_SIGSUM_CRL_MISSING ] { 256 }
+ Constant [ int GNUPG_SIGSUM_CRL_TOO_OLD ] { 512 }
+ Constant [ int GNUPG_SIGSUM_BAD_POLICY ] { 1024 }
+ Constant [ int GNUPG_SIGSUM_SYS_ERROR ] { 2048 }
+ Constant [ int GNUPG_ERROR_WARNING ] { 1 }
+ Constant [ int GNUPG_ERROR_EXCEPTION ] { 2 }
+ Constant [ int GNUPG_ERROR_SILENT ] { 3 }
+ Constant [ int GNUPG_PK_RSA ] { 1 }
+ Constant [ int GNUPG_PK_RSA_E ] { 2 }
+ Constant [ int GNUPG_PK_RSA_S ] { 3 }
+ Constant [ int GNUPG_PK_DSA ] { 17 }
+ Constant [ int GNUPG_PK_ELG ] { 20 }
+ Constant [ int GNUPG_PK_ELG_E ] { 16 }
+ Constant [ int GNUPG_PK_ECC ] { 18 }
+ Constant [ int GNUPG_PK_ECDSA ] { 301 }
+ Constant [ int GNUPG_PK_ECDH ] { 302 }
+ Constant [ int GNUPG_PK_EDDSA ] { 303 }
+ Constant [ string GNUPG_GPGME_VERSION ] { 1.14.0 }
}
- Functions {
Function [ <internal:gnupg> function gnupg_init ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <optional> $options ]
+ }
}
Function [ <internal:gnupg> function gnupg_keyinfo ] {
+
+ - Parameters [3] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $pattern ]
+ Parameter #2 [ <optional> $secret_only ]
+ }
}
Function [ <internal:gnupg> function gnupg_sign ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $text ]
+ }
}
Function [ <internal:gnupg> function gnupg_verify ] {
@@ -45,26 +71,83 @@ Extension [ <persistent> extension #86 gnupg version 1.4.0 ] {
}
}
Function [ <internal:gnupg> function gnupg_clearsignkeys ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $res ]
+ }
}
Function [ <internal:gnupg> function gnupg_clearencryptkeys ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $res ]
+ }
}
Function [ <internal:gnupg> function gnupg_cleardecryptkeys ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $res ]
+ }
}
Function [ <internal:gnupg> function gnupg_setarmor ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $armor ]
+ }
}
Function [ <internal:gnupg> function gnupg_encrypt ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $text ]
+ }
}
Function [ <internal:gnupg> function gnupg_decrypt ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $enctext ]
+ }
}
Function [ <internal:gnupg> function gnupg_export ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $pattern ]
+ }
}
Function [ <internal:gnupg> function gnupg_import ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $kye ]
+ }
+ }
+ Function [ <internal:gnupg> function gnupg_getengineinfo ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $res ]
+ }
}
Function [ <internal:gnupg> function gnupg_getprotocol ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $res ]
+ }
}
Function [ <internal:gnupg> function gnupg_setsignmode ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $signmode ]
+ }
}
Function [ <internal:gnupg> function gnupg_encryptsign ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $text ]
+ }
}
Function [ <internal:gnupg> function gnupg_decryptverify ] {
@@ -75,52 +158,110 @@ Extension [ <persistent> extension #86 gnupg version 1.4.0 ] {
}
}
Function [ <internal:gnupg> function gnupg_geterror ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $res ]
+ }
+ }
+ Function [ <internal:gnupg> function gnupg_geterrorinfo ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $res ]
+ }
}
Function [ <internal:gnupg> function gnupg_addsignkey ] {
+
+ - Parameters [3] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $kye ]
+ Parameter #2 [ <required> $passphrase ]
+ }
}
Function [ <internal:gnupg> function gnupg_addencryptkey ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $kye ]
+ }
}
Function [ <internal:gnupg> function gnupg_adddecryptkey ] {
+
+ - Parameters [3] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $kye ]
+ Parameter #2 [ <required> $passphrase ]
+ }
}
Function [ <internal:gnupg> function gnupg_deletekey ] {
+
+ - Parameters [3] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $kye ]
+ Parameter #2 [ <required> $allow_secret ]
+ }
}
Function [ <internal:gnupg> function gnupg_gettrustlist ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $pattern ]
+ }
}
Function [ <internal:gnupg> function gnupg_listsignatures ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $kyeid ]
+ }
}
Function [ <internal:gnupg> function gnupg_seterrormode ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $res ]
+ Parameter #1 [ <required> $errnmode ]
+ }
}
}
- Classes [2] {
Class [ <internal:gnupg> class gnupg ] {
- - Constants [25] {
- Constant [ integer SIG_MODE_NORMAL ] { 0 }
- Constant [ integer SIG_MODE_DETACH ] { 1 }
- Constant [ integer SIG_MODE_CLEAR ] { 2 }
- Constant [ integer VALIDITY_UNKNOWN ] { 0 }
- Constant [ integer VALIDITY_UNDEFINED ] { 1 }
- Constant [ integer VALIDITY_NEVER ] { 2 }
- Constant [ integer VALIDITY_MARGINAL ] { 3 }
- Constant [ integer VALIDITY_FULL ] { 4 }
- Constant [ integer VALIDITY_ULTIMATE ] { 5 }
- Constant [ integer PROTOCOL_OpenPGP ] { 0 }
- Constant [ integer PROTOCOL_CMS ] { 1 }
- Constant [ integer SIGSUM_VALID ] { 1 }
- Constant [ integer SIGSUM_GREEN ] { 2 }
- Constant [ integer SIGSUM_RED ] { 4 }
- Constant [ integer SIGSUM_KEY_REVOKED ] { 16 }
- Constant [ integer SIGSUM_KEY_EXPIRED ] { 32 }
- Constant [ integer SIGSUM_SIG_EXPIRED ] { 64 }
- Constant [ integer SIGSUM_KEY_MISSING ] { 128 }
- Constant [ integer SIGSUM_CRL_MISSING ] { 256 }
- Constant [ integer SIGSUM_CRL_TOO_OLD ] { 512 }
- Constant [ integer SIGSUM_BAD_POLICY ] { 1024 }
- Constant [ integer SIGSUM_SYS_ERROR ] { 2048 }
- Constant [ integer ERROR_WARNING ] { 1 }
- Constant [ integer ERROR_EXCEPTION ] { 2 }
- Constant [ integer ERROR_SILENT ] { 3 }
+ - Constants [35] {
+ Constant [ public int SIG_MODE_NORMAL ] { 0 }
+ Constant [ public int SIG_MODE_DETACH ] { 1 }
+ Constant [ public int SIG_MODE_CLEAR ] { 2 }
+ Constant [ public int VALIDITY_UNKNOWN ] { 0 }
+ Constant [ public int VALIDITY_UNDEFINED ] { 1 }
+ Constant [ public int VALIDITY_NEVER ] { 2 }
+ Constant [ public int VALIDITY_MARGINAL ] { 3 }
+ Constant [ public int VALIDITY_FULL ] { 4 }
+ Constant [ public int VALIDITY_ULTIMATE ] { 5 }
+ Constant [ public int PROTOCOL_OpenPGP ] { 0 }
+ Constant [ public int PROTOCOL_CMS ] { 1 }
+ Constant [ public int SIGSUM_VALID ] { 1 }
+ Constant [ public int SIGSUM_GREEN ] { 2 }
+ Constant [ public int SIGSUM_RED ] { 4 }
+ Constant [ public int SIGSUM_KEY_REVOKED ] { 16 }
+ Constant [ public int SIGSUM_KEY_EXPIRED ] { 32 }
+ Constant [ public int SIGSUM_SIG_EXPIRED ] { 64 }
+ Constant [ public int SIGSUM_KEY_MISSING ] { 128 }
+ Constant [ public int SIGSUM_CRL_MISSING ] { 256 }
+ Constant [ public int SIGSUM_CRL_TOO_OLD ] { 512 }
+ Constant [ public int SIGSUM_BAD_POLICY ] { 1024 }
+ Constant [ public int SIGSUM_SYS_ERROR ] { 2048 }
+ Constant [ public int ERROR_WARNING ] { 1 }
+ Constant [ public int ERROR_EXCEPTION ] { 2 }
+ Constant [ public int ERROR_SILENT ] { 3 }
+ Constant [ public int PK_RSA ] { 1 }
+ Constant [ public int PK_RSA_E ] { 2 }
+ Constant [ public int PK_RSA_S ] { 3 }
+ Constant [ public int PK_DSA ] { 17 }
+ Constant [ public int PK_ELG ] { 20 }
+ Constant [ public int PK_ELG_E ] { 16 }
+ Constant [ public int PK_ECC ] { 18 }
+ Constant [ public int PK_ECDSA ] { 301 }
+ Constant [ public int PK_ECDH ] { 302 }
+ Constant [ public int PK_EDDSA ] { 303 }
}
- Static properties [0] {
@@ -132,8 +273,20 @@ Extension [ <persistent> extension #86 gnupg version 1.4.0 ] {
- Properties [0] {
}
- - Methods [23] {
+ - Methods [26] {
+ Method [ <internal:gnupg, ctor> public method __construct ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <optional> $options ]
+ }
+ }
+
Method [ <internal:gnupg> public method keyinfo ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $pattern ]
+ Parameter #1 [ <optional> $secret_only ]
+ }
}
Method [ <internal:gnupg> public method verify ] {
@@ -145,43 +298,102 @@ Extension [ <persistent> extension #86 gnupg version 1.4.0 ] {
}
}
+ Method [ <internal:gnupg> public method getengineinfo ] {
+
+ - Parameters [0] {
+ }
+ }
+
Method [ <internal:gnupg> public method geterror ] {
+
+ - Parameters [0] {
+ }
+ }
+
+ Method [ <internal:gnupg> public method geterrorinfo ] {
+
+ - Parameters [0] {
+ }
}
Method [ <internal:gnupg> public method clearsignkeys ] {
+
+ - Parameters [0] {
+ }
}
Method [ <internal:gnupg> public method clearencryptkeys ] {
+
+ - Parameters [0] {
+ }
}
Method [ <internal:gnupg> public method cleardecryptkeys ] {
+
+ - Parameters [0] {
+ }
}
Method [ <internal:gnupg> public method setarmor ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $armor ]
+ }
}
Method [ <internal:gnupg> public method encrypt ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $text ]
+ }
}
Method [ <internal:gnupg> public method decrypt ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $enctext ]
+ }
}
Method [ <internal:gnupg> public method export ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $pattern ]
+ }
}
Method [ <internal:gnupg> public method import ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $kye ]
+ }
}
Method [ <internal:gnupg> public method getprotocol ] {
+
+ - Parameters [0] {
+ }
}
Method [ <internal:gnupg> public method setsignmode ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $signmode ]
+ }
}
Method [ <internal:gnupg> public method sign ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $text ]
+ }
}
Method [ <internal:gnupg> public method encryptsign ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $text ]
+ }
}
Method [ <internal:gnupg> public method decryptverify ] {
@@ -193,24 +405,55 @@ Extension [ <persistent> extension #86 gnupg version 1.4.0 ] {
}
Method [ <internal:gnupg> public method addsignkey ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $kye ]
+ Parameter #1 [ <required> $passphrase ]
+ }
}
Method [ <internal:gnupg> public method addencryptkey ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $kye ]
+ }
}
Method [ <internal:gnupg> public method adddecryptkey ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $kye ]
+ Parameter #1 [ <required> $passphrase ]
+ }
}
Method [ <internal:gnupg> public method deletekey ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> $kye ]
+ Parameter #1 [ <required> $allow_secret ]
+ }
}
Method [ <internal:gnupg> public method gettrustlist ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $pattern ]
+ }
}
Method [ <internal:gnupg> public method listsignatures ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $kyeid ]
+ }
}
Method [ <internal:gnupg> public method seterrormode ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> $errnmode ]
+ }
}
}
}
@@ -231,21 +474,39 @@ Extension [ <persistent> extension #86 gnupg version 1.4.0 ] {
- Methods [6] {
Method [ <internal:gnupg, ctor> public method __construct ] {
+
+ - Parameters [0] {
+ }
}
Method [ <internal:gnupg, prototype Iterator> public method current ] {
+
+ - Parameters [0] {
+ }
}
Method [ <internal:gnupg, prototype Iterator> public method key ] {
+
+ - Parameters [0] {
+ }
}
Method [ <internal:gnupg, prototype Iterator> public method next ] {
+
+ - Parameters [0] {
+ }
}
Method [ <internal:gnupg, prototype Iterator> public method rewind ] {
+
+ - Parameters [0] {
+ }
}
Method [ <internal:gnupg, prototype Iterator> public method valid ] {
+
+ - Parameters [0] {
+ }
}
}
}
diff --git a/gnupg-build.patch b/gnupg-build.patch
new file mode 100644
index 0000000..cedea9f
--- /dev/null
+++ b/gnupg-build.patch
@@ -0,0 +1,73 @@
+From 618e7ffc698f948dfe4feef38258e42a7c24130e Mon Sep 17 00:00:00 2001
+From: Remi Collet <remi@remirepo.net>
+Date: Mon, 15 Feb 2021 08:04:31 +0100
+Subject: [PATCH] fix build with libgpgme 1.3
+
+---
+ gnupg.c | 12 ++++--------
+ 1 file changed, 4 insertions(+), 8 deletions(-)
+
+diff --git a/gnupg.c b/gnupg.c
+index 3ec2f07..67e8c7f 100644
+--- a/gnupg.c
++++ b/gnupg.c
+@@ -170,7 +170,9 @@ static void php_gnupg_this_make(PHPC_THIS_DECLARE(gnupg), zval *options TSRMLS_D
+ ctx, GPGME_PROTOCOL_OpenPGP, file_name, home_dir);
+ }
+ gpgme_set_armor(ctx, 1);
++#if GPGME_VERSION_NUMBER >= 0x010400 /* GPGME >= 1.4.0 */
+ gpgme_set_pinentry_mode(ctx, GPGME_PINENTRY_MODE_LOOPBACK);
++#endif
+ }
+ }
+ /* }}} */
+@@ -591,10 +593,8 @@ PHP_MINIT_FUNCTION(gnupg)
+ #if GPGME_VERSION_NUMBER >= 0x010500 /* GPGME >= 1.5.0 */
+ PHP_GNUPG_SET_CLASS_CONST("PK_ECC", GPGME_PK_ECC);
+ #endif /* gpgme >= 1.5.0 */
+-#if GPGME_VERSION_NUMBER >= 0x010300 /* GPGME >= 1.3.0 */
+ PHP_GNUPG_SET_CLASS_CONST("PK_ECDSA", GPGME_PK_ECDSA);
+ PHP_GNUPG_SET_CLASS_CONST("PK_ECDH", GPGME_PK_ECDH);
+-#endif /* gpgme >= 1.3.0 */
+ #if GPGME_VERSION_NUMBER >= 0x010700 /* GPGME >= 1.7.0 */
+ PHP_GNUPG_SET_CLASS_CONST("PK_EDDSA", GPGME_PK_EDDSA);
+ #endif /* gpgme >= 1.7.0 */
+@@ -633,10 +633,8 @@ PHP_MINIT_FUNCTION(gnupg)
+ #if GPGME_VERSION_NUMBER >= 0x010500 /* GPGME >= 1.5.0 */
+ PHP_GNUPG_REG_CONST("GNUPG_PK_ECC", GPGME_PK_ECC);
+ #endif /* gpgme >= 1.5.0 */
+-#if GPGME_VERSION_NUMBER >= 0x010300 /* GPGME >= 1.3.0 */
+ PHP_GNUPG_REG_CONST("GNUPG_PK_ECDSA", GPGME_PK_ECDSA);
+ PHP_GNUPG_REG_CONST("GNUPG_PK_ECDH", GPGME_PK_ECDH);
+-#endif /* gpgme >= 1.3.0 */
+ #if GPGME_VERSION_NUMBER >= 0x010700 /* GPGME >= 1.7.0 */
+ PHP_GNUPG_REG_CONST("GNUPG_PK_EDDSA", GPGME_PK_EDDSA);
+ #endif /* gpgme >= 1.7.0 */
+@@ -1099,9 +1097,7 @@ PHP_FUNCTION(gnupg_keyinfo)
+ PHP_GNUPG_ARRAY_ADD_ASSOC_BOOL(subkey, revoked, gpgme_subkey);
+ PHP_GNUPG_ARRAY_ADD_ASSOC_BOOL(subkey, can_certify, gpgme_subkey);
+ PHP_GNUPG_ARRAY_ADD_ASSOC_BOOL(subkey, can_authenticate, gpgme_subkey);
+-#if GPGME_VERSION_NUMBER >= 0x010100 /* GPGME >= 1.1.0 */
+ PHP_GNUPG_ARRAY_ADD_ASSOC_BOOL(subkey, is_qualified, gpgme_subkey);
+-#endif /* gpgme >= 1.1.0 */
+ #if GPGME_VERSION_NUMBER >= 0x010900 /* GPGME >= 1.9.0 */
+ PHP_GNUPG_ARRAY_ADD_ASSOC_BOOL(subkey, is_de_vs, gpgme_subkey);
+ #endif /* gpgme >= 1.9.0 */
+@@ -1117,15 +1113,15 @@ PHP_FUNCTION(gnupg_keyinfo)
+ PHP_GNUPG_ARRAY_ADD_ASSOC_CSTR(subkey, keygrip, gpgme_subkey);
+ }
+ #endif /* gpgme >= 1.7.0 */
+-#if GPGME_VERSION_NUMBER >= 0x010200 /* GPGME >= 1.2.0 */
+ PHP_GNUPG_ARRAY_ADD_ASSOC_BOOL(subkey, is_cardkey, gpgme_subkey);
+ if (gpgme_subkey->card_number) {
+ PHP_GNUPG_ARRAY_ADD_ASSOC_CSTR(subkey, card_number, gpgme_subkey);
+ }
+-#endif /* gpgme >= 1.2.0 */
++#if GPGME_VERSION_NUMBER >= 0x010403 /* GPGME >= 1.4.3 */
+ if (gpgme_subkey->curve) {
+ PHP_GNUPG_ARRAY_ADD_ASSOC_CSTR(subkey, curve, gpgme_subkey);
+ }
++#endif
+
+ PHPC_ARRAY_ADD_NEXT_INDEX_ZVAL(
+ PHPC_VAL_CAST_TO_PZVAL(subkeys),
diff --git a/gnupgt.inc b/gnupgt.inc
new file mode 100644
index 0000000..c31415d
--- /dev/null
+++ b/gnupgt.inc
@@ -0,0 +1,211 @@
+<?php
+
+require_once __DIR__ . "/vars.inc";
+
+class gnupgt {
+ /**
+ * Import all keys
+ */
+ static public function import_key()
+ {
+ global $testkey;
+
+ self::reset_key();
+
+ $gpg = new gnupg();
+ $gpg->import($testkey);
+ }
+
+ /**
+ * Delete all keys.
+ * @param null|string $homeDir
+ */
+ static public function delete_key($homeDir = null)
+ {
+ if (is_null($homeDir)) {
+ $homeDir = self::get_home_dir();
+ }
+ if (!is_dir($homeDir)) {
+ return;
+ }
+ foreach (glob($homeDir . '/*') as $filename) {
+ if (!is_dir($filename)) {
+ unlink($filename);
+ }
+ }
+ $privKeyDir = self::get_priv_key_dir($homeDir);
+ if (is_dir($privKeyDir)) {
+ foreach (glob($privKeyDir . '/*') as $key) {
+ unlink($key);
+ }
+ rmdir($privKeyDir);
+ }
+ rmdir($homeDir);
+ }
+
+ /**
+ * Initialize key directory.
+ */
+ static public function init_key_dir()
+ {
+ mkdir(self::get_home_dir());
+ mkdir(self::get_priv_key_dir(), 0700);
+ }
+
+ /**
+ * Reset all keys.
+ */
+ static public function reset_key()
+ {
+ self::delete_key();
+ self::init_key_dir();
+ }
+
+ /**
+ * Get home directory.
+ *
+ * @return string
+ */
+ static private function get_home_dir()
+ {
+ return __DIR__ . '/home';
+ }
+
+ /**
+ * Get private key directory (for GPG2).
+ * @param null|string $homeDir
+ * @return string
+ */
+ static private function get_priv_key_dir($homeDir = null)
+ {
+ if (is_null($homeDir)) {
+ $homeDir = self::get_home_dir();
+ }
+ return $homeDir . '/private-keys-v1.d';
+ }
+
+ /**
+ * Print error message and return false.
+ *
+ * @param string $msg
+ * @return bool
+ */
+ static private function error($msg)
+ {
+ echo "ERROR: " . $msg;
+ return false;
+ }
+
+ /**
+ * Check single array value.
+ *
+ * @param mixed $expected
+ * @param array $a
+ * @param string $key1
+ * @return bool
+ */
+ static public function check_array($expected, $a, $key1)
+ {
+ $args = func_get_args();
+ $keys = array_splice($args, 2);
+ $value = $a;
+ foreach ($keys as $key) {
+ if (!isset($value[$key])) {
+ return self::error("key $key not found in the array");
+ }
+ $value = $value[$key];
+ }
+ if ($value !== $expected) {
+
+ return self::error(
+ sprintf(
+ "key %s value %s does not match expected %s\n",
+ $key,
+ var_export($value, true),
+ var_export($expected, true)
+ )
+ );
+ }
+
+ return true;
+ }
+
+ /**
+ * Check single array value but only for GpgME version higher than supplied.
+ *
+ * @param mixed $expected
+ * @param array $a
+ * @param string $key1
+ * @return bool
+ */
+ static public function check_array_from_version($version, $expected, $a, $key1)
+ {
+ if (version_compare(GNUPG_GPGME_VERSION, $version) < 0) {
+ return true;
+ }
+
+ $args = func_get_args();
+ return call_user_func_array('gnupgt::check_array', array_splice($args, 1));
+ }
+
+ /**
+ * Check keyinfo for var key
+ *
+ * @param $ret
+ * @param $secret_only
+ */
+ static public function check_keyinfo($ret, $secret_only) {
+ self::check_array(false, $ret, 0, 'disabled');
+ self::check_array(false, $ret, 0, 'expired');
+ self::check_array(false, $ret, 0, 'revoked');
+ self::check_array($secret_only, $ret, 0, 'is_secret');
+ self::check_array(true, $ret, 0, 'can_sign');
+ self::check_array(true, $ret, 0, 'can_encrypt');
+ // uid
+ self::check_array('PHP GnuPG', $ret, 0, 'uids', 0, 'name');
+ self::check_array('', $ret, 0, 'uids', 0, 'comment');
+ self::check_array('gnupg@php.net', $ret, 0, 'uids', 0, 'email');
+ self::check_array('PHP GnuPG <gnupg@php.net>', $ret, 0, 'uids', 0, 'uid');
+ self::check_array(false, $ret, 0, 'uids', 0, 'revoked');
+ self::check_array(false, $ret, 0, 'uids', 0, 'invalid');
+ self::check_array(false, $ret, 0, 'uids', 0, 'invalid');
+ // subkey 1
+ self::check_array("2DF0DD02DC9B70B7F64F572E669E775E0A6284B3", $ret, 0, 'subkeys', 0, 'fingerprint');
+ self::check_array("669E775E0A6284B3", $ret, 0, 'subkeys', 0, 'keyid');
+ self::check_array(1567958444, $ret, 0, 'subkeys', 0, 'timestamp');
+ self::check_array(0, $ret, 0, 'subkeys', 0, 'expires');
+ self::check_array($secret_only, $ret, 0, 'subkeys', 0, 'is_secret');
+ self::check_array(false, $ret, 0, 'subkeys', 0, 'can_encrypt');
+ self::check_array(true, $ret, 0, 'subkeys', 0, 'can_sign');
+ self::check_array(false, $ret, 0, 'subkeys', 0, 'disabled');
+ self::check_array(false, $ret, 0, 'subkeys', 0, 'expired');
+ self::check_array(false, $ret, 0, 'subkeys', 0, 'revoked');
+ self::check_array(true, $ret, 0, 'subkeys', 0, 'can_certify');
+ self::check_array(false, $ret, 0, 'subkeys', 0, 'can_authenticate');
+ self::check_array(false, $ret, 0, 'subkeys', 0, 'is_qualified');
+ // TODO: The is_de_vs seems to differ between gpg2 (true) and gpg1 (false) - differenatiate the test
+ //self::check_array_from_version('1.9.0', true, $ret, 0, 'subkeys', 0, 'is_de_vs');
+ self::check_array(GNUPG_PK_RSA, $ret, 0, 'subkeys', 0, 'pubkey_algo');
+ self::check_array(2048, $ret, 0, 'subkeys', 0, 'length');
+ self::check_array_from_version('1.7.0', false, $ret, 0, 'subkeys', 0, 'is_cardkey');
+ // subkey 2
+ self::check_array("9E84AE800874DFF647B6062B46DCA9B3662C7DFC", $ret, 0, 'subkeys', 1, 'fingerprint');
+ self::check_array("46DCA9B3662C7DFC", $ret, 0, 'subkeys', 1, 'keyid');
+ self::check_array(1567958444, $ret, 0, 'subkeys', 1, 'timestamp');
+ self::check_array(0, $ret, 0, 'subkeys', 1, 'expires');
+ self::check_array($secret_only, $ret, 0, 'subkeys', 1, 'is_secret');
+ self::check_array(true, $ret, 0, 'subkeys', 1, 'can_encrypt');
+ self::check_array(false, $ret, 0, 'subkeys', 1, 'can_sign');
+ self::check_array(false, $ret, 0, 'subkeys', 1, 'disabled');
+ self::check_array(false, $ret, 0, 'subkeys', 1, 'expired');
+ self::check_array(false, $ret, 0, 'subkeys', 1, 'revoked');
+ self::check_array(false, $ret, 0, 'subkeys', 1, 'can_certify');
+ self::check_array(false, $ret, 0, 'subkeys', 1, 'can_authenticate');
+ self::check_array(false, $ret, 0, 'subkeys', 1, 'is_qualified');
+ // TODO: The is_de_vs seems to differ between gpg2 (true) and gpg1 (false) - differenatiate the test
+ // self::check_array_from_version('1.9.0', true, $ret, 0, 'subkeys', 1, 'is_de_vs');
+ self::check_array(GNUPG_PK_RSA, $ret, 0, 'subkeys', 1, 'pubkey_algo');
+ self::check_array(2048, $ret, 0, 'subkeys', 1, 'length');
+ self::check_array_from_version('1.7.0', false, $ret, 0, 'subkeys', 1, 'is_cardkey');
+ }
+}
diff --git a/php-pecl-gnupg.spec b/php-pecl-gnupg.spec
index 7cec4c6..f3624ea 100644
--- a/php-pecl-gnupg.spec
+++ b/php-pecl-gnupg.spec
@@ -19,35 +19,40 @@
%else
%global ini_name 40-%{pecl_name}.ini
%endif
-#global prever RC2
+%global upstream_version 1.5.0
+%global upstream_prever RC1
Summary: Wrapper around the gpgme library
Name: %{?sub_prefix}php-pecl-gnupg
-Version: 1.4.0
-Release: 10%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}
+Version: %{upstream_version}%{?upstream_prever:~%{upstream_prever}}
+Release: 1%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}
License: BSD
URL: https://pecl.php.net/package/gnupg
-Source0: https://pecl.php.net/get/%{pecl_name}-%{version}%{?prever}.tgz
+Source0: https://pecl.php.net/get/%{pecl_name}-%{upstream_version}%{?upstream_prever}.tgz
+
+Source1: https://raw.githubusercontent.com/php-gnupg/php-gnupg/master/tests/gnupgt.inc
+Source2: https://raw.githubusercontent.com/php-gnupg/php-gnupg/master/tests/vars.inc
+Patch0: gnupg-build.patch
BuildRequires: make
BuildRequires: %{?dtsprefix}gcc
BuildRequires: %{?scl_prefix}php-devel
BuildRequires: %{?scl_prefix}php-pear
BuildRequires: gpgme-devel
-%if 0%{?fedora} >= 30 || 0%{?rhel} >= 6
+%if 0%{?rhel} == 7
BuildRequires: gnupg1
%else
-BuildRequires: gnupg < 2
+BuildRequires: gnupg
%endif
Requires: %{?scl_prefix}php(zend-abi) = %{php_zend_api}
Requires: %{?scl_prefix}php(api) = %{php_core_api}
# We force use of /usr/bin/gpg as gpg2 is unusable in non-interactive mode
-%if 0%{?fedora} >= 30 || 0%{?rhel} >= 6
+%if 0%{?rhel} == 7
Requires: gnupg1
%else
-Requires: gnupg < 2
+Requires: gnupg
%endif
%{?_sclreq:Requires: %{?scl_prefix}runtime%{?_sclreq}%{?_isa}}
@@ -62,37 +67,14 @@ Provides: %{?scl_prefix}php-pecl-%{pecl_name}%{?_isa} = %{version}-%{releas
%if "%{?packager}" == "Remi Collet" && 0%{!?scl:1} && 0%{?rhel}
# Other third party repo stuff
-Obsoletes: php53-pecl-%{pecl_name} <= %{version}
-Obsoletes: php53u-pecl-%{pecl_name} <= %{version}
-Obsoletes: php54-pecl-%{pecl_name} <= %{version}
-Obsoletes: php54w-pecl-%{pecl_name} <= %{version}
-%if "%{php_version}" > "5.5"
-Obsoletes: php55u-pecl-%{pecl_name} <= %{version}
-Obsoletes: php55w-pecl-%{pecl_name} <= %{version}
-%endif
-%if "%{php_version}" > "5.6"
-Obsoletes: php56u-pecl-%{pecl_name} <= %{version}
-Obsoletes: php56w-pecl-%{pecl_name} <= %{version}
-%endif
-%if "%{php_version}" > "7.0"
-Obsoletes: php70u-pecl-%{pecl_name} <= %{version}
-Obsoletes: php70w-pecl-%{pecl_name} <= %{version}
-%endif
-%if "%{php_version}" > "7.1"
-Obsoletes: php71u-pecl-%{pecl_name} <= %{version}
-Obsoletes: php71w-pecl-%{pecl_name} <= %{version}
-%endif
-%if "%{php_version}" > "7.2"
-Obsoletes: php72u-pecl-%{pecl_name} <= %{version}
-Obsoletes: php72w-pecl-%{pecl_name} <= %{version}
-%endif
%if "%{php_version}" > "7.3"
Obsoletes: php73-pecl-%{pecl_name} <= %{version}
-Obsoletes: php73w-pecl-%{pecl_name} <= %{version}
%endif
%if "%{php_version}" > "7.4"
Obsoletes: php74-pecl-%{pecl_name} <= %{version}
-Obsoletes: php74w-pecl-%{pecl_name} <= %{version}
+%endif
+%if "%{php_version}" > "8.0"
+Obsoletes: php80-pecl-%{pecl_name} <= %{version}
%endif
%endif
@@ -119,13 +101,15 @@ cat >%{ini_name} << 'EOF'
extension=%{pecl_name}.so
EOF
-mv %{pecl_name}-%{version}%{?prever} NTS
+mv %{pecl_name}-%{upstream_version}%{?upstream_prever} NTS
cd NTS
+cp %{SOURCE1} %{SOURCE2} tests/
+%patch0 -p1
# Check extension version
extver=$(sed -n '/#define PHP_GNUPG_VERSION/{s/.* "//;s/".*$//;p}' php_gnupg.h)
-if test "x${extver}" != "x%{version}%{?prever}"; then
- : Error: Upstream extension version is ${extver}, expecting %{version}%{?prever}.
+if test "x${extver}" != "x%{upstream_version}%{?upstream_prever}"; then
+ : Error: Upstream extension version is ${extver}, expecting %{upstream_version}%{?upstream_prever}.
exit 1
fi
cd ..
@@ -141,13 +125,19 @@ cp -r NTS ZTS
export PHP_RPATH=no
export CFLAGS="$RPM_OPT_FLAGS -D_FILE_OFFSET_BITS=64"
+%if 0%{?rhel} == 7
export GPG1=$(which gpg1 2>/dev/null || which gpg)
$GPG1 --version
+%else
+gpg --version
+%endif
peclbuild() {
%{_bindir}/${1}ize
%configure \
+%if 0%{?rhel} == 7
--with-gpg=$GPG1 \
+%endif
--with-libdir=%{_lib} \
--with-php-config=%{_bindir}/${1}-config
@@ -252,6 +242,16 @@ cd ../ZTS
%changelog
+* Mon Feb 15 2021 Remi Collet <remi@remirepo.net> - 1.5.0~RC1-1
+- Update to 1.5.0RC1
+- open https://github.com/php-gnupg/php-gnupg/pull/25
+ missing files in pecl archive
+- open https://github.com/php-gnupg/php-gnupg/pull/26
+ also cleanup socket files
+- open https://github.com/php-gnupg/php-gnupg/pull/27
+ fix build with old libgpgme 1.3
+- use gnupg version 2 (Fedora and EL-8)
+
* Tue Feb 2 2021 Remi Collet <remi@remirepo.net> - 1.4.0-10
- EL-7 rebuild
diff --git a/vars.inc b/vars.inc
new file mode 100644
index 0000000..02d2819
--- /dev/null
+++ b/vars.inc
@@ -0,0 +1,69 @@
+<?php
+putenv("GNUPGHOME=".dirname(__FILE__) . '/home');
+error_reporting (E_ALL);
+$fingerprint = "2DF0DD02DC9B70B7F64F572E669E775E0A6284B3";
+$passphrase = "blabla";
+
+$plaintext = "foo bar";
+
+$testkey =<<<EOF
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+
+lQPGBF11JawBCAC6bWTtKtAj1dBih/UHR9iH1iADEmZde52aKyd7EXKtjs4Q2aXJ
+kbn9R+kcJNx+AlnTSePQBkNz5brmEAQgk93rOsHaPUEROkfBR2C6AkjaJNnk0E43
+pbUy6bWhmGR4kmpbvRnR/7kxVyplb5zSFAcio1I8RQ3ql0HkF//zLUouYzrMJn6e
+GvffHw1revlSxo0leCcOsNE7AHGVgMxvUWYO0JT4Fs+JcpsTxG8MFE6I6SLZoY5W
+XmtOsO0vMNJoTaXdqfJoLTkviPkRUZuF0DtzuT1oQLUTTaKvWxx2+33YF5HYrlNy
+eepLFLh5mZ1/2HFWoQo2X1gFfb1R9EJPbFtJABEBAAH+BwMCTBMnieCYP1Fg2yqq
+wz42qlU7CjG2ES8+y4AgKMn4P9tB/FUUjzHHgkZRYkD0aa/3K0QrobPB/clval+h
+px6xCgz83fL4gT2xKMU5lKrwtkBjJWwk8Ju/3Mf7Ngs31YdhfRG+aypoAQRktMtB
+bSPsd364qKn9XycIy0vKelDQyNXdUhFtxixA+TJjcP3BodBluPpHDJyBAThX+5FJ
+9/FRWO3s/L9DDk+pP6spZFCt3eaNlVzKNRvRHHnYgnJWl/ylh4zU77FogvGw+h+1
+/UFp4pvV6SMOYIeda56TMKRq91goojncVZ+sX12Kh4ulwofHgX5YcInBvSkQn5a1
+APjMKV1X6iA6gEAt3+A2NHslCncxBZ4qXfQkrp9ZuSFymzCuLxjwTZWwtH5V0gCu
+3Vz1k1wwI3BQq6Piep+uFzo9Cc2Lc2IVFUtkij+FCdtaeVcJKVqWuugu+YIekqmF
+yOchuftxXVu2q0Cu/AFloG6kQt9to1zA0Mvs+wSj4zcsGqfGY8bBbwM60zTFwvty
+Nx/5HKRQhOqNm1yTP2ytq6zMqOcKkqgAi5aZWz4lwlIOWSH5R235OSqhj+rA87ju
+cur3oYI3Z7pCFm7sDTYWkYlscqN1Ofho8zwaqNrnhn61ScZ5BGk0X6UuIB8zgH+1
+aIClgDtKYh8zGonPIn6HEyL4ZD0xV05QtV/zYwEFQjETHR9JczBcBAILnRC+vA4P
++fEkmz1e/gCTrKzoEPJUN5AbGiQ535e8ngIuQcurmTYrPdDNLcivVx55Clef2cnd
+WjMEUbr3BkIa4PxXy0AVD0yHvz23GB3QjQe9A9g0GUSxc2/7TMXhomdNRDn077Tq
+rwfXpODgrO9R4rYAvB9a8iNu7tv28J5ux1TwCF+blm2TMXfOrG2L6DpgU6aM11nR
+40hXK7JgntGPtBlQSFAgR251UEcgPGdudXBnQHBocC5uZXQ+iQE4BBMBAgAiBQJd
+dSWsAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBmnndeCmKEs6NkB/wM
+UfZwKnr4G6dhh8PscOEfF1RzHi9mrUThVJ3ZXXmJrVTRofHJP2EsTM/xWNqi2zd+
+NtcTov3Le51Ze+zC2cYGQJ7A+ap5tHaCZUrv1Ec1JsoYpyi5gfQHZJRiTV6y9P3V
+hdLeOg5r/uFvkJ8d5jYWQVG0luVLdqV6tHeFz0x35EFoGkz25cPe53EM8FZg0i0a
+qCRJd8qNzlvP7hNWv5XYr7jLseSBHANN5eS/+YNkDnvXEcZPsfSQlwT6oyfTiFTF
+FEXhgVUn7HBgIZw9G1v2jX+f/3hpFPRmoggknZyCgqKUSUiGXL9zhfj/r4d4Jhlw
+AcskCkb8KQXb6LCLIhF4nQPGBF11JawBCADuN0Nw/1YHRhqR2uD9Kab+oGOYwZzx
+76cndzqbuPex9M+l3vK2X0cUqcjlYj4xeDSHtjl+rRACv4WJB9KPdQcGzBgMIpYy
+qJi+ORuLz29L3vOnfzBq7XXg0bfFoZQxAVXyqcYtWxbauyrx757+dYgE53TNcBNr
++/b7LDHZiRD0YqaPhh4j6E4RKDtm3bcCNbYR6VLHVzxqXjHDNxfRZnWKXbBbKMs2
+eon+3G4o4TuDgKxjVJt6CU7uulaJPRo0mlex7CxyTDX/+i3OuhUEhvPpFCmf0e7P
+DWPn0tqBTjW2tw0+aswPNK34gBYXngBVMxxNzS5JHT7J8zQTjrUaLd21ABEBAAH+
+BwMCTBMnieCYP1Fgnk0OYFK6aEs5UlgASAvgY8ywRnMcWZDqHxR8qTk38qsegdPe
+EIt57bmsPj8uNcIR1XXfwcrUcOxtM3uwb4zg+Bo7+AVpmnGQx3ru1hm/EvyYnok5
+REOebO09ZlzkbvPVXjAC9uuRxR8SftlRuPzIt200BL2YPQ88Is8dDH1cvzLh/L55
+TWHgCEVlR+P3plkBCjLbtqVgD+Dn0/uYjptWhEAJpEoIb9yL2SaB56kOnmT/xPLK
+dS0nzhAMznG4ITB8Dt/BZhO//nuJh9ohc4drJZFUpQFnv5mM+cAz/Zu3pFJ4xZ/f
+2us4yhzoUhZB54Ewa32Wa7ACHFsQsY353x+Vunuudv9n59k0Cg08clgn4XEwIDeY
+5Ue78mCGU7POrgG+oG0fzHxydo9ODkWFZ6blf6mgVbndjSfpD+s7eatGkVXWuk3k
+ByvKFbw8iFkN56CiKbK48QI1ZGk3X3AR3ZuahhgY1TqRETegzjlLT4aC4gBcmrtO
+GCzbGNT3f+Xhdd9JUdYHsXg9Er7nbT5vbJ/739p7cpwzzyssSJBNe855IqIb2URn
+28qzjpDGS3vVoS9UNBpRQVVxtWIImgzXQFlTzKelwHlUglmL7PdQWxJZne8ePfH2
+wZ2DukOHy8G1JoQ8ucfoJYetf1uaC20vYvXtl69tDLy03ay1GPI13DjlXHMpjNGT
+Big9KlfVH6gRs5kKR54sBoQAdAOrmkRq68Wkul5loHvgEthx9foZtU0NsatuoF9u
+BzOTqkEIRNFu5ID2CuebRLGB3XC9yQbLI4ffmYvlgTjxm6e7qcB2FKQy2qa6fiBi
+Nbtlqi0uc1JXhNKnmqkD5lD1h+GJflJAv4Z865TVk8xxejmx/roEXlmuSrJXPGaX
+GJAX4rIxslOfJ+tQ2KduKFQV9/aaz0fiiQEfBBgBAgAJBQJddSWsAhsMAAoJEGae
+d14KYoSze34H/i9Rzahdle4TMh8vsC2/bRUmiZAIeuxuc0cSuoIMn5OkfrKNwoYY
+E1HOU45SllYU3UiLZaaX5cgjM5eI6GEf8DqJNMBWXvZFBbCJGObyRhhZOFPiaw93
+nJdC6VtlEzGisgivOzS2MhznPkVeFJCEhpGMxIqrAn9UZL0oRa63UXlqQk2//eSU
+xbpRMjGePQgyWcv4Zo8F/5/X7c/GiWLftp4hLHO8uG2q4tdz76Wz0gLAXoI30P5W
+2n4fYlo08O10dTNUG/TFDUTcHVd4KI4gMXBY9a8IJjUVuApc2ufl92CyTr10u1MY
+ngBZTudrwBbKC8xx224aOk0TiDbiWftGtx4=
+=py/2
+-----END PGP PRIVATE KEY BLOCK-----
+EOF;
+?>