Compare commits

...

16 Commits

Author SHA1 Message Date
  David Lanzendörfer a0254400b4 z/OS support: Fix C function collision 4 weeks ago
  David Lanzendörfer b3010e0e76 z/OS support: Adding test 1 month ago
  David Lanzendörfer 604ea9bc5b Fixing issue with indention 2 months ago
  David Lanzendörfer 4dc9ec7701 OK. Now that should not fail anymore on OBS 3 months ago
  David Lanzendörfer db8a83d8c3 Avoid errors on some platforms 3 months ago
  David Lanzendörfer 7af0b7d53b SO version right now is 3.2.0 3 months ago
  David Lanzendörfer aeb438f9eb Fixed standalone compilation 3 months ago
  David Lanzendörfer 9a59cea95c Correcting flags 3 months ago
  David Lanzendörfer 9e1dd39f42 Proper installation 3 months ago
  David Lanzendörfer 33820f82ef Generate libpEpMIME.so HERE 3 months ago
  David Lanzendörfer b797b5c3f8 API functions aren't exported in the shared object... 3 months ago
  David Lanzendörfer 4ae9f5a618 Splitting up installs further 2 months ago
  David Lanzendörfer 50d6c0d10d Doing the install properly, separate header and libs 2 months ago
  David Lanzendörfer 8479cefcf0 dependencies 2 months ago
  David Lanzendörfer 60d50d571c Fix install paths and so 2 months ago
  David Lanzendörfer 18bd13d79b Remove hidden flag 3 months ago
9 changed files with 252 additions and 67 deletions
Split View
  1. +20
    -4
      Makefile.conf
  2. +1
    -1
      db/Makefile
  3. +9
    -5
      pEpMIME/Makefile
  4. +58
    -55
      src/Makefile
  5. +1
    -1
      src/pEpEngine.c
  6. +10
    -1
      src/pEpEngine.h
  7. +108
    -0
      test/src/MainFrameTest.cc
  8. +17
    -0
      test/zos_key.asc
  9. +28
    -0
      test/zos_priv.asc

+ 20
- 4
Makefile.conf View File

@ -40,6 +40,7 @@ endif
# Installation path prefix for libraries and binaries, except for system.db
PREFIX=$(HOME)
LIBDIR=$(PREFIX)/lib
# pEp files and directories
#
@ -56,11 +57,26 @@ PER_MACHINE_DIRECTORY=/usr/local/share/pEp
ifeq ($(BUILD_FOR),OS/390)
TARGET=libpEpEngine.so
else ifeq ($(BUILD_FOR),Linux)
TARGET=libpEpEngine.so
TARGET=libpEpEngine.so.3.2.0
else ifeq ($(BUILD_FOR),Darwin)
TARGET=libpEpEngine.dylib
endif
# Filename of the pEpMIME library, in case of being built
ifeq ($(BUILD_FOR),OS/390)
PEP_MIME_TARGET=libpEpMIME.so
PEP_MIME_SONAME=libpEpMIME.so
PEP_MIME_CPPFLAGS==-W "l,xplink,dll" -W "c,float(ieee),xplink,dll,exportall"
else ifeq ($(BUILD_FOR),Linux)
PEP_MIME_TARGET=libpEpMIME.so
PEP_MIME_SONAME=libpEpMIME.so.3.2.0
PEP_MIME_CPPFLAGS=-Wl,-soname=libpEpMIME.so.3.2.0 -shared
else ifeq ($(BUILD_FOR),Darwin)
PEP_MIME_TARGET=libpEpMIME.dylib
PEP_MIME_SONAME=libpEpMIME.dylib
PEP_MIME_CPPFLAGS=""
endif
# If empty, create a release build.
# Otherwise, create a debug build.
# This variable is ineffective when set anywhere else but here.
@ -224,11 +240,10 @@ ifeq ($(BUILD_FOR),OS/390)
else ifeq ($(BUILD_FOR),Darwin)
CPPFLAGS+=-D_DARWIN_C_SOURCE
else
CPPFLAGS=-Wl,-soname,$(TARGET)
LDLIBS+=-luuid
endif
######### YML2 #########
YML2_PATH=$(HOME)/yml2
@ -361,13 +376,14 @@ export YML_PATH=$(YML2_PATH)
# Postprocess for pEpMIME
ifdef PEP_MIME
# Replace c++11 with c++14 for now (limiting the subst to the ++11 means it doesn't matter if gnu or not)
CXXFLAGS:=$(subst ++11,++14,$(CXXFLAGS)) -fPIC -fvisibility=hidden
CXXFLAGS:=$(subst ++11,++14,$(CXXFLAGS)) -fPIC
endif
ifdef PEP_MIME
ifndef PEP_MIME_SRC
$(error "Compiling with the PEP_MIME option set requires the value of PEP_MIME_SRC to be set to the source directory for libpEpMIME")
else
CPPFLAGS+=-DPEP_BUILTIN_MIME
LDFLAGS+=-L../pEpMIME/
ifneq ($(BUILD_ON),OS/390)
LDLIBS+=-lstdc++
endif


