Compare commits

...

6 Commits
master ... sync

  1. 54
      Makefile.conf
  2. 72
      android/README.md
  3. 24
      local.conf.example
  4. 8
      src/Makefile
  5. 3
      test/java/foundation/pEp/jniadapter/test/Makefile
  6. 5
      test/java/foundation/pEp/jniadapter/test/Makefile.conf
  7. 2
      test/java/foundation/pEp/jniadapter/test/basic/Makefile
  8. 2
      test/java/foundation/pEp/jniadapter/test/jni85/Makefile
  9. 2
      test/java/foundation/pEp/jniadapter/test/jni88/Makefile
  10. 2
      test/java/foundation/pEp/jniadapter/test/jni91/Makefile
  11. 2
      test/java/foundation/pEp/jniadapter/test/jni92/Makefile
  12. 2
      test/java/foundation/pEp/jniadapter/test/jni92/TestMain.java
  13. 32
      test/java/foundation/pEp/jniadapter/test/jni94/Makefile
  14. 35
      test/java/foundation/pEp/jniadapter/test/jni94/TestMain.java
  15. 2
      test/java/foundation/pEp/jniadapter/test/regression/Makefile
  16. 210
      test/java/foundation/pEp/jniadapter/test/utils/TestUtils.java
  17. 30
      test/resources/test_keys/alice-pub.asc
  18. 57
      test/resources/test_keys/alice-sec.asc
  19. 51
      test/resources/test_keys/bob-pub.asc
  20. 105
      test/resources/test_keys/bob-sec.asc

54
Makefile.conf

@ -3,61 +3,67 @@
# This file may be used under the terms of the GNU General Public License version 3 # This file may be used under the terms of the GNU General Public License version 3
# see LICENSE.txt # see LICENSE.txt
######### Header #########
HERE:=$(dir $(lastword $(MAKEFILE_LIST))) HERE:=$(dir $(lastword $(MAKEFILE_LIST)))
PLATFORM:=$(shell uname | tr A-Z a-z)
# Guessing JAVA_HOME
ifeq ($(PLATFORM),linux) ######### General #########
JAVA_HOME=$(subst /bin,,$(dir $(realpath /usr/bin/javac))) BUILD_FOR:=$(shell uname)
endif
######### Java #########
#JAVA_HOME=
######### C and C++ ######### ######### C and C++ #########
CXXFLAGS+=-O0 -std=c++11 CXXFLAGS+=-g -O0 -std=c++11
LDFLAGS+=-shared $(ENGINE_LIB) $(AD_LIB) LDFLAGS+=-shared $(ENGINE_LIB) $(AD_LIB)
LDLIBS=-lstdc++ -lpEpEngine -lpEpAdapter LDLIBS=-lstdc++ -lpEpEngine -lpEpAdapter
CXXFLAGS+=-fpermissive -fPIC -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/$(PLATFORM) $(AD_INC) $(ENGINE_INC) CXXFLAGS+=-fpermissive -fPIC -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/$(shell uname | tr A-Z a-z) $(AD_INC) $(ENGINE_INC)
ifneq (,$(findstring g++,$(CXX))) ifneq (,$(findstring g++,$(CXX)))
CXXFLAGS+=-fdiagnostics-color=always CXXFLAGS+=-fdiagnostics-color=always
else ifneq (,$(findstring clang,$(CXX))) else ifneq (,$(findstring clang,$(CXX)))
CXXFLAGS+=-fcolor-diagnostics CXXFLAGS+=-fcolor-diagnostics
endif endif
# DEV ENV PATHS & CFG # DEV ENV PATHS & CFG
# The dev environment paths and configs are set to a default value which can be overridden by ./local.conf and overridden again by <subdir>/local.conf # The dev environment paths and configs are set to a default value which can be overridden by ./local.conf and overridden again by <subdir>/local.conf
######### Default paths for dependencies ######### ######### YML2 #########
YML2_PATH=$(HOME)/yml2 YML2_PATH=$(HOME)/yml2
YML2_PROC=$(YML2_PATH)/yml2proc $(YML2_OPTS) YML2_PROC=$(YML2_PATH)/yml2proc $(YML2_OPTS)
YML2_OPTS=--encoding=utf8 YML2_OPTS=--encoding=utf8
######### Engine #########
ENGINE_LIB_PATH=$(HOME)/lib ENGINE_LIB_PATH=$(HOME)/lib
ENGINE_INC_PATH=$(HOME)/include ENGINE_INC_PATH=$(HOME)/include
######### libAdapter #########
AD_LIB_PATH=$(HOME)/lib AD_LIB_PATH=$(HOME)/lib
AD_INC_PATH=$(HOME)/include AD_INC_PATH=$(HOME)/include
DEBUG=1
######### Overrides from the config file(s) ######### ######### Overrides #########
-include $(HERE)/local.conf -include $(HERE)/local.conf
-include $(HERE)/src/local.conf -include $(HERE)/src/local.conf
ENGINE_LIB=-L$(ENGINE_LIB_PATH) # Add Prefixes to paths, if not already explicitly set in local.conf(s)
ENGINE_INC=-I$(ENGINE_INC_PATH) ifndef ENGINE_LIB
AD_LIB=-L$(AD_LIB_PATH) ENGINE_LIB=-L$(ENGINE_LIB_PATH)
AD_INC=-I$(AD_INC_PATH) endif
ifndef ENGINE_INC
ENGINE_INC=-I$(ENGINE_INC_PATH)
endif
ifndef AD_LIB
AD_LIB=-L$(AD_LIB_PATH)
endif
ifndef AD_INC
AD_INC=-I$(AD_INC_PATH)
endif
ifdef BUILD_CONFIG ifdef BUILD_CONFIG
include $(BUILD_CONFIG) include $(BUILD_CONFIG)
endif endif
# Debug or Release build
ifeq ($(DEBUG),1)
$(info Debug build (set DEBUG=0 for release build))
CXXFLAGS+=-g
else
$(info Release Build (set DEBUG=1 for debug build))
CXXFLAGS+=-DNDEBUG=1
endif
# YML_PATH is needed in the environment of every call to a program of the YML2 distribution # YML_PATH is needed in the environment of every call to a program of the YML2 distribution
export YML_PATH=$(YML2_PATH) export YML_PATH=$(YML2_PATH)

72
android/README.md

