Browse Source

merge in default

JNI-106
heck 5 years ago
parent
commit
46c7078c7a
  1. 14
      android/build.gradle
  2. 2
      android/external/Makefile.conf
  3. 2
      android/src/foundation/pEp/jniadapter/AndroidHelper.java
  4. 50
      src/basic_api.cc
  5. 11
      src/foundation_pEp_jniadapter_AbstractEngine.cc
  6. 18
      src/gen_cpp_Engine.ysl2
  7. 19
      src/gen_java_Engine.ysl2
  8. 2
      src/jniutils.hh
  9. 44
      src/pEp.yml2
  10. 14
      test/java/foundation/pEp/jniadapter/test/jni111/TestAlice.java
  11. 37
      test/java/foundation/pEp/jniadapter/test/jni96/Makefile
  12. 70
      test/java/foundation/pEp/jniadapter/test/jni96/TestAlice.java
  13. 2
      test/java/foundation/pEp/jniadapter/test/templateAlice/Makefile
  14. 0
      test/java/foundation/pEp/jniadapter/test/templateAliceBob/TransportMessage.java
  15. 4
      test/java/foundation/pEp/jniadapter/test/utils/AdapterBaseTestContext.java
  16. 29
      test/resources/test_keys/alicenew-pub.asc
  17. 55
      test/resources/test_keys/alicenew-sec.asc

14
android/build.gradle