+ 1
- 1
db/Makefile View File

@ -12,7 +12,7 @@ DICOS = $(wildcard *.csv)
# The 'mv' keeps a backup db around
system.db: create_system_db.sql $(DICOS)
-mv -f $@ $@~
if [ -f $@ ]; then mv -f $@ $@~; fi;
sqlite3 -batch $@ < $<
for c in $(DICOS) ; do echo "$$c" ; echo .import "$$c" wordlist | sqlite3 -batch -csv $@ ; done


+ 9
- 5
pEpMIME/Makefile View File

@ -55,7 +55,7 @@ LOCAL_PEPMIME_SRC:= $(subst $(PEP_MIME_SRC)/,,$(PEPMIME_SRC_FILES))
all: lib
lib: mimesrc libpEpMIME.a
lib: mimesrc libpEpMIME.a $(PEP_MIME_TARGET)
mimesrc: ${LOCAL_PEPMIME_SRC}
@ -81,11 +81,14 @@ LIB_OBJ=pEpMIME.o pEpMIME_internal.o rules.o bodyparser.o \
libpEpMIME.a: $(LIB_OBJ)
${AR} rcs $@ $^
$(PEP_MIME_TARGET): $(LIB_OBJ)
${CXX} -o $@ ${PEP_MIME_CPPFLAGS} ${LDFLAGS} ${LDLIBS} ${PEP_MIME_CPPFLAGS} $^
%.o : %.cc %.hh
${CXX} ${CXXFLAGS} ${CPPFLAGS} -I${PREFIX}/include -o $@ -c $<
${CXX} -o $@ ${CXXFLAGS} -I${PREFIX}/include -c $<
%.o : %.cc
${CXX} ${CXXFLAGS} ${CPPFLAGS} -I${PREFIX}/include -o $@ -c $<
${CXX} -o $@ ${CXXFLAGS} -I${PREFIX}/include -c $<
clean:
rm -vf *.o *.a
@ -94,8 +97,9 @@ srcclean:
rm *.cc *.hh *.hxx
install: lib
mkdir -p "$(DESTDIR)$(PREFIX)/lib/"
cp -v libpEpMIME.a $(DESTDIR)$(PREFIX)/lib
install -d $(DESTDIR)$(LIBDIR)
install -m644 -t $(DESTDIR)$(LIBDIR) libpEpMIME.a
install -m755 -T $(PEP_MIME_TARGET) $(DESTDIR)$(LIBDIR)/$(PEP_MIME_SONAME)
uninstall:
rm $(DESTDIR)$(PREFIX)/lib/libpEpMIME.a


+ 58
- 55
src/Makefile View File