@ -1,72 +0,0 @@
# Build pEpJNIAdapter for Android
** Asuming machine is already set up to build pEp Engine and Sequoia! **
## Install dependencies
```bash
sudo port -N install gsed wget autoconf automake libtool md5sha1sum openjdk8
## optionaly (not needed if using Android Studio)
sudo port -N install gradle
```
## Install NDK
It can be done with the SDK and the sdkmanager cli tool, or using Android Studio.
Android studio -> Configure -> SDK Manager -> SDK Tools (tab) -> Select NDK and install
Tip: To install other versions click on "Show packages details" and select the desired NDK version (Currently using: 21.0.6113669)
## Required env\_vars (for MacOS):
``` bash
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
export ANDROID_NDK=$ANDROID_SDK/ndk/21.0.6113669
export HOST_TAG=darwin-x86_64
export ANDROID_MIN_SDK_32=18
export ANDROID_MIN_SDK_64=21
export NDK_TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/$HOST_TAG
export PATH=$PATH:ANDROID_NDK/bin
```
## Add Rust android targets
```bash
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
```
Tell rust the location of the new target linker and AR
```bash
echo "
[target.aarch64-linux-android]
ar = \"$NDK_TOOLCHAIN/bin/aarch64-linux-android-ar\"
linker = \"$NDK_TOOLCHAIN/bin/aarch64-linux-android$ANDROID_MIN_SDK_64-clang\"
[target.armv7-linux-androideabi]
ar = \"$NDK_TOOLCHAIN/bin/arm-linux-androideabi-ar\"
linker = \"$NDK_TOOLCHAIN/bin/armv7a-linux-androideabi$ANDROID_MIN_SDK_32-clang\"
[target.x86_64-linux-android]
ar = \"$NDK_TOOLCHAIN/bin/x86_64-linux-android-ar\"
linker = \"$NDK_TOOLCHAIN/bin/x86_64-linux-android$ANDROID_MIN_SDK_64-clang\"
[target.i686-linux-android]
ar = \"$NDK_TOOLCHAIN/bin/i686-linux-android-ar\"
linker = \"$NDK_TOOLCHAIN/bin/i686-linux-android$ANDROID_MIN_SDK_32-clang\"
" >> $HOME/.cargo/config
```
## Build it
Open the android project with Android Studio, this will generate the file local.properties with the sdk location.
To build can be done form the Gradle menu (on the right in android studio) and select the build task, or just calling gradle build form terminal.
``` Bash
gradle build #Run inside JNIAdapter/android
```

24
local.conf.example

@ -1,24 +0,0 @@
# This is an Example build config file (local.conf)
# you might not need this file, but if the defaults dont work for you
# You can override them here.
# Tweak the values to your needs and rename it to local.conf
######### C++ Compiler #########
# Should work with clang and g++
# CXX=g++
# DEBUG=1 # DEBUG Build (Default)
# DEBUG=0 # RELEASE Build
######### JAVA #########
# JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home
######### YML2 #########
# YML2_PATH=$(HOME)/code/yml2
######### Engine #########
# ENGINE_LIB_PATH=$(HOME)/local/lib
# ENGINE_INC_PATH=$(HOME)/local/include
######### libAdapter #########
# AD_LIB_PATH=$(HOME)/local/lib
# AD_INC_PATH=$(HOME)/local/include

8
src/Makefile

@ -20,12 +20,12 @@ endif
LIBRARY=libpEpJNI.a LIBRARY=libpEpJNI.a
JAR=pEp.jar JAR=pEp.jar
ifeq ($(PLATFORM),linux) ifeq ($(BUILD_FOR),Linux)
SHARED=libpEpJNI.so SHARED=libpEpJNI.so
else ifeq ($(PLATFORM),darwin) else ifeq ($(BUILD_FOR),Darwin)
SHARED=libpEpJNI.dylib SHARED=libpEpJNI.dylib
else else
$(error I dont know how to build for $(PLATFORM).) $(error I dont know how to build for $(BUILD_FOR).)
endif endif
JAVA_SOURCES=foundation/pEp/jniadapter/AbstractEngine.java \ JAVA_SOURCES=foundation/pEp/jniadapter/AbstractEngine.java \
@ -108,8 +108,6 @@ basic_api.o: basic_api.cc jniutils.hh throw_pEp_exception.hh
.PHONY: clean .PHONY: clean
clean: clean:
rm -f $(JAR) $(LIBRARY) $(SHARED) rm -f $(JAR) $(LIBRARY) $(SHARED)
rm -f *.so
rm -f *.dylib
rm -f *.o rm -f *.o
rm -f *.class rm -f *.class
rm -f *.xml *.xsl rm -f *.xml *.xsl

3
test/java/foundation/pEp/jniadapter/test/Makefile

@ -4,7 +4,6 @@ all: compile
run: compile run: compile
$(MAKE) -C basic run $(MAKE) -C basic run
$(MAKE) -C regression run
#BROKEN $(MAKE) -C jni85 run #BROKEN $(MAKE) -C jni85 run
$(MAKE) -C jni88 run $(MAKE) -C jni88 run
$(MAKE) -C jni91 run $(MAKE) -C jni91 run
@ -13,7 +12,6 @@ run: compile
compile: compile:
$(MAKE) -C basic compile $(MAKE) -C basic compile
$(MAKE) -C regression compile
#BROKEN $(MAKE) -C jni85 compile #BROKEN $(MAKE) -C jni85 compile
$(MAKE) -C jni88 compile $(MAKE) -C jni88 compile
$(MAKE) -C jni91 compile $(MAKE) -C jni91 compile
@ -22,7 +20,6 @@ compile:
clean: clean:
$(MAKE) -C basic clean $(MAKE) -C basic clean
$(MAKE) -C regression clean
$(MAKE) -C jni85 clean $(MAKE) -C jni85 clean
$(MAKE) -C jni88 clean $(MAKE) -C jni88 clean
$(MAKE) -C jni91 clean $(MAKE) -C jni91 clean

5
test/java/foundation/pEp/jniadapter/test/Makefile.conf

@ -10,12 +10,13 @@ CLASSPATH=.:$(REPOROOT)/src
JAVA=java -Xcheck:jni -cp $(CLASSPATH) -Djava.library.path=$(CLASSPATH) JAVA=java -Xcheck:jni -cp $(CLASSPATH) -Djava.library.path=$(CLASSPATH)
$(info If on Mac, make sure to disable SIP, or copy the libpEpEngine.dylib into here)
ifdef ENGINE_LIB_PATH ifdef ENGINE_LIB_PATH
ifeq ($(PLATFORM),linux) ifeq ($(BUILD_FOR),Linux)
ifndef LD_LIBRARY_PATH ifndef LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$(ENGINE_LIB_PATH) export LD_LIBRARY_PATH=$(ENGINE_LIB_PATH)
endif endif
else ifeq ($(PLATFORM),darwin) else ifeq ($(BUILD_FOR),Darwin)
ifndef DYLD_LIBRARY_PATH ifndef DYLD_LIBRARY_PATH
export DYLD_LIBRARY_PATH=$(ENGINE_LIB_PATH) export DYLD_LIBRARY_PATH=$(ENGINE_LIB_PATH)
endif endif

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