@ -2,7 +2,7 @@
def pEpEngineSrc = hasProperty('pEpEngineSrc') ? pEpEngineSrc : "../../pEpEngine"
def buildAutomatic = hasProperty('buildAutomatic') ? buildAutomatic : "true"
def threadsToUse = hasProperty('threadsToUse') ? threadsToUse : 2
def threadsToUse = hasProperty('threadsToUse') ? threadsToUse : 1
def pEpEngineDB = new File(new File(pEpEngineSrc), 'db')
@ -12,7 +12,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'com.android.tools.build:gradle:4.0.0'
}
}
@ -26,14 +26,13 @@ allprojects {
apply plugin: 'com.android.library'
android {
compileSdkVersion 27
buildToolsVersion '28.0.3'
compileSdkVersion 30
defaultConfig {
minSdkVersion 19
targetSdkVersion 27
versionCode 1
versionName "1.0"
targetSdkVersion 30
versionCode 2
versionName "2.1.0-RC5"
externalNativeBuild {
ndkBuild {
@ -145,6 +144,7 @@ android {
from file(new File(pEpEngineDB, 'system.db'))
into 'assets'
}
ndkVersion '21.0.6113669'
if(buildAutomatic == "true") {
buildpEpEngineSystemDB.dependsOn(buildExternal)

2
android/external/Makefile.conf

@ -20,7 +20,7 @@ NETTLE_VERSION=3.4.1
### Git deps repos
EXTERNAL_GIT_REPOS += libetpan|https://github.com/fdik/libetpan.git?HEAD
EXTERNAL_GIT_REPOS += sequoia|https://gitlab.com/husspEp/sequoia.git?80cffd395147bc76c3d763618545e66dfe977ac1
EXTERNAL_GIT_REPOS += sequoia|https://gitlab.com/sequoia-pgp/sequoia.git?b5b783f58c9b6fdb26163cb7b236ee71cfef339e
### Common variables
#### Source code targets

2
android/src/foundation/pEp/jniadapter/AndroidHelper.java

@ -28,7 +28,7 @@ public class AndroidHelper {
private static File tmpDir;
// TODO : Increment when needed.
public static int ENGINE_VERSION_CODE = 3896;
public static int ENGINE_VERSION_CODE = 4768;
private static File shareDir;

50
src/basic_api.cc

@ -252,7 +252,7 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustOwnKey(
::trust_own_key(session(), _ident);
}
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine_importKey(
JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1importKey(
JNIEnv *env,
jobject obj,
jbyteArray key
@ -271,18 +271,27 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine_importKey(
if(_key == NULL){
throw_pEp_Exception(env, PEP_OUT_OF_MEMORY);
return;
return NULL;
}
PEP_STATUS status = ::import_key(session(), _key, _size, NULL);
identity_list *_identities;
PEP_STATUS status = ::import_key(session(), _key, _size, &_identities);
if (status != PEP_STATUS_OK && status != PEP_KEY_IMPORTED) {
throw_pEp_Exception(env, status);
return;
return NULL;
}
jobject identities_ = NULL;
if (_identities) {
identities_ = from_identitylist(env, _identities);
}
env->ReleaseByteArrayElements(key, (jbyte *) _key, JNI_ABORT);
return identities_;
}
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passive_1mode(
JNIEnv *env,
jobject obj,
@ -454,6 +463,39 @@ JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getMachineD
return from_string(env, ::per_machine_directory());
}
//void logPassphraseCache() {
// try {
//// while(true) {
// pEpLog("Cache: '" << cache.latest_passphrase() << "'");
//// }
// } catch(pEp::PassphraseCache::Empty e) {
// pEpLog(e.what());
// } catch(pEp::PassphraseCache::Exhausted ex) {
// pEpLog(ex.what());
// }
//}
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passphrase
(JNIEnv * env,
jobject obj,
jbyteArray passphrase)
{
std::mutex *mutex_local = nullptr;
{
std::lock_guard<std::mutex> l(global_mutex);
pEpLog("called with lock_guard");
mutex_local = get_engine_java_object_mutex(env, obj);
}
std::lock_guard<std::mutex> l(*mutex_local);
char *_passphrase = to_string(env, passphrase);
PEP_STATUS status = ::config_passphrase(session(),cache.add(_passphrase));
if (status != 0) {
throw_pEp_Exception(env, status);
return;
}
}
} // extern "C"

11
src/foundation_pEp_jniadapter_AbstractEngine.cc

@ -5,6 +5,7 @@
#include <pEp/sync_api.h>
#include <pEp/Adapter.hh>
#include <pEp/pEpLog.hh>
#include <pEp/passphrase_cache.hh>
#include "throw_pEp_exception.hh"
#include "jniutils.hh"
@ -95,8 +96,16 @@ PEP_STATUS messageToSend(message *msg)
std::lock_guard<std::mutex> l(mutex_obj);
pEpLog("############### messageToSend() called");
jobject msg_ = nullptr;
// Passphrase
// When a protocol implementation of the p≡p engine using messageToSend() cannot sign or encrypt with an
// empty passphrase and not with the configured passphrase it is calling messageToSend() with a NULL instead
// of a struct _message object.
if (Adapter::on_sync_thread() && !msg) {
return pEp::PassphraseCache::messageToSend(cache, Adapter::session());
}
jobject msg_ = nullptr;
assert(messageClass && messageConstructorMethodID && objj && messageToSendMethodID);
msg_ = o.env()->NewObject(messageClass, messageConstructorMethodID, (jlong) msg);

18
src/gen_cpp_Engine.ysl2

@ -17,6 +17,7 @@ tstylesheet {
#include "foundation_pEp_jniadapter_«@name».h"
#include "throw_pEp_exception.hh"
#include "jniutils.hh"
#include <pEp/passphrase_cache.hh>
using pEp::Adapter::session;
using namespace pEp::JNIAdapter;
@ -62,7 +63,20 @@ tstylesheet {
apply "parm[creates|returns]", mode=out;
||
PEP_STATUS status = ::«@name»(session()`apply "parm", mode=call`);
||
choose {
when "@cached = 'true'" {
||
pEpLog("cached passphrase");
PEP_STATUS status = cache.api(::«@name»,session()`apply "parm", mode=call`);
||
} otherwise {
||
PEP_STATUS status = ::«@name»(session()`apply "parm", mode=call`);
||
}
}
||
if ((status > PEP_STATUS_OK && status < PEP_UNENCRYPTED) |`> |`
status < PEP_STATUS_OK |`> |`
status >= PEP_TRUSTWORD_NOT_FOUND) {
@ -237,6 +251,8 @@ tstylesheet {
| bool _«$name» = (bool) «$name»;
when "$type='int'"
| int _«$name» = (int) «$name»;
when "$type='string'"
| const char *_«$name» = to_string(env, «$name»);
otherwise
| √$type *_«$name» = to_«$type»(env, «$name»);
}

19
src/gen_java_Engine.ysl2

@ -43,7 +43,7 @@ tstylesheet {
const "jtype" call "toJava" with "type", "@type";
choose {
when "name(parm/*[1])='bytearray'"
when "name(parm/*[1])='bytearray|identitylist'"
||
public native «$itype» «@name»(`apply "parm/*", mode=basic_iparm`);
@ -62,7 +62,18 @@ tstylesheet {
|> return new Identity(_«@name»(`apply "parm/*", mode=basic_parm_name`));
when "@type = 'bool'"
|> return new Boolean(_«@name»(`apply "parm/*", mode=basic_parm_name`));
otherwise
when "@type = 'identitylist'" {
||
Vector<_Identity> glist = _«@name»(`apply "parm/*", mode=basic_parm_name`);
Vector<Identity> ret = new Vector<Identity>();
if(glist != null) {
for (_Identity i : glist) {
ret.add(new Identity(i));
}
}
return ret;
||
} otherwise
|> return Utils.toUTF16(_«@name»(`apply "parm/*", mode=basic_parm_name`));
}
||
@ -114,6 +125,8 @@ tstylesheet {
> IdentityList
when "name(.) = 'bool'"
> Boolean
when "name(.) = 'bytearray'"
> byte[]
otherwise
> «name(.)»
}
@ -146,6 +159,8 @@ tstylesheet {
| «$pitype» _«$pname» = «$pname».getBytes();
when "$ptype = 'bool'"
| «$pitype» _«$pname» = «$pname».booleanValue();
when "$ptype = 'bytearray'"
| «$pitype» _«$pname» = «$pname».clone();
when "$ptype = 'int'"
| «$pitype» _«$pname» = «$pname»;
when "ancestor::namespace/child::enum[@name=$ptype]"

2
src/jniutils.hh

@ -8,6 +8,7 @@
#include <pEp/bloblist.h>
#include <pEp/message.h>
#include <pEp/sync_api.h>
#include <pEp/passphrase_cache.hh>
#if 0 // Enable if log needed
#include <android/log.h>
@ -20,6 +21,7 @@
namespace pEp {
namespace JNIAdapter {
static pEp::PassphraseCache cache;
// Global mutex needs to be locked in all constructors which insert their own mutex object
// into the unordered_map (which is thread safe for read, but not for write)
extern std::mutex global_mutex;

44
src/pEp.yml2

@ -85,32 +85,32 @@ namespace pEp {
};
interface Engine {
method encrypt_message(
method cached=true encrypt_message(
in message src,
in stringlist extra,
creates message dst,
in EncFormat format,
Cconst PEP_encrypt_flags flags "0"
Cconst PEP_encrypt_flags flags "(PEP_encrypt_flags_t)0"
);
method encrypt_message_and_add_priv_key(
method cached=true encrypt_message_and_add_priv_key(
in message src,
creates message dst,
in string fpr,
Cconst PEP_enc_format encformat "PEP_enc_PEP",
Cconst PEP_encrypt_flags flags "0"
Cconst PEP_encrypt_flags flags "(PEP_encrypt_flags_t)0"
);
method encrypt_message_for_self(
method cached=true encrypt_message_for_self(
in identity target,
in message src,
in stringlist extra,
creates message dst,
Cconst PEP_enc_format encformat "PEP_enc_PEP",
Cconst PEP_encrypt_flags flags "0"
Cconst PEP_encrypt_flags flags "(PEP_encrypt_flags_t)0"
);
method decrypt_message(
method cached=true decrypt_message(
inout message src,
creates message dst,
inout stringlist keylist,
@ -150,7 +150,8 @@ namespace pEp {
returns stringlist blacklist
);
method own_message_private_key_details(
// TODO: WTF is...
method cached=true own_message_private_key_details(
in message msg,
returns identity ident
);
@ -190,7 +191,7 @@ namespace pEp {
in bool full
);
method get_message_trustwords(
method cached=true get_message_trustwords(
in message msg,
in stringlist keylist,
in identity receivedby,
@ -209,27 +210,17 @@ namespace pEp {
in identity ident
);
// old key_reset function needs to be replaced
/*
method key_reset(
in string fpr,
in identity ident
);
*/
// new key reset API
method key_reset_identity(
method cached=true key_reset_identity(
in identity ident,
in string fpr
);
method key_reset_user(
method cached=true key_reset_user(
in string userid,
in string fpr
);
method key_reset_all_own_keys();
method cached=true key_reset_all_own_keys();
method deliverHandshakeResult(
in SyncHandshakeResult shr,
@ -242,7 +233,7 @@ namespace pEp {
in identity ident
);
method disable_identity_for_sync(
method cached=true disable_identity_for_sync(
in identity ident
);
@ -250,10 +241,6 @@ namespace pEp {
in CipherSuite suite
);
method config_passphrase(
in string passphrase
);
method config_passphrase_for_new_keys(
in bool enable,
in string passphrase
@ -270,7 +257,7 @@ namespace pEp {
basic void keyResetTrust(identity ident);
basic void trustPersonalKey(identity ident);
basic void trustOwnKey(identity ident);
basic void importKey(bytearray key);
basic identitylist importKey(bytearray key);
basic void blacklist_add(string fpr);
basic void blacklist_delete(string fpr);
basic bool blacklist_is_listed(string fpr);
@ -279,6 +266,7 @@ namespace pEp {
basic string getCrashdumpLog(int maxlines);
basic string getUserDirectory();
basic string getMachineDirectory();
basic void config_passphrase(string passphrase);
};
struct message {

14
test/java/foundation/pEp/jniadapter/test/jni111/TestAlice.java

@ -1,5 +1,7 @@
package foundation.pEp.jniadapter.test.jni111;
import static foundation.pEp.pitytest.TestLogger.*;
import foundation.pEp.pitytest.*;
import foundation.pEp.pitytest.utils.TestUtils;
import foundation.pEp.jniadapter.test.utils.*;
@ -12,12 +14,16 @@ class TestAlice {
TestSuite.getDefault().setVerbose(true);
TestSuite.getDefault().setTestColor(TestUtils.TermColor.GREEN);
new TestUnit<AdapterBaseTestContext>("config_passphrase",new AdapterBaseTestContext() , ctx -> {
ctx.engine.config_passphrase("SUPERCOMPLICATEDPASSPHRASE");
AdapterBaseTestContext jni111Ctx = new AdapterBaseTestContext();
new TestUnit<AdapterBaseTestContext>("config_passphrase", jni111Ctx, ctx -> {
ctx.engine.config_passphrase("chocolate");
ctx.engine.config_passphrase("Bar");
ctx.engine.config_passphrase("Foo");
});
new TestUnit<AdapterBaseTestContext>("config_passphrase_for_new_keys",new AdapterBaseTestContext() , ctx -> {
ctx.engine.config_passphrase_for_new_keys(true, "SUPERCOMPLICATEDPASSPHRASE");
new TestUnit<AdapterBaseTestContext>("config_passphrase_for_new_keys", jni111Ctx, ctx -> {
ctx.engine.config_passphrase_for_new_keys(true, "SUPERCOMPLICATEDPASSPHRASE");
});
TestSuite.getDefault().run();

37
test/java/foundation/pEp/jniadapter/test/jni96/Makefile

@ -0,0 +1,37 @@
include ../../../../../../../Makefile.conf
include ../Makefile.conf
TEST_UNIT_NAME=jni96
JAVA_CLASSES = \
TestAlice.class \
../utils/AdapterBaseTestContext.class \
../utils/AdapterTestUtils.class \
../utils/TestCallbacks.class
.PHONY: pitytest compile alice test clean
all: alice compile
pitytest:
$(MAKE) -C $(PITYTEST_DIR)
alice: compile clean-pep-home-alice
cd $(JAVA_CWD);pwd;HOME=$(JAVA_PEP_HOME_DIR_ALICE) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestAlice
compile: $(JAVA_CLASSES) pitytest
%.class: %.java
cd $(JAVA_CWD);javac -cp $(CLASSPATH) $(JAVA_PKG_BASEPATH)/$(TEST_UNIT_NAME)/$<
clean:
rm -f $(JAVA_CLASSES)
rm -f *.class
rm -f *.log
rm -Rf .gnupg
rm -Rf .lldb
clean-pep-home: clean-pep-home-alice
clean-pep-home-alice:
rm -rf $(PEP_HOME_DIR_ALICE)/.pEp

70
test/java/foundation/pEp/jniadapter/test/jni96/TestAlice.java

@ -0,0 +1,70 @@
package foundation.pEp.jniadapter.test.jni96;
import static foundation.pEp.pitytest.TestLogger.*;
import foundation.pEp.jniadapter.Identity;
import foundation.pEp.pitytest.*;
import foundation.pEp.pitytest.utils.TestUtils;
import foundation.pEp.jniadapter.test.utils.*;
import static foundation.pEp.pitytest.TestLogger.log;
import java.util.Vector;
class TestAlice {
public static void main(String[] args) throws Exception {
TestSuite.getDefault().setVerbose(true);
TestSuite.getDefault().setTestColor(TestUtils.TermColor.GREEN);
new TestUnit<AdapterBaseTestContext>("import_key() 1 pub key",new AdapterBaseTestContext() , ctx -> {
Vector<Identity> privKeys = null;
privKeys = ctx.engine.importKey(ctx.keyAlicePub);
log(AdapterTestUtils.identityListToString(privKeys, false));
assert privKeys.size() == 0: "pub key should not be in return";
});
new TestUnit<AdapterBaseTestContext>("import_key() 1 sec key",new AdapterBaseTestContext() , ctx -> {
Vector<Identity> privKeys = null;
privKeys = ctx.engine.importKey(ctx.keyAliceSec);
log(AdapterTestUtils.identityListToString(privKeys, false));
assert privKeys.size() == 1: "imported sec key should be returned";
});
new TestUnit<AdapterBaseTestContext>("import_key() 2 pub keys",new AdapterBaseTestContext() , ctx -> {
byte[] keys = concat(ctx.keyAlicePub, ctx.keyBobPub);
Vector<Identity> privKeys = null;
privKeys = ctx.engine.importKey(keys);
log(AdapterTestUtils.identityListToString(privKeys, false));
assert privKeys.size() == 0: "imported pub keys should not be returned";
});
new TestUnit<AdapterBaseTestContext>("import_key() 2 sec keys",new AdapterBaseTestContext() , ctx -> {
byte[] keys = concat(ctx.keyAliceSec, ctx.keyBobSec);
Vector<Identity> privKeys = null;
privKeys = ctx.engine.importKey(keys);
log(AdapterTestUtils.identityListToString(privKeys, false));
assert privKeys.size() == 2: "imported sec keys should be returned";
});
new TestUnit<AdapterBaseTestContext>("import_key() 4 keys pub/sec",new AdapterBaseTestContext() , ctx -> {
byte[] keys = concat(ctx.keyAlicePub, concat(ctx.keyAliceSec, concat(ctx.keyBobPub, ctx.keyBobSec)));
Vector<Identity> privKeys = null;
privKeys = ctx.engine.importKey(keys);
log(AdapterTestUtils.identityListToString(privKeys, false));
assert privKeys.size() == 2: "nr of imported keys doesnt match";
});
TestSuite.getDefault().run();
}
public static byte[] concat(byte[] a, byte[] b) {
byte[] c = new byte[a.length + b.length];
System.arraycopy(a, 0, c, 0, a.length);
System.arraycopy(b, 0, c, a.length, b.length);
return c;
}
}

2
test/java/foundation/pEp/jniadapter/test/templateAlice/Makefile

@ -1,7 +1,7 @@
include ../../../../../../../Makefile.conf
include ../Makefile.conf
TEST_UNIT_NAME=templateAliceBob
TEST_UNIT_NAME=templateAlice
JAVA_CLASSES = \
TestAlice.class \

0
test/java/foundation/pEp/jniadapter/test/templateAliceBob/transportMessage.java → test/java/foundation/pEp/jniadapter/test/templateAliceBob/TransportMessage.java

4
test/java/foundation/pEp/jniadapter/test/utils/AdapterBaseTestContext.java

@ -44,10 +44,10 @@ public class AdapterBaseTestContext extends AbstractTestContext {
private String filenameBobPub = "../resources/test_keys/bob-pub.asc";
public byte[] keyAlicePub;
private String filenameAlicePub = "../resources/test_keys/alice-pub.asc";
private String filenameAlicePub = "../resources/test_keys/alicenew-pub.asc";
public byte[] keyAliceSec;
private String filenameAliceSec = "../resources/test_keys/alice-sec.asc";
private String filenameAliceSec = "../resources/test_keys/alicenew-sec.asc";
// Messages
public Message msgToSelf;

29
test/resources/test_keys/alicenew-pub.asc

@ -0,0 +1,29 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBF77LLsBEACxl2LCTG3LX0wPSO0N1xV7AZ2eaDWoN7OvtHLAfue97NN+Pgno
Y5hPIoDnj5IeV3wfmB7DSYGZcCDwxQB08jWYfQabCslb+Y3lvFoudI5Ju02vBJgD
UUCJKxTDB63OOd0ip+xZVCImqB3wk6XjzMNQHhWO7tm82kr/VavTu4s2eUQYYwJ7
zDXvNubwNVEANaEgzvlSryALoc9rjSNa6c7RYOKKXKCgu3dBzMahI41XvLEA0SP9
9IK83/1tJo/Vtx8e38m+/2Jok1DBR2umfum7cX296RueS6ZIZyDgJ4tLTbtJ/vOC
oxBPDnwKYakEGRHTi2ZJS/TCh21XWMeRap1UGgLPBkwyuU4+Rr8unEglrgUfHw5t
jPfoDb02jyFXlG+O+X7PQAxPU9dynDx2Be8UJsPU+5qyZsDH8yl11reWEOtkIa+s
XQ9kkK5MQ+v4Pa1OfGIccFq4ugsWscqEDVCLNfdxqaAU8WSZza7E3LR4poKHVe10
wzctxDu+aJNqOKDePdMBkp3zej5rZkm97a3DJa5IsWGfluaV02kl0hg27/lP6yu1
n8oS/GSnRh7O2gL9T7m0JO6Rfhsc/LOy+5/MAl5Jven/qtdRYPm9HEF3lj4zebPS
V1j1kkSuGjSnJWyouz5Zt8a520WN1i81iOZWYjC/Kdm3g9a6rKUvjXXmQwARAQAB
tBlhbGljZSA8YWxpY2VAcGVwdGVzdC5vcmc+iQJUBBMBCgA+FiEEpQcDf0hg4gMz
sPkzUANH/1pQNMUFAl77LLsCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgEC
F4AACgkQUANH/1pQNMWs/hAApmKtGrgNcdvfecKjV+6tCApp6enFqMOZj/JxUV6R
3ihMD7bvQtlww+TyqL3OjCSJn/28t93QAjJvFPQRI9cq0p9F0WaxXqmUH8O+f6mz
rgpbnBDJzujBNOTFXJO8CygxD7r2g3ymxIycB3x9LNKg0id0uBKPyOaMFmaB9BrW
pn6TngljSHEjzmxDp1ERKxbHRhqhQishh3xIB0hPUdOIyy00nEknG7q/CIqqb8In
iLs+G7l4g/ARpjxTucZj0/h1svsY1uB52JgsfL88bgu/ir8lmg0AWkd/AEN9WSit
0ZgxEcVnqP3MxkJMaQipWXYtzGpKrmOnEh+D9Ni4Y1gw/4p6gCR+nlfY54JftSG5
btniW+aqleTwqTqaJtOyAg5D4y2lulnMyrIkA2hnJjY5fin4LUBAW6IgsmqcdCUT
RJmwOJIa466AROUMDL/tdErYhVVTSTAeuQD/VE2rfwmYrVXRg3mGYZS++hG9rXEF
IN7L6SzgKNO84WSHjmQi9o1XMXGYPc4w7ICG/vwxwlpDeTEYNQknDTnZNS8mdqtU
x1zjgOVfs4bfotWxh3KV0ZbwQyZw+jhcbb/bU2VxUMEKyN3sRxMYuo5lGNLShVFx
mE9bF+17VxGQIQvcne1kfETNdGJPH15Zt1hLACSmwn5H5wy+yj9ZhtLpmNuHMO7V
qf8=
=40gV
-----END PGP PUBLIC KEY BLOCK-----

55
test/resources/test_keys/alicenew-sec.asc

@ -0,0 +1,55 @@
-----BEGIN PGP PRIVATE KEY BLOCK-----
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
=4Oz/
-----END PGP PRIVATE KEY BLOCK-----
Loading…
Cancel
Save