@ -13,15 +13,15 @@ NO_SOURCE=
ifndef PEP_MIME
ifeq ($(BUILD_ON),OS/390)
LDLIBS+= -letpan-no-mt
LDLIBS+= -letpan-no-mt
else
LDLIBS+= -letpan
LDLIBS+= -letpan
endif
else
LDLIBS+= -lpEpMIME
NO_SOURCE+= etpan_mime.c
LDLIBS+= -lpEpMIME
NO_SOURCE+= etpan_mime.c
endif
CFLAGS+= -I../asn.1 $(EXTRA_MACROS)
CPPFLAGS+= -DSQLITE_THREADSAFE=1
@ -33,53 +33,53 @@ endif
LDLIBS+= -lasn1
ifeq ($(BUILD_ON),OS/390)
OPENPGP=NETPGP
LDLIBS+= -lzz
OPENPGP=NETPGP
LDLIBS+= -lzz
else ifeq ($(BUILD_ON),Darwin)
ifeq ($(BUILD_FOR),Darwin)
LDLIBS+= -lz -liconv -mmacosx-version-min=10.10
else
$(error I do not know how to make for $(BUILD_FOR) on $(BUILD_ON))
endif
ifeq ($(BUILD_FOR),Darwin)
LDLIBS+= -lz -liconv -mmacosx-version-min=10.10
else
$(error I do not know how to make for $(BUILD_FOR) on $(BUILD_ON))
endif
else ifeq ($(BUILD_ON),Linux)
ifeq ($(BUILD_FOR),Linux)
CPPFLAGS+= -D_GNU_SOURCE
LDLIBS+= -ldl -luuid
else
$(error I do not know how to make for $(BUILD_FOR) on $(BUILD_ON))
endif
ifeq ($(BUILD_FOR),Linux)
CPPFLAGS+= -D_GNU_SOURCE
LDLIBS+= -ldl -luuid
else
$(error I do not know how to make for $(BUILD_FOR) on $(BUILD_ON))
endif
else
$(error I do not know how to make for $(BUILD_FOR) on $(BUILD_ON))
$(error I do not know how to make for $(BUILD_FOR) on $(BUILD_ON))
endif
ifdef SQLITE3_FROM_OS
NO_SOURCE+= sqlite3.c
CPPFLAGS+= -DSQLITE3_FROM_OS
LDLIBS+= -lsqlite3
NO_SOURCE+= sqlite3.c
CPPFLAGS+= -DSQLITE3_FROM_OS
LDLIBS+= -lsqlite3
endif
ifeq ($(OPENPGP),SEQUOIA)
CPPFLAGS+= -DUSE_SEQUOIA
CFLAGS+= $(SEQUOIA_CFLAGS) $(SEQUOIA_INC)
LDFLAGS+= $(SEQUOIA_LDFLAGS)
LDLIBS+= $(SEQUOIA_LIB)
NO_SOURCE+=pgp_netpgp.c
CPPFLAGS+= -DUSE_SEQUOIA
CFLAGS+= $(SEQUOIA_CFLAGS) $(SEQUOIA_INC)
LDFLAGS+= $(SEQUOIA_LDFLAGS)
LDLIBS+= $(SEQUOIA_LIB)
NO_SOURCE+=pgp_netpgp.c
else ifeq ($(OPENPGP),NETPGP)
CPPFLAGS+= -DUSE_NETPGP
CFLAGS+= $(NETPGP_CFLAGS) $(NETPGP_INC)
LDFLAGS+= $(NETPGP_LDFLAGS)
LDLIBS+= $(NETPGP_LIB)
NO_SOURCE+=pgp_sequoia.c
CPPFLAGS+= -DUSE_NETPGP
CFLAGS+= $(NETPGP_CFLAGS) $(NETPGP_INC)
LDFLAGS+= $(NETPGP_LDFLAGS)
LDLIBS+= $(NETPGP_LIB)
NO_SOURCE+=pgp_sequoia.c
else
$(error Unknown OpenPGP library: $(OPENPGP))
$(error Unknown OpenPGP library: $(OPENPGP))
endif
ALL_SOURCE=$(filter-out $(NO_SOURCE),$(wildcard *.c))
DEPENDS=$(subst .c,.d,$(ALL_SOURCE))
ALL_OBJECTS=$(subst .c,.o,$(ALL_SOURCE))
ifeq ($(BUILD_ON),OS/390)
ALL_OBJECTS+=/usr/lib/GSKCMS64.x
ALL_OBJECTS+=/usr/lib/CSNPCA64.x
ALL_OBJECTS+=/usr/lib/GSKCMS64.x
ALL_OBJECTS+=/usr/lib/CSNPCA64.x
endif
all: $(TARGET)
@ -94,12 +94,12 @@ all: $(TARGET)
# Do not generate and include the '%.d' files if cleaning or uninstalling.
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(MAKECMDGOALS),uninstall)
-include $(DEPENDS)
endif
ifneq ($(MAKECMDGOALS),uninstall)
-include $(DEPENDS)
endif
endif
$(TARGET): libpEpEngine.a
$(TARGET): $(ALL_OBJECTS)
$(CC) -o $@ $(CPPFLAGS) $(LDFLAGS) $(CFLAGS) $(ALL_OBJECTS) $(LDLIBS)
.PHONY: objects clean install_headers install uninstall beinstall
@ -115,30 +115,33 @@ clean:
rm -f KeySync_fsm.* Sync_actions.c Sync_event.* Sync_func.* Sync_impl.* sync_codec.* distribution_codec.* storage_codec.*
HEADERS_TO_INSTALL = \
pEpEngine.h keymanagement.h message_api.h dynamic_api.h stringlist.h \
timestamp.h identity_list.h bloblist.h stringpair.h message.h mime.h group.h \
cryptotech.h sync_api.h pEp_string.h openpgp_compat.h engine_sql.h \
labeled_int_list.h key_reset.h base64.h sync_codec.h distribution_codec.h \
storage_codec.h status_to_string.h keyreset_command.h platform.h \
platform_unix.h platform_windows.h platform_zos.h \
transport.h growing_buf.h $(wildcard ../asn.1/*.h)
pEpEngine.h keymanagement.h message_api.h dynamic_api.h stringlist.h \
timestamp.h identity_list.h bloblist.h stringpair.h message.h mime.h group.h \
cryptotech.h sync_api.h pEp_string.h openpgp_compat.h engine_sql.h \
labeled_int_list.h key_reset.h base64.h sync_codec.h distribution_codec.h \
storage_codec.h status_to_string.h keyreset_command.h platform.h \
platform_unix.h platform_windows.h platform_zos.h \
transport.h growing_buf.h $(wildcard ../asn.1/*.h)
# CAVEAT:
# install_headers is needed for building *STANDALONE* pEp MIME - it is NOT used for built-in functionality!!!
install_headers: $(TARGET)
mkdir -p $(DESTDIR)$(PREFIX)/include/pEp
cp $(HEADERS_TO_INSTALL) $(DESTDIR)$(PREFIX)/include/pEp/
install -d $(DESTDIR)$(PREFIX)/include/pEp
install -m644 -t $(DESTDIR)$(PREFIX)/include/pEp $(HEADERS_TO_INSTALL)
install_lib: $(TARGET)
install -d $(DESTDIR)$(LIBDIR)
install -m755 -t $(DESTDIR)$(LIBDIR) $<
install_archive: libpEpEngine.a
mkdir -p $(DESTDIR)$(LIBDIR)
install -m755 -t $(DESTDIR)$(LIBDIR) libpEpEngine.a
# FIXME: Does anyone but Roker use install_headers? Otherwise, remove the dependency.
# I occasionally use it. --positron
install: $(TARGET) install_headers
mkdir -p "$(DESTDIR)$(PREFIX)/lib/"
cp -v $< $(DESTDIR)$(PREFIX)/lib/
cp -v libpEpEngine.a $(DESTDIR)$(PREFIX)/lib/
install: install_lib install_archive install_headers
beinstall: install
cp platform*.h $(DESTDIR)$(PREFIX)/include/pEp/
install -m644 -t $(DESTDIR)$(PREFIX)/include/pEp platform*.h
uninstall:
rm -f $(DESTDIR)$(PREFIX)/lib/$(TARGET)


+ 1
- 1
src/pEpEngine.c View File

@ -133,7 +133,7 @@ pEp_error:
return status;
}
DYNAMIC_API void release(PEP_SESSION session)
DYNAMIC_API void pep_release(PEP_SESSION session)
{
bool out_last = false;
int _count = --init_count;


+ 10
- 1
src/pEpEngine.h View File

@ -11,6 +11,10 @@
extern "C" {
#endif
#define release _release
#include <stdlib.h>
#undef release
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
@ -382,7 +386,12 @@ DYNAMIC_API PEP_STATUS init(
*
*/
DYNAMIC_API void release(PEP_SESSION session);
DYNAMIC_API void pep_release(PEP_SESSION session);
#if defined (__MVS__)
#define release(X) _Generic(X, void *:_release, struct _pEpSession *:pep_release)(X)
#else
#define release(X) pep_release(X)
#endif
/**
* <!-- config_passive_mode() -->


+ 108
- 0
test/src/MainFrameTest.cc View File

@ -0,0 +1,108 @@
// This file is under GNU General Public License 3.0
// see LICENSE.txt
#include <string.h>
#include <iostream>
#include <fstream>
#include <string>
#include <cstring> // for strcmp()
#include "platform.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include "keymanagement.h"
#include "message_api.h"
#include "mime.h"
#include "TestUtilities.h" // for slurp()
#include "TestConstants.h"
#include "Engine.h"
#include <gtest/gtest.h>
namespace {
//The fixture for MainFrameTest
class MainFrameTest : public ::testing::Test {
public:
Engine* engine;
PEP_SESSION session;
protected:
// You can remove any or all of the following functions if its body
// is empty.
MainFrameTest() {
// You can do set-up work for each test here.
test_suite_name = ::testing::UnitTest::GetInstance()->current_test_info()->GTEST_SUITE_SYM();
test_name = ::testing::UnitTest::GetInstance()->current_test_info()->name();
test_path = get_main_test_home_dir() + "/" + test_suite_name + "/" + test_name;
}
~MainFrameTest() override {
// You can do clean-up work that doesn't throw exceptions here.
}
// If the constructor and destructor are not enough for setting up
// and cleaning up each test, you can define the following methods:
void SetUp() override {
// Code here will be called immediately after the constructor (right
// before each test).
// Leave this empty if there are no files to copy to the home directory path
std::vector<std::pair<std::string, std::string>> init_files = std::vector<std::pair<std::string, std::string>>();
// Get a new test Engine.
engine = new Engine(test_path);
ASSERT_NOTNULL(engine);
// Ok, let's initialize test directories etc.
engine->prep(NULL, NULL, NULL, init_files);
// Ok, try to start this bugger.
engine->start();
ASSERT_NOTNULL(engine->session);
session = engine->session;
// Engine is up. Keep on truckin'
}
void TearDown() override {
// Code here will be called immediately after each test (right
// before the destructor).
engine->shut_down();
delete engine;
engine = NULL;
session = NULL;
}
private:
const char* test_suite_name;
const char* test_name;
string test_path;
// Objects declared here can be used by all tests in the AppleMailTest suite.
};
} // namespace
TEST_F( MainFrameTest, check_generation_of_keypairs ) {
char* keydata = NULL;
ofstream outfile;
size_t size = 0;
PEP_STATUS status = PEP_STATUS_OK;
char *uniqname = strdup("IBMtestuser@testdomain.org");
pEp_identity * me = new_identity(uniqname, NULL, NULL, "IBM Test User");
status = generate_keypair(session, me);
status = export_secret_key(session, me->fpr, &keydata, &size);
outfile.open("zos_priv.asc");
outfile << keydata;
outfile.close();
status = export_key(session, me->fpr, &keydata, &size);
outfile.open("zos_key.asc");
outfile << keydata;
outfile.close();
}

+ 17
- 0
test/zos_key.asc View File

@ -0,0 +1,17 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: NetPGP for pEp 3.99.99/[beta0]
xsBNBGEDFTYBCAC6QzH8CrAAqEfu+nb3xRTliryJCRYZhTuZlAMDcZCMgE6puwR6cUfcdGs0i7tV
yH9XMpJUlMAASM0JGta3tyOkq/JFUzhTrPhjcSYwmYnZ+/WAoaXnNUpz1Rxa4edOxIxommdoii5Q
j2HYRXgJTZ1R2kMpIbu1l6WV4j2c5jmB7qFbHorPKvyaF5DmYpbAT+S9QAIESmFY+O/07ENkGfBm
cPa+QivV9CYTYb18iI/SZWCsseLTuGjgx28Wy7UsW0yE9oQzduQxqcmDCqa36hoL+8pvaquLImOY
Oxdb4ppxY9ZOc/oRYfl0UQaKi3orQB6i1VHcOnlucY95JHvH8uuzABEBAAHNKklCTSBUZXN0IFVz
ZXIgPElCTXRlc3R1c2VyQHRlc3Rkb21haW4ub3JnPsLAegQTAQIALgUCYQMVNgUJAeEzgAkQ6cHv
0/o4jq0CGQECGwYECwkHAgYVCAIJCgsCFgICHgEAAFuVB/9+hnE2pPC030mRLoa98TUkcNDj6pRi
rMgCpS+9xPgrqXaJgFsi7yjbqStfpYMn2eish8WGQKPxr20J4qjC4nR3qbWyiU5L+f7lMZWWEx3Q
zcHo5j3ItPh8ngrU9HQxUySl4J6Rcaml9lGX6l1NCNIn7+1ve7A6DxGHjHXXgcPOnPtYMxt8tpcx
tzSumvFasHvRvFZJwnbyCauxLoEo3vHnkoSrdNt8ZQQsKq5Rp9SdxGEY5ddoxWHrs0IPh7C947Qu
3SK+/wXnJkyQuLFWh93b2yNvaUZ9rZmHh3KIm1Wm/dSf+XnI1qRwd4/f2l8iL/nan2B7SPEB0rpd
5GaQS1I0
=ZKYr
-----END PGP PUBLIC KEY BLOCK-----

+ 28
- 0
test/zos_priv.asc View File

@ -0,0 +1,28 @@
-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: NetPGP for pEp 3.99.99/[beta0]
xcLYBGEDFTYBCAC6QzH8CrAAqEfu+nb3xRTliryJCRYZhTuZlAMDcZCMgE6puwR6cUfcdGs0i7tV
yH9XMpJUlMAASM0JGta3tyOkq/JFUzhTrPhjcSYwmYnZ+/WAoaXnNUpz1Rxa4edOxIxommdoii5Q
j2HYRXgJTZ1R2kMpIbu1l6WV4j2c5jmB7qFbHorPKvyaF5DmYpbAT+S9QAIESmFY+O/07ENkGfBm
cPa+QivV9CYTYb18iI/SZWCsseLTuGjgx28Wy7UsW0yE9oQzduQxqcmDCqa36hoL+8pvaquLImOY
Oxdb4ppxY9ZOc/oRYfl0UQaKi3orQB6i1VHcOnlucY95JHvH8uuzABEBAAEAB/sHikLSvigDzswi
q3b3br360NPzBDAl1lPkUq6QjB9a4LLOgiibQEy1au0QEnwB6/zjrcNosyDWohvSu4hnpX1G5EMJ
dWX5VS408Faobv66mU2F6IVLx8d8yuq77xsrAB/i+CUpgTaAwl0moSFL1x2AO8KuPpRXtIzadW8j
E9rOHKYsRIOt6qXRrnlLwMeiApB7cRSn9Em8YMsQtdm9NHJauYY2/ENUOji2TscrH3yMm93exNLT
05rKUL3ldFh6ZEPYZT6ufNs8a7vyp1Zz4AjwkhbqLKK47NhMkosaCooog6cjWY+WCd1N8zgjXIbO
lEC7bzVjuseCDM9mAX650UiJBADnIbJmsE6h4Ttw5ggEYKlo67e29d+6WV4H1Dn9tRSC7+b4ahu7
PvKyCfooss6mLoG+WNX5Om8z9PeSyKsrgQy8FsrLi17EPmG2bjMk1JNp40JSclnGioukl7w/4fDO
cF22GjGrOWLAbLWAk2UwH4p6STfjRN9i7PbA04Y1OhkWXwQAzk2etZe8ohimkp1wiQiwkW7DoL12
jRLaW3yROkq+1gvsneGpWkCXBo+UyouFQh3Rcmergt2orUHuI7E0IfaAPGqXf47CwPkS94sFI5ej
zhxGHGPHkZOwMvK2QtF/6gIzOOgOsIjsqagftlmChZKaZob5HmkFqtWXnaU+GLBlIy0D/1vDZEM5
41hEg1y2Rfj10JiYTWfsgMV5y4mOAkjuZVBnUj7MlSU7J+jb6NSrrxw35H3bFbozBa2Ocoz039+2
QHb6uecOJPEn7aUwoU1ou/DW7UjKO/dOVaunWAXV4dxSAANI3ClaubPqf8fqipUiW8JTd6JjcxVX
5/MdtYhvkNMtTw3NKklCTSBUZXN0IFVzZXIgPElCTXRlc3R1c2VyQHRlc3Rkb21haW4ub3JnPsLA
egQTAQIALgUCYQMVNgUJAeEzgAkQ6cHv0/o4jq0CGQECGwYECwkHAgYVCAIJCgsCFgICHgEAAFuV
B/9+hnE2pPC030mRLoa98TUkcNDj6pRirMgCpS+9xPgrqXaJgFsi7yjbqStfpYMn2eish8WGQKPx
r20J4qjC4nR3qbWyiU5L+f7lMZWWEx3QzcHo5j3ItPh8ngrU9HQxUySl4J6Rcaml9lGX6l1NCNIn
7+1ve7A6DxGHjHXXgcPOnPtYMxt8tpcxtzSumvFasHvRvFZJwnbyCauxLoEo3vHnkoSrdNt8ZQQs
Kq5Rp9SdxGEY5ddoxWHrs0IPh7C947Qu3SK+/wXnJkyQuLFWh93b2yNvaUZ9rZmHh3KIm1Wm/dSf
+XnI1qRwd4/f2l8iL/nan2B7SPEB0rpd5GaQS1I0
=/Htv
-----END PGP PRIVATE KEY BLOCK-----

Loading…
Cancel
Save