@ -13,7 +13,7 @@ JAVA_CLASSES = \
all: compile all: compile
$(MAKE) run $(MAKE) run
run: compile clean-pep-home run: compile
cd $(JAVA_CWD);HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain cd $(JAVA_CWD);HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain
compile: $(JAVA_CLASSES) compile: $(JAVA_CLASSES)

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

@ -13,7 +13,7 @@ JAVA_CLASSES = \
all: compile all: compile
$(MAKE) run $(MAKE) run
run: compile clean-pep-home run: compile
cd $(JAVA_CWD);HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain cd $(JAVA_CWD);HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain
compile: $(JAVA_CLASSES) compile: $(JAVA_CLASSES)

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

@ -12,7 +12,7 @@ JAVA_CLASSES = \
all: compile all: compile
$(MAKE) run $(MAKE) run
run: compile clean-pep-home run: compile
cd $(JAVA_CWD);HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain cd $(JAVA_CWD);HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain
compile: $(JAVA_CLASSES) compile: $(JAVA_CLASSES)

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

@ -12,7 +12,7 @@ JAVA_CLASSES = \
all: compile all: compile
$(MAKE) run $(MAKE) run
run: compile clean-pep-home run: compile
cd $(JAVA_CWD);HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain cd $(JAVA_CWD);HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain
compile: $(JAVA_CLASSES) compile: $(JAVA_CLASSES)

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

@ -13,7 +13,7 @@ JAVA_CLASSES = \
all: compile all: compile
$(MAKE) run $(MAKE) run
run: compile clean-pep-home run: compile
cd $(JAVA_CWD);HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain cd $(JAVA_CWD);HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain
compile: $(JAVA_CLASSES) compile: $(JAVA_CLASSES)

2
test/java/foundation/pEp/jniadapter/test/jni92/TestMain.java

@ -62,7 +62,7 @@ class TestMain {
TestUtils.log("own idents: " + v.size()); TestUtils.log("own idents: " + v.size());
v.forEach( i -> { v.forEach( i -> {
TestUtils.log(TestUtils.identityToString(i, true)); TestUtils.log(TestUtils.identityToString(i));
}); });
e.getVersion(); e.getVersion();
e.OpenPGP_list_keyinfo(""); e.OpenPGP_list_keyinfo("");

32
test/java/foundation/pEp/jniadapter/test/jni94/Makefile

@ -1,32 +0,0 @@
include ../../../../../../../Makefile.conf
include ../Makefile.conf
TEST_UNIT_NAME=jni94
JAVA_CLASSES = \
TestMain.class \
../utils/TestUtils.class
.PHONY: compile run test clean
all: compile
$(MAKE) run
run: compile clean-pep-home
cd $(JAVA_CWD);HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain
compile: $(JAVA_CLASSES)
%.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:
rm -rf $(PEP_HOME_DIR)/*
rm -rf $(PEP_HOME_DIR)/.pEp

35
test/java/foundation/pEp/jniadapter/test/jni94/TestMain.java

@ -1,35 +0,0 @@
package foundation.pEp.jniadapter.test.jni94;
import foundation.pEp.jniadapter.*;
import foundation.pEp.jniadapter.test.utils.TestUtils;
import java.lang.Thread;
/*
This test tries to use the feature described in in JNI-94
https://pep.foundation/jira/browse/JNI-94
`engine.getMachineDirectory()` and `engine.getUserDirectory()`
*/
class TestMain {
public static void main(String[] args) {
Engine engine;
try {
TestUtils.logH2("Creating new Engine");
engine = new Engine();
Sync.DefaultCallback callbacks = new Sync.DefaultCallback();
engine.setMessageToSendCallback(callbacks);
TestUtils.logH2("Machine directory: ");
TestUtils.log(engine.getMachineDirectory());
TestUtils.logH2("User directory:" );
TestUtils.log(engine.getUserDirectory());
}
catch (pEpException ex) {
System.out.println("Cannot load");
return;
}
}
}

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

@ -12,7 +12,7 @@ JAVA_CLASSES = \
all: compile all: compile
$(MAKE) run $(MAKE) run
run: compile clean-pep-home run: compile
cd $(JAVA_CWD);pwd;HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain cd $(JAVA_CWD);pwd;HOME=$(JAVA_PEP_HOME_DIR) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestMain
compile: $(JAVA_CLASSES) compile: $(JAVA_CLASSES)

210
test/java/foundation/pEp/jniadapter/test/utils/TestUtils.java

@ -1,12 +1,7 @@
package foundation.pEp.jniadapter.test.utils; package foundation.pEp.jniadapter.test.utils;
import foundation.pEp.jniadapter.*; import foundation.pEp.jniadapter.*;
import java.util.ArrayList;
import java.util.Vector;
public class TestUtils { public class TestUtils {
public static void sleep(int mSec) { public static void sleep(int mSec) {
try { try {
Thread.sleep(mSec); Thread.sleep(mSec);
@ -15,195 +10,18 @@ public class TestUtils {
} }
} }
public static String identityToString(Identity i, Boolean full) { public static String identityToString(Identity i) {
String ret = ""; String ret = "address: " + i.address + "\n";
if(full) { ret += "fpr: " + i.fpr + "\n";
ret += "address: " + i.address + "\n"; ret += "username: " + i.username + "\n";
ret += "fpr: " + i.fpr + "\n"; ret += "user_id: " + i.user_id + "\n";
ret += "username: " + i.username + "\n"; ret += "flags: " + i.flags + "\n";
ret += "user_id: " + i.user_id + "\n"; ret += "lang: " + i.lang + "\n";
ret += "flags: " + i.flags + "\n"; ret += "me: " + i.me + "\n";
ret += "lang: " + i.lang + "\n"; ret += "comm_type: " + i.comm_type;
ret += "me: " + i.me + "\n";
ret += "comm_type: " + i.comm_type + "\n";
} else {
ret += i.address + "/" + i.user_id + "/" + i.fpr;
}
ret = ret.trim();
return ret; return ret;
} }
public static String msgToString(Message msg) {
String ret = "";
ret += "getAttachments: ";
try {
ret += blobListToString(msg.getAttachments()) + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "Id: ";
try {
ret += msg.getId() + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getDir: ";
try {
ret += msg.getDir().toString() + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getShortmsg: ";
try {
ret += msg.getShortmsg() + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getLongmsg: ";
try {
ret += msg.getLongmsg() + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getLongmsgFormatted: ";
try {
ret += msg.getLongmsgFormatted() + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getFrom: ";
try {
ret += identityToString(msg.getFrom(), false) + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getTo: ";
try {
ret += identityListToString(msg.getTo(), false) + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getRecvBy: ";
try {
ret += identityToString(msg.getRecvBy(), false) + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getCc: ";
try {
ret += identityListToString(msg.getCc(), false)+ "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getBcc: ";
try {
ret += identityListToString(msg.getBcc(), false) + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getReplyTo: ";
try {
ret += identityListToString(msg.getReplyTo(), false) + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getInReplyTo: ";
try {
ret += stringVectorToString(msg.getInReplyTo()) + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getReferences: ";
try {
ret += stringVectorToString(msg.getReferences()) + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getKeywords: ";
try {
ret += stringVectorToString(msg.getKeywords()) + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getComments: ";
try {
ret += msg.getComments() + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getOptFields: ";
try {
ret += stringPairListToString(msg.getOptFields()) + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret += "getEncFormat: ";
try {
ret += msg.getEncFormat().toString() + "\n";
} catch(Throwable e) {
ret += e.toString() + "\n";
}
ret = ret.trim();
return ret;
}
public static String stringVectorToString(Vector<String> vS) {
String ret = "";
for (String s : vS){
ret += s + "\n";
}
ret = ret.trim();
return ret;
}
public static String identityListToString(Vector<Identity> vI, Boolean full) {
String ret = "";
for(Identity i : vI) {
ret += identityToString(i, full) + "\n";
}
ret = ret.trim();
return ret;
}
public static String stringPairListToString(ArrayList<Pair<String, String>> opts) {
String ret = "";
for(Pair<String, String> el : opts) {
ret += el.first + "=" + el.second + "\n";
};
ret = ret.trim();
return ret;
}
public static String blobListToString(Vector<Blob> attachments) {
String ret = "";
ret += "Attachments count: " + attachments.size() + "\n";
for( Blob a: attachments) {
ret += "-----BEGIN Attachment index: " + attachments.indexOf(a) + "-----\n";
ret += a.toString();
ret += "-----END Attachment index: " + attachments.indexOf(a) + "-----\n";
}
ret = ret.trim();
return ret;
}
// ------------------------ Logging ------------------------ // ------------------------ Logging ------------------------
private static boolean logEnabled = true; private static boolean logEnabled = true;
@ -225,21 +43,23 @@ public class TestUtils {
} }
public static void logH1(String msg) { public static void logH1(String msg) {
log( getDecoratedString(msg, "=")); String decorationStr = getDecoratorString(msg, "=");
log(decorationStr + " " + msg.toUpperCase() + " " + decorationStr);
} }
public static void logH2(String msg) { public static void logH2(String msg) {
log( getDecoratedString(msg, "-")); String decorationStr = getDecoratorString(msg, "-");
log(decorationStr + " " + msg + " " + decorationStr);
} }
private static String getDecoratedString(String msg, String s) { private static String getDecoratorString(String msg, String s) {
int lineWidth = 80; int lineWidth = 80;
String decorationChar = s; String decorationChar = s;
String decorationStr = ""; String decorationStr = "";
for (int i = 0; i < Math.ceil((lineWidth - msg.length() + 2) / 2); i++) { for (int i = 0; i < Math.ceil((lineWidth - msg.length() + 2) / 2); i++) {
decorationStr += decorationChar; decorationStr += decorationChar;
} }
return decorationStr + " " + msg + " " + decorationStr; return decorationStr;
} }
public static void logSectEnd(String msg) { public static void logSectEnd(String msg) {

30
test/resources/test_keys/alice-pub.asc

@ -1,30 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBF6lj68BCAC7dqBN0DIA+gRLHeLV5v96hs+YEOEw4oqjDGTuAbnyJ0omOmKu
8I3cT6hhGoAx61O5bVogiZ5i5MUa0sJcyJa3ACH5XucHmKCrXS1m6NXtWPDrAKvy
TaMmItcF5pSR8YvRimdZ+YxcekjDMhH1Afa8SODwpMGOM9OHfNiLtJ2DAbzFXZ7E
TbNZ1CPc9jTEb7MFVnQx9Q2zsxYIAg/C3TAbMrBm+n4UX1SRhoaNcxepEvGIp0DH
u+FbG3r520HmIcSJPt0LUf0MfF3AI+t2jVCeI1ht/cyAjKdm+MqHo7vH9yCftYgT
RlF5/+oyEv1twYfFW3zb5EOeuOsJHkdgOZlFABEBAAG0GWFsaWNlIDxhbGljZUBw
ZXB0ZXN0Lm9yZz6JAVQEEwEIAD4WIQRyQ/QYAVtywQnCbE0X6rVcaHJFmgUCXqWP
rwIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRAX6rVcaHJFmgrk
B/wKW2frr+XvXr23fVg85S8S+dGEVRYbLgCehPS02y09dt4knJ7x9aHe1kGRDRYg
79hYGWcOeMMRn5MnQhUFSZIeWsXtnXzhFLRLALl3A/k+gt8cn7f2Riq2uWNFuUli
2pn+KjQduh8w+xA42OEW33UfucDWiSdoIx4cfd/SNwsUu1sS3fug62JPTzOeYeEq
QnKMMw+Cyjtq37oGaMDddWSTGurXDP7E36pkK7S1rmiiZNZZ+GyMtBIF5D0jYdMw
cwthE1N+v+Qh/1rJu2piDp12+vImDNdKP0jPHh8RDhZJlKqT5Ni+SbBYd1izs29O
KlqWzxsvmJkOwrfpEJk5XxATuQENBF6lj68BCADG2CblwipT9LtahZMrrO7d/+Vg
wh+u2ldFPRA7K37BDJkWqq2+czh/wgYEOpXhkgWLqj042+PqQwSb+quwjVv7cETI
TMW7/IViHr7rOh4JHsC92UJ74DCXYODdAwP6SYbdplgROmrT6LqRbrAwHRIz71ub
upM9dW1FpMV7MKceIfu4CNRcAiHNb/gz5ws5d+g+PicV4480jQQat1L/r+bDDX7P
sIiABdaZZgLhqEhyaEaEmARdm1Ken3Ce2faYwI6WkEGQsVmlklUq6coPRTYC2P6Y
uDNMLfMVAtLi+Qx0Ax1bNxtkJe71p1ysO6h3W+3unZ88zUNsZXB1qBhcnJNZABEB
AAGJATwEGAEIACYWIQRyQ/QYAVtywQnCbE0X6rVcaHJFmgUCXqWPrwIbDAUJA8Jn
AAAKCRAX6rVcaHJFmlPsB/wLHi7dzZ601cYIj3XZjCqEptFOZ9BSLXMLzzcfca2A
9ezoIGV0+LzwfAsTYRqi/AbQnhpoBhaE/tfnJKDFT+2+DBbCdDw7UuZXW4furW17
inyXdt9ZAU0L1/5221FNmuNGI20RepX9HsDADeRzulU1DQ7PM0OBNqNxLJE+/59/
QfEIgKrSPOQXlNtieXFPqwQGXR6Xa4no+7ma7hKPj2K8HwqAOp4S51Lwr+UnSC2J
sphDAZ6JhrnCCq12Q6blAONT9tM4uzxJE927VmFuqDIMik9tW310CNiUZWds+gN7
Qp3iKQbnleDJMUWTuF8nOphG2ifQh2LG/MoR3LI5Y8Ml
=tIZY
-----END PGP PUBLIC KEY BLOCK-----

57
test/resources/test_keys/alice-sec.asc

@ -1,57 +0,0 @@
-----BEGIN PGP PRIVATE KEY BLOCK-----
lQOYBF6lj68BCAC7dqBN0DIA+gRLHeLV5v96hs+YEOEw4oqjDGTuAbnyJ0omOmKu
8I3cT6hhGoAx61O5bVogiZ5i5MUa0sJcyJa3ACH5XucHmKCrXS1m6NXtWPDrAKvy
TaMmItcF5pSR8YvRimdZ+YxcekjDMhH1Afa8SODwpMGOM9OHfNiLtJ2DAbzFXZ7E
TbNZ1CPc9jTEb7MFVnQx9Q2zsxYIAg/C3TAbMrBm+n4UX1SRhoaNcxepEvGIp0DH
u+FbG3r520HmIcSJPt0LUf0MfF3AI+t2jVCeI1ht/cyAjKdm+MqHo7vH9yCftYgT
RlF5/+oyEv1twYfFW3zb5EOeuOsJHkdgOZlFABEBAAEAB/42PaArc6KMQssMOwT/
tDtWpfwZ+URXIy1O+Q6ZCRnW1YRwZDNaf9LkHI5RLlxKVVdfzyKlSHxyC9R2KuY+
93EYWSr7XvjE62YNv0OcQ6Fmb/YhYQvfa5RZu/nwRKPXSIcWpY+66mgw99bm1613
cU6FcybWqi0w6pD5Yme7oJJ0rYPehB0D4AVfgm35Yj7QxHr6c8mOsDB/10hOtKUI
aP6VPNa7WAFPebENLTYzenIcEzQi8HlSaImeEs4VvPq2rD7L0m0JS8vsj3BsPJhD
+ARVDti4yQuu5gvkUo5ea71YdoVcevGkk57qGNKhjHpRsOc5oQBdGjmeqEOqQjCR
BsgfBADC0ptU/CewEa9YVJKDUIyzN+MIVMjf8SEmVZjKwN5JsC6qv3W9835Mq4QC
wdJG2GqlrIW83TqblqsIwTbryVaHs94Siqt1SOgm/81T9TiFjxWiGHkLo4qrTDHj
QFVpd1jyZ4+e1WpAbtO9ZxJU8KnAdHqq0V9BSZ3LMUHPbdzCfwQA9lRrqbVlYwMh
+USFMsPySPfuzPxT9+uZuxKirS6uceg0kBx9LLtq0lS49AOsPhYh86IgETZKfOM/
f6PXJvsTzx9GoRnM7dXMrCeRevAJb+Ig+TMMchN98phrIeI/bVVFQ1O7XWXwRRrP
OpeQmbeNlWXlKTKkL2Qxswe9+UG4OjsD/1FAM+m3iGH5PwyvbzRW8bEff4g2WREJ
TlANo+P+5Cn5Li+pb391noijPgdQ2cpHzELP3aQM8RqOL3OyHwLSPsTs3Dck6z/j
KGqpi4DwaDPWPwm+fSeBJ9q4NhQ3zDhm8BQet8zQODr6BcJvF37WbKY5tMFTjyZz
mnhNbsRfGqPpPsG0GWFsaWNlIDxhbGljZUBwZXB0ZXN0Lm9yZz6JAVQEEwEIAD4W
IQRyQ/QYAVtywQnCbE0X6rVcaHJFmgUCXqWPrwIbAwUJA8JnAAULCQgHAgYVCgkI
CwIEFgIDAQIeAQIXgAAKCRAX6rVcaHJFmgrkB/wKW2frr+XvXr23fVg85S8S+dGE
VRYbLgCehPS02y09dt4knJ7x9aHe1kGRDRYg79hYGWcOeMMRn5MnQhUFSZIeWsXt
nXzhFLRLALl3A/k+gt8cn7f2Riq2uWNFuUli2pn+KjQduh8w+xA42OEW33UfucDW
iSdoIx4cfd/SNwsUu1sS3fug62JPTzOeYeEqQnKMMw+Cyjtq37oGaMDddWSTGurX
DP7E36pkK7S1rmiiZNZZ+GyMtBIF5D0jYdMwcwthE1N+v+Qh/1rJu2piDp12+vIm
DNdKP0jPHh8RDhZJlKqT5Ni+SbBYd1izs29OKlqWzxsvmJkOwrfpEJk5XxATnQOY
BF6lj68BCADG2CblwipT9LtahZMrrO7d/+Vgwh+u2ldFPRA7K37BDJkWqq2+czh/
wgYEOpXhkgWLqj042+PqQwSb+quwjVv7cETITMW7/IViHr7rOh4JHsC92UJ74DCX
YODdAwP6SYbdplgROmrT6LqRbrAwHRIz71ubupM9dW1FpMV7MKceIfu4CNRcAiHN
b/gz5ws5d+g+PicV4480jQQat1L/r+bDDX7PsIiABdaZZgLhqEhyaEaEmARdm1Ke
n3Ce2faYwI6WkEGQsVmlklUq6coPRTYC2P6YuDNMLfMVAtLi+Qx0Ax1bNxtkJe71
p1ysO6h3W+3unZ88zUNsZXB1qBhcnJNZABEBAAEAB/4qxkDH2Bbm7JSJCob4NEFG
PFAJmnjaUlnHqTUepWKlAKLF/31UpNCYmxJUQo4PciwDOWHmI1dKA5SwQSJB3obU
9fe15t36bH3894Q2cdAYQidQL7Zfk4Cgb9SvdoCajMqYT7pOKnTklQHdWyRHlVlf
FrRsMZyO8f3Jp4Jb18F7d47rhbCkt28NW6AvnUkV26iK20CF8k70kxU5Cf7cMCoA
h6Lgm8QqoXF896j3cMU3nXTC9gEsCND1BKpicoll6fJkjh7/m7PH7cu7rUzLU1wK
jY5CQys7RlciltApalNilb6SFUw500YuQLWRcgpcKEbr8s3i326V6trP0bK36tgJ
BADd+uNeDCC/R6msnWvg8eKJTgqtHgEftdAXWS72CV+lOV6um0SvGY8QdIKb7577
8eDLipBNO+qUuYIt4nU4K56vnyhYhp9Pe++A/zVdyLIxBaGRz7qT5dQgtvZmFvKU
Vu9fDrfUh78X4olDfLqgqiaNU+mw0ZzlhVHh3bILdeCRkwQA5VGQTet/jO064byo
/BmFDqGv38etLZmAyYatOhgkfYVwuL1KBhl6gzQ6yFQGYasCFJdFDX5DX2aOQR4k
ia9+6PsZ1h98IiOBkYB8mEfhAQg6WhXGkzBtdkAD4HaP4QR4SONvEt7hX9FLbO4j
4V/Yh+6HJ7uuJKRofV30Cw5dSuMEAJ18+6+DdfyT3U9VtlKoZnd8FzpiijeTDn2l
ZXAZZQ1677c0DGLDDScl52A9Dyi63otjvgtTJsZNBBlOjTrsgzpVFLOKS0/cTTim
qxxWwdchO2SNcD2MzNoZGqZX0BJm55w1kAQb81ySUmeOqGR+/OFeashlCkUsGBEn
2j7r9j5tPWWJATwEGAEIACYWIQRyQ/QYAVtywQnCbE0X6rVcaHJFmgUCXqWPrwIb
DAUJA8JnAAAKCRAX6rVcaHJFmlPsB/wLHi7dzZ601cYIj3XZjCqEptFOZ9BSLXML
zzcfca2A9ezoIGV0+LzwfAsTYRqi/AbQnhpoBhaE/tfnJKDFT+2+DBbCdDw7UuZX
W4furW17inyXdt9ZAU0L1/5221FNmuNGI20RepX9HsDADeRzulU1DQ7PM0OBNqNx
LJE+/59/QfEIgKrSPOQXlNtieXFPqwQGXR6Xa4no+7ma7hKPj2K8HwqAOp4S51Lw
r+UnSC2JsphDAZ6JhrnCCq12Q6blAONT9tM4uzxJE927VmFuqDIMik9tW310CNiU
ZWds+gN7Qp3iKQbnleDJMUWTuF8nOphG2ifQh2LG/MoR3LI5Y8Ml
=V2ss
-----END PGP PRIVATE KEY BLOCK-----

51
test/resources/test_keys/bob-pub.asc

@ -1,51 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=C4RU
-----END PGP PUBLIC KEY BLOCK-----

105
test/resources/test_keys/bob-sec.asc

@ -1,105 +0,0 @@
-----BEGIN PGP PRIVATE KEY BLOCK-----
lQcYBF6lkX0BEACua4UKu0iBZmz1/JUr3zg3oBldsTspv5CUpcK1YbROa9vrAWsK
OMBfJBAvdNPN9FQHAtEChxjSkRgI0ug48xuFHwEtEYyAV3G1cQxu9aJfyb3pr1g/
TTKzr8CK5wESZVyuDgDt7ZVWE3Z4jXI9zGS4pGbfOP2U0FL6a/nHlUE1FrgNt2dx
cda/arPX+xuUaLj6u4jMcy4kfs7p1H3TxBq8RO8gy2oEPIl31zIYOGH8a/3l0Mga
XRRrGQ14m3Ly3WuK4BPzahvtPUXXFxC1X1fxbU717XQVBBGO8z1IEXuoEYeJAKKz
ALBBUyGVxhcLclyFxm6CzpEMUp+F7xVY8C5yi5iRdSENllCOdtxdzUOay5qhASyK
BBGAFxkQjjngJW+jfonmZFPlkc+KEQCIkzHL4oOQ2Qvy9+9oWIkCwBQIBwexNMGO
H5r+HJ5RSBjPfuVNJen3rZ3Ky0KcQ5oJkB/az74CabTLC9Iml+wPrAzabzTKaksI
4V4zQVJ5SYvYqKuSdylqZ8vWVU8tfJZqcx7Mc4t75tDUO6ODtgXl6RLK2dSBQi1+
237+xW+b4r+lx4oXGBM4CD0IAO9D1I2UrVsfxJqCiJimnNXgkoFsjyYK0UntUVra
brJMSIr8yuvZnt6mvlrG2uQMnz9b+GOkJk3nZpmUD4temZgtJUyofJOooQARAQAB
AA/8CIkZeHt5d7T9UGe9Hb8C6hygcSiAW9wp5U8GrB1Xwgi0OULCAWeNPnquJ2xh
BcYBq1rUw09nhGfLqc7hxLuyP+hTBJNvG+7A5p9de5FIvMWg0MP0c8XsMm/qN8Hz
QvpejTlWi/jhoys4/nr0OW2nC4QmxqDBhBv9G4/XfZANIgh2bFwVKK+TUfMU/FT9
C10OmbKTZhHy6EqjsedksE17U3Wk0Cbe4s3a762XytNONENNUwb4a+sx2cXe62U2
vFzf65Voqd5U9zNVl3Tjq+86XLBmj1FrVLCfcq6Y8/hrDpVWW9Asph7lVo+3Z97K
95Pv+YSgRDAmAq4zwU2rGUWeYtwzwmoUXvQILruCoh3EVfX3PfN9k2JsDzTrhSH1
fxzD0nMTIcZvyS7Oguiv4zqjIc7nfnOXmZn5dhWUh2PH+aVA9GCb1X1qAAp1pHU0
oqSTeo4yse++l68TsSROz+MPsTnVJ/L16VcohXCzauyMqiVjRyEOzZiyue6WWoFX
cAYCzuT8M5/qvoHoMcrjTn9nbhPgAgdyIv2XzyJ2RyxueUZI8SQdPoyViEtsF1B/
dZOLB6lE1G7IH/sFjrBvLjswsWEK8o/CtuakEAh2e0rz2mPeVnxKBq7nEWAsHq6B
0rbWINtP+QLHw8nZKRuakjdoxkJ3EzzBawsUE7gyApOeNbsIAMDl/ORi0TKc+l1c
L/ak4rGnAIBMMJWpI0kReDHxp3blEc8QYx8yYoHvPOCM1iZr5YZMKhCMEW60Qk0H
oVSGinbYQcMmEU8bDbkOmEogSPQzS1CnmWodz6SdWyoaXYFzukL+FlWDm9Zpp+SH
kkPKiTVlnDGAui1zWgd1D/YstI+QWbJyBFddAvkUmZ5L6AyObbiVeag3dG2RzRlL
yaWn4aTa5dVI+49AMbdiX8Bhv6ASviIdYpkea+mIyS8SXeu9AZnK/2XhDCDPX2wN
2TEQ44AyEOb4mXBaid5shTQaV4bs1vDq19XA2pErLPT4p1XNT9+REnl8kjLZyhMB
pswSG0MIAOd6FY5aMM9Q9wJjzkl5KIugpWg8buBzOKJWB1O0TpXNS7r5yL+7QF0u
S9fToq9QrGTQH9QcAlmWCKCkcBG2HK6QBZiEQ9eaygZUMiVvWf96NwUQwwr1I0LK
2/dTWxNSgUBRJdH6bfuCSFnzbSqQP0MI49QI3/2bRQob53DiKj+X9pmNUvo5+gju
u0RO15fOXbHk+X6W1p0kNrQiiEjfpXilajlxlXiKIqPioaIV5PTnfksTuVdlDsGW
5oMdh8xpskUgIvzVUu+wdOVGuOpUh+jNR5r3p6LSLtiGgzFnts1/SvHc1lXJw35Z
+j5kOvvEIkA+txtEXHqcDarn+t4q5EsIAI3HIMAnUSjvdIjj48ZTokC7JCo8y1qK
J5S3VksBZ/fDLBMKg5fiZ9+uirdUPimVc2C22IVPtq3b63coIfXzoOsx96PWn+8R
W8cRUk8Bu8mhD1HJMY0nVtpXwldsjl5rv/ERFVfeEDlBPHsHRcT0VpKIhkWR21wW
2rBvJCStrurdNS5WAFBK9wpP7E2N11tUY/RRzyVfnKQImiHRJvLMbYgR5m+cj8mC
k7N1KLC+ON6YKgjhwiIg25SDQjXPkhICvthJUdouTmJqPnFKRdfrYPDNhgYUFQTH
pyybwDPpUqjagIhghrm5bUaZkIcAg6Db6pYPUBiyW7DUMvnsHibWEV2At7QVQm9i
IDxib2JAcGVwdGVzdC5vcmc+iQJUBBMBCAA+FiEE+AT74XgfPi9hWPn3Cftb2nK+
UcEFAl6lkX0CGwMFCRLMAwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQCftb
2nK+UcGg9Q//fqM9bNbMjcYRWNrevCf3h9oY3RxXbHL+HXEEE4U2yd3in1lbw7rY
AmE+lGDyWA/QGZ7ry4RZc5xHiPdqZs30GKzd0IRgFRaY67yeEoh9o6Dnrl5tvXPz
MnhPJTTzFbBU9TcWbgUkWXfMKtoIMefYbagbRgQkg+APP5qQGlrbdsviaIp5Kw+K
sThx8bPvqTPfoZlYb0Q3YnwPOZbe4PJ/S8fDLdOIyhqkM5aStRShHA6k4oV6JAii
xw8EsLVOG5FqLKcQpOkyratZglP+8a0GKF1cY6KtBwtz5KNDa1xjf+JQvNUmWXQQ
2XnAyBoXnUeCSGzYXVHpvowm4h2kKZ4I7ORlyWJJO+VI5dH6QqGKnRGgkJMpJr/l
psQMMNEtWgqzbZChYYpujGw7eltoEiiywIfOx756dRaAjbecQISW2RrhT3mVKf42
6DUNUTdKgYJxV0abhDwsxddBdy0+33sZIx7AGT+wVLheCLhGsIf6KnnHP6NVbLKO
NGRt4WDF67BsPTFQxJxjHe/TRB5OXGhHqGG2NBPqyDNxbS4Wi8UBhk9CQzyf1ZSf
RB6BrGfW7hY1nRrrC47rd/owCUelHiP/SDdWSAeZIl8wbqWvt4ZDNT7EJXWt+GlV
ry6APbf3vbKdLgq6UvZeDLY4aw5j63nsvLQFWjejmmfRyswDD64d9E2dBxcEXqWR
fQEQAL3juiA2Sfj3CYZtwQ3aheOequalb6KrQZyEBwbuE9h8g8M47n4LajURywAw
PetIhMR7mVUnj3Pfs2H6585VxXkMww5Vhgyo7SsSrBFFEBD1CRIspZGMivSYDwl0
qbSwlsjKuMrt4C1NKGBUhfTCAQBuFKJasg3j/+AYXOGxqKoWXnUX8h68A2/k6LpQ
pgXGP5mFck+OVNko9DBPDwQjj2FAUILZ9KPqlGPWObk24RtEJpkJry4zybU0Fi2/
Oi00KOh6nnxI3FcvxzbHFqUMqCusqOdbZrgk5ffIfVRO6Sw/YhlWzEwKRR320lcE
JipCag+dsh6dfR60a/6+OOWCKO3VRFB7ljUuT7O8he1MWRA/Yxpcz1Gf6CJlU/eK
CAPZwPC0/k9PdbRkLspWkPjKWnr4/0cSVDZQzBpBLm2UuqUVrSEo4BNh40sqDEw4
MrApnLEo1tctxOKVWurf0uewVV4EnwlW3QuwAFPQQ3ouOmEUiKaiY937dgHCE+2S
zlXfBojZIuzqjSQVBGm/WbjPp0KXWZYc0gqvH++ytSQcd/RuaRLkRdZRtsUvzRPK
cEI6K4nk9TZ/rEJTLE9as/BFUC8IpPb5dPm0VkoRue/lbZJtmU1OkRJYb2sq2E7h
rWcNemhEYoBeJb45eJdMvTkgmoDqys1EmdysmyfkDu5MzgCbABEBAAEAD/jZZ8fL
TMMxYgufXW/3hh/3+2Svrbminj1m28JjEzFyXemw5sqNuFDHceR5n47ehdvistNa
+Dz47aXAO2qRUjveqKRD3qcbPeayg5Swl3tNiHGNdvbl+k/qVC4WWJUnZKBxdtuC
R9cVoFrmvEVvDq99TotRVri4Lp9GcwSxYjZshi/SeeTVGDpwyCR5LHaCWSt35mrg
d8gTpk/tZcnlDNGb04bAsDCBe16c747z/2EhvP7aa7wMED756vV5nipKMIdycPE2
WpuE0HvFIfh+ZeW+gaNGcqwOwjAjARuwHkI/GewdSfZqTCSi3Q4oxX25fh1Ww7Xe
V3GcaShvZyeKA8ijVkrTNzr3hwNL/rKtxaI5RoXbMSLTt1ZtIDuOLPEoY68hd9D2
W6uncOar6DchJCFefuxh+CRkzv/vNU3F/yYyVxnHY3k+ODxWBJfNHnH3EN3U+C7T
wIF3yOSoZlsKlFeE4+PAVJO5/G/V1SrfILyklsge5EGq88VY1KBL9/K2VBQyh9jm
/CnYE0wKeaXj5mm7n8vopS44Nom+Ne7AS6/bFloIZNpPxHsoLKGiNcCT9/w11Bt0
3IRXh8DFATsmiy1Gz8I1QBH+EugkXvMzVP/+X8XYt7GjH3W59e6V5QDacmKypHXG
LyCXVrw0plJBIHOu3pdsuPjgdazRgGlDXH1RCADKRPWSa9mSSLBU2sGgZf5TOkTj
NVHvaO5+v/nVk7PI4pWj9psf21n4IvjAbFKiX7F7qY0SrbOzoG5E25fum85S3qH5
O363NtvsteZ9ftvE4jSVU412CZ5ue0IK/RKru0fnk+HqrZBaQnN03zcobQSSiA3A
+3DfGRs9cTbj4VOdiVKCugLgU5rWXaWxu9G2qaHxZTiCH3Rlsd2HDsKjbwRJt9uU
viwgQVGTXXBk7CaeIqA+ieUvKXOm/Uo8V1fwb8Kr9YAxWhEhdSl+UMLxwnCrMbPs
B1nGYjrRrcPrl8RkeVLjCKzF0fAWcfybZcx5Q2ztDrIhrPZZ7L+GwQ4a61rLCADw
VOVts9mBqu71x2eztkiXOOCN9YRREBD+5SX2ZmVv8pn+pa3rcoO5jtIw1nIjYrcf
+Pzovrx6PUcC10Lp4NTvnZGJjz3auvjYFSLQlbXmwN1R5+i8xMTnD3xhW24CyEqq
WwkvSH/SUt0QiXdB4t9/n2B7EBJEa1AGtirEBgFnJDAgviGmErsVTXzkwBVvMdRS
hF037EN99aoadvy+Ft4sXy8l4VxEKAuJwUvX8lgejmPUbulnl63gxKMoUXRIA24I
G308udV+ndwed2/1gJLj4tIqbc+dO9+2qJ/mdcHih2B4W9Ios+c7ztdSSiUUE2EY
e9PD/LWO5u/wn+u/gidxB/401GdyBsDJxXXSwZkI9UXBqPWkKRybkoDvyqLmXGQ+
v6ehezJ7p/hJzFYYZHAshKEvf17rd0sn4kwX8vrboZJ9W9UYdixBPRdboi39qHY6
i8OiYZTIREx7yy02Rk0IJ34VyGX5W7N/NxyEql0JHczITPb9HsFnBE6u5ZLYDIQ0
/OLXE4aRhIZ9uhdwFc8J1WDhC4XVggQxIoiTQNQeHLBeXAaQ+PuXGOfNOSrs6I25
ZrVJXEecjQlGB3r45c7Z4UrNPsV/m263dDm5RZnEe7bGHqHmBR/Upa18zoR0RyO3
D9f4hNuydBgWMZXn/MDyi9v4aOcZiTI+5FVVj18rxjh0oo6JAjwEGAEIACYWIQT4
BPvheB8+L2FY+fcJ+1vacr5RwQUCXqWRfQIbDAUJEswDAAAKCRAJ+1vacr5RwXi+
D/wNBo+ul4N7dyN2O8Rc1+BkR0dA3hEazfTh5TX5yf/oFkKWS/5sRvnKrxXuZ91D
LXP/i3GYq6wz8P2Zczm0qHkF07Mka2SDnM/VtU7Y2t3VT0f4uHRZ9NgnagfImxa9
jgW0qnYc5GS2m3MO5n4Twlu3Ajd4KgaspYiDgoL0yc+JvypBwsZvQ4bEGj4x2v//
V5n/y7ELhRIUNMNH0K9Dj2IxR7QrtmMaHp6WiBsSrHbSFrDAKdk9E8gM6RZwYhlS
2gaw9aiSsvIWUHeP90VmrZ9KBH32MWU0uy6JlhXEnTq6Zl0wmSh2UKFxcTEgYBb8
dRT41TNwx1E37kONSL3E9oXGXXut+nScCNLKQmj0g1ziiuQhwZ0SLSc3GS8yETS1
pROktpBPI/w2W/R3mPrIHEDDaVWDhcFb67oVzP49Hj+QNVkNGX1JFY4eZ5AoIpeD
R7hcFlB+Of2gyzgYxqEu0dXc7DqMPjjCgr+OVJvVvj0PvKWbnGwo/bk9tloFziTd
WgygNKblEml2J0EjfOpCiY+hAZ092lOuFCg1fHZtb+WC0DhKqOINOib6LBQrbp+K
Xsx/7guTWLLQJmdzu2+Y8QtyEKfuqSF3/n1VsJhuJZ7Kd24k9e8xWuq8EfYt6rCc
PKgUCW9ocpbeoHepFhc6Rur2EBJKrf6zIpAty2mQf7wkDQ==
=loxY
-----END PGP PRIVATE KEY BLOCK-----
Loading…
Cancel
Save