merged in default ENGINE-434
authorKrista Bennett <krista@pep-project.org>
Wed, 20 Jun 2018 09:36:04 +0200
branchENGINE-434
changeset 275565c6b4bb11a6
parent 2702 3dc4d79fc55c
parent 2754 78c467823210
child 2756 4a814f99426c
merged in default
src/message_api.c
src/pgp_gpg.c
src/pgp_netpgp.c
src/platform_unix.c
test/include/EngineTestSuite.h
test/include/IntegrityTests.h
test/include/test_util.h
test/src/EngineTestIndividualSuite.cc
test/src/EngineTestSuite.cc
test/src/SuiteMaker.cc
test/src/engine_tests/PepSubjectReceivedTests.cc
test/src/util/test_util.cc
     1.1 --- a/Makefile.conf	Wed May 30 11:39:57 2018 +0200
     1.2 +++ b/Makefile.conf	Wed Jun 20 09:36:04 2018 +0200
     1.3 @@ -115,3 +115,6 @@
     1.4  # Example:
     1.5  #    EXTRA_MACROS=-DDEFAULT_KEYSERVER=\"default-server.org\" -DCRASHDUMP_DEFAULT_LINES=23
     1.6  #EXTRA_MACROS=
     1.7 +
     1.8 +# add this for running tests in debugger
     1.9 +#TEST_DEBUGGER=lldb --batch -o r
     2.1 --- a/default.conf	Wed May 30 11:39:57 2018 +0200
     2.2 +++ b/default.conf	Wed Jun 20 09:36:04 2018 +0200
     2.3 @@ -212,7 +212,7 @@
     2.4  ifeq ($(BUILD_FOR),Linux)
     2.5      LIBGPGME=libgpgme.so.11
     2.6  else ifeq ($(BUILD_FOR),Darwin)
     2.7 -    LIBGPGME=libgpgme.dylib
     2.8 +    LIBGPGME=libgpgme.11.dylib
     2.9  endif
    2.10  
    2.11  # libGPGME library search flag
     3.1 --- a/src/message_api.c	Wed May 30 11:39:57 2018 +0200
     3.2 +++ b/src/message_api.c	Wed Jun 20 09:36:04 2018 +0200
     3.3 @@ -1370,7 +1370,10 @@
     3.4              size_t blob_size = bl->size;
     3.5              bool free_blobval = false;
     3.6              
     3.7 -            if (is_encrypted_attachment(bl)) {
     3.8 +            if (is_encrypted_attachment(bl) &&
     3.9 +                    strstr(blob_value, "BEGIN PGP PUBLIC KEY") == NULL &&
    3.10 +                    strstr(blob_value, "BEGIN PGP PRIVATE KEY") == NULL) {
    3.11 +                    
    3.12                  char* bl_ptext = NULL;
    3.13                  size_t bl_psize = 0;
    3.14                  stringlist_t* bl_keylist = NULL;
     4.1 --- a/src/pgp_gpg.c	Wed May 30 11:39:57 2018 +0200
     4.2 +++ b/src/pgp_gpg.c	Wed Jun 20 09:36:04 2018 +0200
     4.3 @@ -298,6 +298,8 @@
     4.4  
     4.5          gpgme = dlopen(LIBGPGME, RTLD_LAZY);
     4.6          if (gpgme == NULL) {
     4.7 +            // FIXME: Hotfix here?
     4.8 +            
     4.9              status = PEP_INIT_CANNOT_LOAD_GPGME;
    4.10              goto pep_error;
    4.11          }
    4.12 @@ -809,7 +811,8 @@
    4.13                          }
    4.14                          case GPG_ERR_CERT_REVOKED:
    4.15                          case GPG_ERR_BAD_SIGNATURE:
    4.16 -                            result = PEP_DECRYPT_BAD_SIGNATURE;
    4.17 +			    result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
    4.18 +                            //result = PEP_DECRYPT_BAD_SIGNATURE;
    4.19                              break;
    4.20                          case GPG_ERR_SIG_EXPIRED:
    4.21                          case GPG_ERR_KEY_EXPIRED:
     5.1 --- a/src/pgp_netpgp.c	Wed May 30 11:39:57 2018 +0200
     5.2 +++ b/src/pgp_netpgp.c	Wed Jun 20 09:36:04 2018 +0200
     5.3 @@ -46,11 +46,12 @@
     5.4      // netpgp_setvar(&netpgp, "need userid", "1");
     5.5  
     5.6      // NetPGP shares home with GPG
     5.7 -#if defined(WIN32) || defined(NDEBUG)
     5.8 -    home = gpg_home();
     5.9 -#else
    5.10 -    home = gpg_home(false);
    5.11 -#endif
    5.12 +    #if defined(WIN32) || defined(NDEBUG)
    5.13 +        home = gpg_home();
    5.14 +    #else
    5.15 +        home = gpg_home(false);
    5.16 +    #endif
    5.17 +    
    5.18      if(home){
    5.19          netpgp_set_homedir(&netpgp,(char*)home, NULL, 0);
    5.20      }else{
     6.1 --- a/src/platform_unix.c	Wed May 30 11:39:57 2018 +0200
     6.2 +++ b/src/platform_unix.c	Wed Jun 20 09:36:04 2018 +0200
     6.3 @@ -448,4 +448,4 @@
     6.4          return agent_conf;
     6.5      return NULL;
     6.6  }
     6.7 -#endif
     6.8 \ No newline at end of file
     6.9 +#endif
     7.1 --- a/src/platform_unix.h	Wed May 30 11:39:57 2018 +0200
     7.2 +++ b/src/platform_unix.h	Wed Jun 20 09:36:04 2018 +0200
     7.3 @@ -46,7 +46,11 @@
     7.4  
     7.5  const char *android_system_db(void);
     7.6  #define SYSTEM_DB android_system_db()
     7.7 +#ifdef __APPLE__
     7.8 +#define LIBGPGME "libgpgme.11.dylib"
     7.9 +#else
    7.10  #define LIBGPGME "libgpgme.so"
    7.11 +#endif
    7.12  
    7.13  #elif __APPLE__
    7.14  #include "TargetConditionals.h"
     8.1 --- a/test/Makefile	Wed May 30 11:39:57 2018 +0200
     8.2 +++ b/test/Makefile	Wed Jun 20 09:36:04 2018 +0200
     8.3 @@ -17,8 +17,8 @@
     8.4  OBJS := $(addsuffix .o,$(basename $(SRCS)))
     8.5  DEPS := $(OBJS:.o=.d)
     8.6  
     8.7 -INC_DIRS := ./include /usr/local/include  
     8.8 -INC_FLAGS := $(addprefix -I,$(INC_DIRS))
     8.9 +INC_DIRS := ./include /usr/local/include 
    8.10 +INC_FLAGS := $(addprefix -I,$(INC_DIRS)) $(GPGME_INC)
    8.11  
    8.12  LDFLAGS += -L/usr/local/lib
    8.13  
    8.14 @@ -100,7 +100,7 @@
    8.15  test_home_: 
    8.16  	
    8.17  
    8.18 -.PHONY: test_home_
    8.19 +.PHONY: scripts
    8.20  scripts: 
    8.21  ifdef PY_ENV
    8.22  	$(PY_ENV) genscripts.py
    8.23 @@ -108,7 +108,7 @@
    8.24  
    8.25  .PHONY: test
    8.26  test: all
    8.27 -	./$(TARGET)
    8.28 +	$(TEST_DEBUGGER) ./$(TARGET)
    8.29  	
    8.30  .PHONY: clean
    8.31  clean:
     9.1 --- a/test/convenience_scripts/keygen_for_test.py	Wed May 30 11:39:57 2018 +0200
     9.2 +++ b/test/convenience_scripts/keygen_for_test.py	Wed Jun 20 09:36:04 2018 +0200
     9.3 @@ -67,9 +67,14 @@
     9.4      
     9.5      print(input_data)
     9.6      key = None
     9.7 -    key = gpg.gen_key(input_data)
     9.8 -    if not key:
     9.9 -        raise Exception('Key not created in iteration ' + str(i))
    9.10 +    try:
    9.11 +        key = gpg.gen_key(input_data)
    9.12 +        if not key:
    9.13 +            raise Exception('Key not created in iteration ' + str(i))
    9.14 +    except ValueError:
    9.15 +        pass
    9.16 +
    9.17 +
    9.18      pubkey = None
    9.19      privkey = None
    9.20      
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/test/include/BCCTests.h	Wed Jun 20 09:36:04 2018 +0200
    10.3 @@ -0,0 +1,21 @@
    10.4 +// This file is under GNU General Public License 3.0
    10.5 +// see LICENSE.txt
    10.6 +
    10.7 +#ifndef BCC_H
    10.8 +#define BCC_H
    10.9 +
   10.10 +#include <string>
   10.11 +#include "EngineTestIndividualSuite.h"
   10.12 +
   10.13 +using namespace std;
   10.14 +
   10.15 +class BCCTests : public EngineTestIndividualSuite {
   10.16 +    public:
   10.17 +        BCCTests(string test_suite, string test_home_dir);
   10.18 +    protected:
   10.19 +	void setup();
   10.20 +    private:
   10.21 +        void check_single_BCC();
   10.22 +};
   10.23 +
   10.24 +#endif
    11.1 --- a/test/src/SuiteMaker.cc	Wed May 30 11:39:57 2018 +0200
    11.2 +++ b/test/src/SuiteMaker.cc	Wed Jun 20 09:36:04 2018 +0200
    11.3 @@ -21,6 +21,7 @@
    11.4  #include "AppleMailTests.h"
    11.5  #include "CaseAndDotAddressTests.h"
    11.6  #include "SequenceTests.h"
    11.7 +#include "BCCTests.h"
    11.8  #include "MessageApiTests.h"
    11.9  #include "I18nTests.h"
   11.10  #include "CrashdumpTests.h"
   11.11 @@ -60,6 +61,7 @@
   11.12      "AppleMailTests",
   11.13      "CaseAndDotAddressTests",
   11.14      "SequenceTests",
   11.15 +    "BCCTests",
   11.16      "MessageApiTests",
   11.17      "I18nTests",
   11.18      "CrashdumpTests",
   11.19 @@ -111,6 +113,8 @@
   11.20          *test_suite = new CaseAndDotAddressTests(test_class_name, test_home);
   11.21      else if (strcmp(test_class_name, "SequenceTests") == 0)
   11.22          *test_suite = new SequenceTests(test_class_name, test_home);
   11.23 +    else if (strcmp(test_class_name, "BCCTests") == 0)
   11.24 +        *test_suite = new BCCTests(test_class_name, test_home);
   11.25      else if (strcmp(test_class_name, "MessageApiTests") == 0)
   11.26          *test_suite = new MessageApiTests(test_class_name, test_home);
   11.27      else if (strcmp(test_class_name, "I18nTests") == 0)
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/test/src/engine_tests/BCCTests.cc	Wed Jun 20 09:36:04 2018 +0200
    12.3 @@ -0,0 +1,67 @@
    12.4 +// This file is under GNU General Public License 3.0
    12.5 +// see LICENSE.txt
    12.6 +
    12.7 +#include <stdlib.h>
    12.8 +#include <string>
    12.9 +#include <cstring>
   12.10 +#include <assert.h>
   12.11 +
   12.12 +#include "pEpEngine.h"
   12.13 +#include "message_api.h"
   12.14 +
   12.15 +#include <cpptest.h>
   12.16 +#include "test_util.h"
   12.17 +#include "EngineTestIndividualSuite.h"
   12.18 +#include "BCCTests.h"
   12.19 +
   12.20 +using namespace std;
   12.21 +
   12.22 +BCCTests::BCCTests(string suitename, string test_home_dir) :
   12.23 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   12.24 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("BCCTests::check_single_BCC"),
   12.25 +                                                                      static_cast<Func>(&BCCTests::check_single_BCC)));
   12.26 +}
   12.27 +
   12.28 +void BCCTests::setup() {
   12.29 +    EngineTestIndividualSuite::setup();
   12.30 +    string keystr = slurp("test_keys/priv/bcc_test_dude_0-0x1CCCFC41_priv.asc");
   12.31 +    PEP_STATUS status = import_key(session, keystr.c_str(), keystr.size(), NULL);
   12.32 +    assert(status == PEP_STATUS_OK);    
   12.33 +    pEp_identity * me = new_identity("bcc_test_dude_0@darthmama.cool", "0AE9AA3E320595CF93296BDFA155AC491CCCFC41", PEP_OWN_USERID, "BCC Test Sender");    
   12.34 +    status = set_own_key(session, me, "0AE9AA3E320595CF93296BDFA155AC491CCCFC41");
   12.35 +    keystr = slurp("test_keys/pub/bcc_test_dude_0-0x1CCCFC41_pub.asc");
   12.36 +    status = import_key(session, keystr.c_str(), keystr.size(), NULL);
   12.37 +    assert(status == PEP_STATUS_OK);
   12.38 +    keystr = slurp("test_keys/pub/bcc_test_dude_1-0xDAC746BE_pub.asc");
   12.39 +    status = import_key(session, keystr.c_str(), keystr.size(), NULL);
   12.40 +    assert(status == PEP_STATUS_OK);
   12.41 +    keystr = slurp("test_keys/pub/bcc_test_dude_2-0x53CECCF7_pub.asc");
   12.42 +    status = import_key(session, keystr.c_str(), keystr.size(), NULL);
   12.43 +    assert(status == PEP_STATUS_OK);    
   12.44 +}
   12.45 +
   12.46 +void BCCTests::check_single_BCC() {
   12.47 +    PEP_STATUS status = PEP_UNKNOWN_ERROR;
   12.48 +    
   12.49 +    // 0AE9AA3E320595CF93296BDFA155AC491CCCFC41
   12.50 +    // D0AF2F9695E186A8DC058B935FE2793DDAC746BE
   12.51 +    // B36E468E7A381946FCDBDDFA84B1F3E853CECCF7
   12.52 +    pEp_identity* sender = new_identity("bcc_test_dude_0@darthmama.cool", NULL, PEP_OWN_USERID, "BCC Test Sender");
   12.53 +    pEp_identity* open_recip = new_identity("bcc_test_dude_1@darthmama.cool", NULL, NULL, "BCC Test Recip");
   12.54 +    pEp_identity* bcc_recip = new_identity("bcc_test_dude_2@darthmama.cool", NULL, NULL, "BCC Super Sekrit Test Recip");
   12.55 +    
   12.56 +    message *msg = new_message(PEP_dir_outgoing);
   12.57 +    TEST_ASSERT_MSG((msg), "msg");
   12.58 +    msg->from = sender;
   12.59 +//    msg->to = new_identity_list(open_recip); FYI, this is supposed to fail for now. Unfortunately.
   12.60 +    msg->bcc = new_identity_list(bcc_recip);
   12.61 +    msg->shortmsg = strdup("Hello, world");
   12.62 +    msg->longmsg = strdup("Your mother was a hamster and your father smelt of elderberries.");
   12.63 +    msg->attachments = new_bloblist(NULL, 0, "application/octet-stream", NULL);
   12.64 +
   12.65 +    message *enc_msg = nullptr;
   12.66 +    status = encrypt_message(session, msg, NULL, &enc_msg, PEP_enc_PGP_MIME, 0);
   12.67 +
   12.68 +    TEST_ASSERT(status == PEP_STATUS_OK);
   12.69 +}
   12.70 +
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/test/src/engine_tests/IntegrityTests.do.not.run.before.ENGINE-434	Wed Jun 20 09:36:04 2018 +0200
    13.3 @@ -0,0 +1,279 @@
    13.4 +// This file is under GNU General Public License 3.0
    13.5 +// see LICENSE.txt
    13.6 +
    13.7 +#include <stdlib.h>
    13.8 +#include <string>
    13.9 +#include <assert.h>
   13.10 +#include <unistd.h>
   13.11 +
   13.12 +#include "pEpEngine.h"
   13.13 +#include "message_api.h"
   13.14 +
   13.15 +#include "test_util.h"
   13.16 +
   13.17 +#include "EngineTestIndividualSuite.h"
   13.18 +#include "IntegrityTests.h"
   13.19 +
   13.20 +using namespace std;
   13.21 +
   13.22 +IntegrityTests::IntegrityTests(string suitename, string test_home_dir) :
   13.23 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   13.24 +    recip_fpr = "9D8047989841CF4207EA152A4ACAF735F390A40D";
   13.25 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_unsigned_PGP_MIME"),
   13.26 +                                                                      static_cast<Func>(&IntegrityTests::check_unsigned_PGP_MIME)));
   13.27 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_unsigned_PGP_MIME_attached_key"),
   13.28 +                                                                      static_cast<Func>(&IntegrityTests::check_unsigned_PGP_MIME_attached_key)));
   13.29 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_unsigned_PGP_MIME_w_render_flag"),
   13.30 +                                                                      static_cast<Func>(&IntegrityTests::check_unsigned_PGP_MIME_w_render_flag)));
   13.31 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_known_good_signed_PGP_MIME"),
   13.32 +                                                                      static_cast<Func>(&IntegrityTests::check_known_good_signed_PGP_MIME)));
   13.33 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_known_good_signed_PGP_MIME_attached_key"),
   13.34 +                                                                      static_cast<Func>(&IntegrityTests::check_known_good_signed_PGP_MIME_attached_key)));
   13.35 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_unknown_signed_PGP_MIME_no_key"),
   13.36 +                                                                      static_cast<Func>(&IntegrityTests::check_unknown_signed_PGP_MIME_no_key)));
   13.37 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_unknown_signed_PGP_MIME_attached_key"),
   13.38 +                                                                      static_cast<Func>(&IntegrityTests::check_unknown_signed_PGP_MIME_attached_key)));
   13.39 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_unsigned_PGP_MIME_corrupted"),
   13.40 +                                                                      static_cast<Func>(&IntegrityTests::check_unsigned_PGP_MIME_corrupted)));
   13.41 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_signed_PGP_MIME_corrupted"),
   13.42 +                                                                      static_cast<Func>(&IntegrityTests::check_signed_PGP_MIME_corrupted)));
   13.43 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_unsigned_2_0"),
   13.44 +                                                                      static_cast<Func>(&IntegrityTests::check_unsigned_2_0)));
   13.45 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_unknown_signed_2_0_no_key"),
   13.46 +                                                                      static_cast<Func>(&IntegrityTests::check_unknown_signed_2_0_no_key)));
   13.47 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_unknown_signed_2_0_no_key_known_signer"),
   13.48 +                                                                      static_cast<Func>(&IntegrityTests::check_unknown_signed_2_0_no_key_known_signer)));                                                                                                                                        
   13.49 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_unknown_signed_2_0_key_attached"),
   13.50 +                                                                      static_cast<Func>(&IntegrityTests::check_unknown_signed_2_0_key_attached)));  
   13.51 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("IntegrityTests::check_integrity"),
   13.52 +                                                                      static_cast<Func>(&IntegrityTests::check_integrity)));
   13.53 +}
   13.54 +
   13.55 +void IntegrityTests::setup() {
   13.56 +    EngineTestIndividualSuite::setup();
   13.57 +    string recip_key = slurp("test_keys/pub/integrity_test_recip_0-0xF390A40D_pub.asc");
   13.58 +    PEP_STATUS status = import_key(session, recip_key.c_str(), recip_key.size(), NULL);
   13.59 +    assert(status == PEP_STATUS_OK);
   13.60 +    recip_key = "";
   13.61 +    string priv_key = slurp("test_keys/priv/integrity_test_recip_0-0xF390A40D_priv.asc");
   13.62 +    // cout << priv_key << endl;
   13.63 +    // cout << "GNUPGHOME is " << getenv("GNUPGHOME") << endl;
   13.64 +    status = import_key(session, priv_key.c_str(), priv_key.size(), NULL);
   13.65 +    assert(status == PEP_STATUS_OK);
   13.66 +    // stringlist_t* debug_keylist = NULL;
   13.67 +    // status = find_private_keys(session, recip_fpr, &debug_keylist);
   13.68 +    // assert(debug_keylist);
   13.69 +    
   13.70 +    pEp_identity* me = new_identity("integrity_test_recip@darthmama.org", recip_fpr, PEP_OWN_USERID, "Integrity Test Recipient");
   13.71 +    assert(me != NULL);
   13.72 +    status = set_own_key(session, me, recip_fpr);
   13.73 +    assert(status == PEP_STATUS_OK);
   13.74 +
   13.75 +    message = "";
   13.76 +    decrypted_msg = NULL;
   13.77 +    decrypt_status = PEP_STATUS_OK;
   13.78 +    rating = PEP_rating_undefined;
   13.79 +    flags = 0;
   13.80 +    keylist = NULL;
   13.81 +    dummy_ignore = NULL;
   13.82 +}
   13.83 +
   13.84 +void IntegrityTests::tear_down() {
   13.85 +    free_stringlist(keylist);
   13.86 +    free(decrypted_msg);
   13.87 +    EngineTestIndividualSuite::tear_down();
   13.88 +}
   13.89 +
   13.90 +/*
   13.91 +Type            Error State             Render              Status Code
   13.92 +---------------------------------------------------------------------------------------------------------------
   13.93 +inline          ALL                     Yes, if present     Whatever GPG gives us
   13.94 +PGP/MIME        Unsigned                No                  DECRYPTED_BUT_UNSIGNED (grey)
   13.95 +                Signed, no key          Yes                 NO_KEY_FOR_SIGNER
   13.96 +                Bad sig                 No                  SIGNATURE_DOES_NOT_MATCH
   13.97 +Message 1.0     Unsigned                No                  MODIFICATION_DETECTED
   13.98 +                Signed, no key          No                  MODIFICATION_DETECTED
   13.99 +                Bad sig                 No                  SIGNATURE_DOES_NOT_MATCH
  13.100 +Message 2.0     Unsigned                No                  MODIFICATION_DETECTED (red)
  13.101 +                Signed, no key          No                  MODIFICATION_DETECTED  (red)
  13.102 +                Bad sig                 No                  SIGNATURE_DOES_NOT_MATCH
  13.103 +
  13.104 +*/
  13.105 +
  13.106 +void IntegrityTests::check_known_good_signed_PGP_MIME() {
  13.107 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/Signed no attach PGP_MIME.eml", message,
  13.108 +                                             "test_keys/pub/integrity_test_signer_0-0xFF26631A_pub.asc"));
  13.109 +
  13.110 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.111 +                                          &rating, &flags, &dummy_ignore);
  13.112 +
  13.113 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_STATUS_OK", tl_status_string(decrypt_status));
  13.114 +    TEST_ASSERT_MSG(decrypt_status == PEP_STATUS_OK, failed_msg_buf);
  13.115 +    TEST_ASSERT(decrypted_msg != NULL);
  13.116 +    TEST_ASSERT(rating == PEP_rating_reliable);
  13.117 +}
  13.118 +
  13.119 +void IntegrityTests::check_known_good_signed_PGP_MIME_attached_key() {
  13.120 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/Signed attached key PGP_MIME.eml", message,
  13.121 +                                             NULL));
  13.122 +
  13.123 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.124 +                                          &rating, &flags, &dummy_ignore);
  13.125 +
  13.126 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_STATUS_OK", tl_status_string(decrypt_status));
  13.127 +    TEST_ASSERT_MSG(decrypt_status == PEP_STATUS_OK, failed_msg_buf);
  13.128 +    TEST_ASSERT(decrypted_msg != NULL);
  13.129 +    TEST_ASSERT(rating == PEP_rating_reliable);
  13.130 +}
  13.131 +
  13.132 +void IntegrityTests::check_unsigned_PGP_MIME() {
  13.133 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/Unsigned from PGP_MIME_noattach.eml", message,
  13.134 +                                             "test_keys/pub/integrity_test_signer_0-0xFF26631A_pub.asc"));
  13.135 +
  13.136 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.137 +                                          &rating, &flags, &dummy_ignore);
  13.138 +
  13.139 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_DECRYPTED_BUT_UNSIGNED", tl_status_string(decrypt_status));
  13.140 +    TEST_ASSERT_MSG(decrypt_status == PEP_DECRYPTED_BUT_UNSIGNED, failed_msg_buf);
  13.141 +    TEST_ASSERT(decrypted_msg == NULL);
  13.142 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Rating == %s, should be PEP_rating_unreliable", tl_rating_string(rating));
  13.143 +    TEST_ASSERT_MSG(rating == PEP_rating_unreliable, failed_msg_buf);
  13.144 +}
  13.145 +
  13.146 +void IntegrityTests::check_unsigned_PGP_MIME_attached_key() {
  13.147 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/Unsigned from PGP_MIME_attach.eml", message,
  13.148 +                                             NULL));
  13.149 +
  13.150 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.151 +                                          &rating, &flags, &dummy_ignore);
  13.152 +
  13.153 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_DECRYPTED_BUT_UNSIGNED", tl_status_string(decrypt_status));
  13.154 +    TEST_ASSERT_MSG(decrypt_status == PEP_DECRYPTED_BUT_UNSIGNED, failed_msg_buf);
  13.155 +    TEST_ASSERT(decrypted_msg == NULL);
  13.156 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Rating == %s, should be PEP_rating_unreliable", tl_rating_string(rating));
  13.157 +    TEST_ASSERT_MSG(rating == PEP_rating_unreliable, failed_msg_buf);
  13.158 +}
  13.159 +
  13.160 +void IntegrityTests::check_unsigned_PGP_MIME_w_render_flag() {
  13.161 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/Unsigned from PGP_MIME_noattach.eml", message,
  13.162 +                                             "test_keys/pub/integrity_test_signer_0-0xFF26631A_pub.asc"));
  13.163 +    flags |= PEP_decrypt_deliver_pgpmime_badsigned;
  13.164 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.165 +                                          &rating, &flags, &dummy_ignore);
  13.166 +
  13.167 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_DECRYPTED_BUT_UNSIGNED", tl_status_string(decrypt_status));
  13.168 +    TEST_ASSERT_MSG(decrypt_status == PEP_DECRYPTED_BUT_UNSIGNED, failed_msg_buf);
  13.169 +    TEST_ASSERT(decrypted_msg != NULL);
  13.170 +    TEST_ASSERT(rating == PEP_rating_unreliable);
  13.171 +}
  13.172 +
  13.173 +
  13.174 +void IntegrityTests::check_unknown_signed_PGP_MIME_no_key() {
  13.175 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/Signed PGP_MIME by unknown signer no attach.eml", message,
  13.176 +                                             NULL));
  13.177 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.178 +                                          &rating, &flags, &dummy_ignore);
  13.179 +
  13.180 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_DECRYPT_NO_KEY_FOR_SIGNER", tl_status_string(decrypt_status));
  13.181 +    TEST_ASSERT_MSG(decrypt_status == PEP_DECRYPT_NO_KEY_FOR_SIGNER, failed_msg_buf);
  13.182 +    TEST_ASSERT(decrypted_msg != NULL);
  13.183 +    TEST_ASSERT(rating == PEP_rating_unreliable);
  13.184 +}
  13.185 +
  13.186 +void IntegrityTests::check_unknown_signed_PGP_MIME_attached_key() {
  13.187 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/Signed PGP_MIME by unknown signer attach.eml", message,
  13.188 +                                             NULL));
  13.189 +
  13.190 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.191 +                                          &rating, &flags, &dummy_ignore);
  13.192 +
  13.193 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_STATUS_OK", tl_status_string(decrypt_status));
  13.194 +    TEST_ASSERT_MSG(decrypt_status == PEP_STATUS_OK, failed_msg_buf);
  13.195 +    TEST_ASSERT(decrypted_msg != NULL);
  13.196 +    TEST_ASSERT(rating == PEP_rating_reliable);
  13.197 +}
  13.198 +
  13.199 +// FIXME: we need cleverer attacked mails
  13.200 +void IntegrityTests::check_unsigned_PGP_MIME_corrupted() {
  13.201 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/Unsigned from PGP_MIME_attach_corrupted.eml", message,
  13.202 +                                             NULL));
  13.203 +
  13.204 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.205 +                                          &rating, &flags, &dummy_ignore);
  13.206 +
  13.207 +//    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_STATUS_OK", tl_status_string(decrypt_status));
  13.208 +//    TEST_ASSERT_MSG(decrypt_status == PEP_STATUS_OK, failed_msg_buf);
  13.209 +    TEST_ASSERT(decrypt_status != PEP_STATUS_OK && decrypt_status != PEP_DECRYPTED);
  13.210 +    TEST_ASSERT(decrypted_msg == NULL);
  13.211 +}
  13.212 +
  13.213 +void IntegrityTests::check_signed_PGP_MIME_corrupted() {
  13.214 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/Signed attached key PGP_MIME_corrupted.eml", message,
  13.215 +                                             NULL));
  13.216 +
  13.217 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.218 +                                          &rating, &flags, &dummy_ignore);
  13.219 +
  13.220 +//    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_STATUS_OK", tl_status_string(decrypt_status));
  13.221 +//    TEST_ASSERT_MSG(decrypt_status == PEP_STATUS_OK, failed_msg_buf);
  13.222 +    TEST_ASSERT(decrypt_status != PEP_STATUS_OK && decrypt_status != PEP_DECRYPTED);
  13.223 +    TEST_ASSERT(decrypted_msg == NULL);
  13.224 +}
  13.225 +
  13.226 +void IntegrityTests::check_unsigned_2_0() {
  13.227 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/fake_2.0_unsigned.eml", message,
  13.228 +                                             NULL));
  13.229 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.230 +                                          &rating, &flags, &dummy_ignore);
  13.231 +
  13.232 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_DECRYPT_MODIFICATION_DETECTED", tl_status_string(decrypt_status));
  13.233 +    TEST_ASSERT_MSG(decrypt_status == PEP_DECRYPT_MODIFICATION_DETECTED, failed_msg_buf);
  13.234 +    TEST_ASSERT(decrypted_msg == NULL);
  13.235 +    TEST_ASSERT(rating == PEP_rating_under_attack);
  13.236 +}
  13.237 +
  13.238 +void IntegrityTests::check_unknown_signed_2_0_no_key() {
  13.239 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/fake_2.0_signed_no_key_attached.eml", message,
  13.240 +                                             NULL));
  13.241 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.242 +                                          &rating, &flags, &dummy_ignore);
  13.243 +
  13.244 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_DECRYPT_MODIFICATION_DETECTED", tl_status_string(decrypt_status));
  13.245 +    TEST_ASSERT_MSG(decrypt_status == PEP_DECRYPT_MODIFICATION_DETECTED, failed_msg_buf);
  13.246 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypted msg should have been NULL, but starts with %s", decrypted_msg);
  13.247 +    TEST_ASSERT_MSG(decrypted_msg == NULL, failed_msg_buf);
  13.248 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Rating == %s, should be PEP_rating_under_attack", tl_rating_string(rating));
  13.249 +    TEST_ASSERT_MSG(rating == PEP_rating_under_attack, failed_msg_buf);
  13.250 +}
  13.251 +
  13.252 +void IntegrityTests::check_unknown_signed_2_0_no_key_known_signer() {
  13.253 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/fake_2.0_signed_no_key_attached.eml", message,
  13.254 +                                             "test_keys/pub/integrity_test_signer_0-0xFF26631A_pub.asc"));
  13.255 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.256 +                                          &rating, &flags, &dummy_ignore);
  13.257 +
  13.258 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_DECRYPT_MODIFICATION_DETECTED", tl_status_string(decrypt_status));
  13.259 +    TEST_ASSERT_MSG(decrypt_status == PEP_DECRYPT_MODIFICATION_DETECTED, failed_msg_buf);
  13.260 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypted msg should have been NULL, but starts with %s", decrypted_msg);
  13.261 +    TEST_ASSERT_MSG(decrypted_msg == NULL, failed_msg_buf);
  13.262 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Rating == %s, should be PEP_rating_under_attack", tl_rating_string(rating));
  13.263 +    TEST_ASSERT_MSG(rating == PEP_rating_under_attack, failed_msg_buf);
  13.264 +}
  13.265 +
  13.266 +
  13.267 +void IntegrityTests::check_unknown_signed_2_0_key_attached() {
  13.268 +    TEST_ASSERT(slurp_message_and_import_key(session, "test_mails/fake_2.0_good.eml", message,
  13.269 +                                             NULL));
  13.270 +    decrypt_status = MIME_decrypt_message(session, message.c_str(), message.size(), &decrypted_msg, &keylist,
  13.271 +                                          &rating, &flags, &dummy_ignore);
  13.272 +
  13.273 +    snprintf(failed_msg_buf, TEST_FAILED_MESSAGE_BUFSIZE, "Decrypt status == %s, should be PEP_STATUS_OK", tl_status_string(decrypt_status));
  13.274 +    TEST_ASSERT_MSG(decrypt_status == PEP_STATUS_OK, failed_msg_buf);
  13.275 +    TEST_ASSERT(decrypted_msg != NULL);
  13.276 +    TEST_ASSERT(rating == PEP_rating_reliable);
  13.277 +}
  13.278 +
  13.279 +
  13.280 +void IntegrityTests::check_integrity() {
  13.281 +    TEST_ASSERT(true);
  13.282 +}
    14.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2 +++ b/test/test_keys/priv/bcc_test_dude_0-0x1CCCFC41_priv.asc	Wed Jun 20 09:36:04 2018 +0200
    14.3 @@ -0,0 +1,64 @@
    14.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    14.5 +
    14.6 +lQOYBFsXrp0BCADYI/0kZfPXEtCNjF97pKDT2tke4kJyjL6BuR/eCf/LuvYMYvcr
    14.7 +eTB528zfyUNCnRMHDkUg07ng9lBjUkVM5GiG+TObS7NcSzsBSK2MatCi1hXIKz6e
    14.8 +MrqYBybn1Ef8UnSs8Qt64v4F6m625R3yUDk8G3QpNMyi2ibUEOeU7qLfhdObxoGU
    14.9 ++IwFygPbKpeitWR/Hb5WUBPFF13kAqn3UjmXNGA/FW5oYNSV+ovZuoNXfUlxFKJk
   14.10 +b/MFv6s0MwEf7CAU/GcfEHWgx1jxsVBYDDkRHqkuiUHUTXWJGMthnbvABQFtX5bR
   14.11 +fIzMqCundqZCncAk1DKJWzIxBgHOtpcGncmrABEBAAEAB/wNkvEJHKgG1/p7W+ym
   14.12 +iLfFplG1bqiVUMEpciAODfBfx0Lq6I+KTjxHouYHyzgrUk8JcJF8gXTZK87voJE+
   14.13 +m3z0YRPRyxwdYzzLlK4QNVMbWY5DpHJJys4iJxd/6WUzSQBlLhGLqv7LY1DcW/ZD
   14.14 +VgYfgBU4U0W4woeRZkBiVOcAr5AvuesIWqGQYa8N1UiVfFefGTqcFwpAVxEWNBxJ
   14.15 +rOLcDsUnCMjH71oOBumU6QuGT/G8zW8I60hQoQFjHV7v/1CE8NCDf/6VK1CPE0E+
   14.16 +2GJuzt/tjnG9DBGocyJ/lrHesvwh/0FW11ZE/he0qQG0XkGk+axQh9F8WIlVZKcv
   14.17 +ISvhBADlhjLv1Jnr14/4hLbyz567LqUnDEO2K823wsrU1BEnF1rpV6yGWPo6iDI3
   14.18 +TA6um++vwxbtSxvSY4mBZU5eMO2DVu9StGahnU9W9MjHPg66rIHBAhg/Apbobiti
   14.19 +v6a2rHJrjhit2DiSAHhHsKsnOhvuFy8Ud7lla+RgP7aE3ka9CwQA8RKS87VBx+oa
   14.20 +hhtU3E9V0/c29VBkxTgXtTTe+2nmt0coVHKVZocgEaYj/oXQ39q3d6bjxS+97xES
   14.21 +SLFadWGR4z/mx0qRe4kxOMAe3fSJ1qQj57jFGzD44kO7egYqY2WvH9ncvzDZl5Hq
   14.22 +VFoaVM7Z6fxFkoisHQ77ESh0uvqMyeEEAI93VCKn2wtj0ApCNN4DCRCiP6gtRcIY
   14.23 +nfr8vW8X6VvAHt5R9FnCjxn/3RSKhljgOGgiK0ZJw9opIxvXYx13XOc/NxeujaTI
   14.24 +temiH43+MZh0h7WEedP5UlNDB39QBakSxX9kopI+0d2kkJN07YX7o4aH9LoQUKHg
   14.25 +/1N9Z6sGecPuPle0N0JDQyBUZXN0IFBhcnRpY2lwYW50IDAgPGJjY190ZXN0X2R1
   14.26 +ZGVfMEBkYXJ0aG1hbWEuY29vbD6JAU4EEwEIADgWIQQK6ao+MgWVz5Mpa9+hVaxJ
   14.27 +HMz8QQUCWxeunQIbLwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRChVaxJHMz8
   14.28 +QVY2B/9KLgvTenscM2MERB4fJ0WXUY5J8+oeUaXRSq5hx4YfbmIA1GTAEwwW9NwD
   14.29 +FyX6iu0wqNnlheW+zlhdY3Nhsb0OM3MChAgXrteAXtR3bjsS+aq+I/hASLZ7N4L8
   14.30 +JRZKyGtP0g6cSSFSOXgXwCegju8xBHmJsH/sSc9pCCK+wGIDL1mr+C75gPeN77UZ
   14.31 +HOl7Xf7ILZYeSh/V5erNaJ2hZm1PkYKMVxIKtfXB6n6lHAFFJ9MJLloJ+IDWbMzB
   14.32 +rkn8OTxxQtchrG/WQM8VFMSARCPUA+VvBvoJWekBlL4S7TnT9ttdVsHZAPOAA7tt
   14.33 +krZ+8oSZnU33H/PtJcXfrWrmgGJEnQOYBFsXrp0BCACpGtYkycsi5kjvWp2d1ztF
   14.34 +ECPqWgO6csoB5Bv7LJTnoqacwsnsuNXq4OcFvArQfw6AoMDXi4SADpIWHn42yymX
   14.35 +4N1Ba8fKmm2zE7fS0CSFfGh0QiY93Irts9+MQgEFlKcJ5TdrrklqIDBZmZ73Cqk3
   14.36 +cy2B2ZL8dUlG8/zFk06cwGlf2vNcsYU5vYWbnfOLmH1Pzmbd3IoWOxT3Yfjrq3ec
   14.37 +dTB56wY40j/tk2ISGQXs3/5O1qPLJYTDy86lumB9WS35JCjrn50JqM5ipyx6dVGQ
   14.38 +S+N3cjAljhHsTxGsRr1WfruHzfEoS21+O3y8HMlv1P8+Jx7D3mRRh2LZf0Q8yprt
   14.39 +ABEBAAEAB/4l/IkLsQfQcmYCXHrpDML7590FhQxu2t/NbnIpqVFWukcOkkQdSMUG
   14.40 +8tf6hgvw24XEt7eyA51zTbKbxORJxzfz7deN3Vn/RVLspfqGYOq/UJu/N+fSwCK2
   14.41 +NFB8d4w2tnaSZrrdFcTYkdwCmJtot6yc7+LSVy9pRih8h4zpzgYb+FB2H2XxBMMD
   14.42 +s8fuCU6oMnQPG9OIIyn1PYyCVCV/cAASQupGxJGsjcKQkz6KA8fTicYsA41/7mm8
   14.43 +JjQ3nv9yMfIEaY2EaX3tMpL4Vh15cj+jhnlgTrKmQnQv+f8Ez+iXvCcMKxlJQ1CG
   14.44 +gyuWfyP5tOqnjH/5+9tzfjEo656u8lDJBADH7RkRMxQjJOAXR1nERm1RVBoF6ls2
   14.45 +9iUubakoHMbbfKz3IsWN+akyY2PZ08nsGRSYR/Q7HAE84i9VSPJ8ijiBlsG2JLuB
   14.46 +graV2RTePaEBP2/XIsY6WrZgcw7nDXL0smpz88xJtwXzqX/nDbVcT5PsoHPMOiNu
   14.47 +1xGyP2l9Jxao2QQA2Ii8Rji/oo+5NhQCTVp+n2YbY95uLFPHfy/qt5MuyJM/NHAU
   14.48 +tAHNt9yNmOgOog/mD7BMq4LiHtvnfloRltVzT+FhnEx2QzTBhPXV3bgwZrwJQe65
   14.49 +3RME5cKLCBWZ9AHXkaEFDw3mGp1o6zqjz5YlenlNV8FL0RS4tI9yWhDvFjUD/jvU
   14.50 +JOOKpCCUe6qNcXMsb+GuqaZ+IcW9tMwshk+b90u9+sLt0K9iA+H5M8VGEQARooYv
   14.51 +obP7L0lQDeZDnfYJjHlQ+1OSWq75WcyJ+qrB3yaRABpnICcE/rEjKJxLPzBbToyS
   14.52 ++eOUmspMOio8+9RU7/bjqtZlCMe15QaRTB8Rh6taQiiJAmwEGAEIACAWIQQK6ao+
   14.53 +MgWVz5Mpa9+hVaxJHMz8QQUCWxeunQIbLgFACRChVaxJHMz8QcB0IAQZAQgAHRYh
   14.54 +BCjWK3P5Nbis4voQy58GBhMYDIJQBQJbF66dAAoJEJ8GBhMYDIJQiJgIAI1L1RF7
   14.55 +Doep5kYoMP87dl5Kcy7uW0YJ7sIGKIKOC6odBMP5ffwNYFfNQGJDd/9Q3b7aIV6O
   14.56 +kQ8HnCvjjoPb8Ub4mDZ5OqAESIC8q6ThzY1RgugFcp+eR32gzTUzpn+PIkwD9Hu5
   14.57 +T/MxhoEJ1k1ZtNxk6t9+kII5wZ+ZUZwmP0LPSANNMHA2F4oJHTpyN+YHYaf6aWzo
   14.58 +XD4q8JkQ012uHF34rUsVsD7pNEoCNjOu4R6MKOhrLPF7b7NQHgtVvXbZ9qBj/yxE
   14.59 +fEUxOLbqJxAVdUtO0j+u0eB4tuD5qaB0FKQ/fiCvNr8/paA6u3heuaX8Saum8ll2
   14.60 +Xsh84PZThpBhpR8UoQgAzkqKpERMykCuYuk3K0vPqtenL1oG1Ptn4vYlrBzrcoXL
   14.61 +vtVxq4j+7iWBuvvoz3ePQifo+eOZrpe4dQriN+KnA0Qi7VX5YuVPNBYsvpcg9FqP
   14.62 +kTBWO26mkfEiSFOVD4IcCSmo4nveB6EMfJJO5S74+MWSJRaE9EhaV42lmnBP4n7a
   14.63 +BvQ8yrxEqd4LQyCTgJpLAVswWT8cBNwmUuWqKSl6vmZ7mwdWJP2N4qgTnuG0ZCXc
   14.64 +LgXHaySKICo0SpjtcFCTUYMpYGpWTW1VrO0zfqUMGPe0BzmtCYZjgA3bAp6qYtLT
   14.65 +gZZLpwkrO0PIdJo6tZF13FIQU7TYKTVjde50IF5efw==
   14.66 +=IphG
   14.67 +-----END PGP PRIVATE KEY BLOCK-----
    15.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.2 +++ b/test/test_keys/priv/bcc_test_dude_1-0xDAC746BE_priv.asc	Wed Jun 20 09:36:04 2018 +0200
    15.3 @@ -0,0 +1,64 @@
    15.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    15.5 +
    15.6 +lQOYBFsXrqcBCACsJqCAgpquWOhW0pxDTpe+OZHyowNewOK2E4xyQk+710YdKIrg
    15.7 +I8j9+l1E4gUgJ+IiP7AIoTo89CcQINSt4Dith1+AjZgVnN4jxC5Jg7oARafALOxm
    15.8 +kF3mcRqA1T/e7TKBlx5MXwz2HPQBDKRekYomiFXPbBAYnSaTzGoVPmLAULf+TgoT
    15.9 +MtXRG59zHmUtV8ZVTttT9tCAWie0pBscQVL1x/D6x3a221JBcfhcrLFMJf0UoWGB
   15.10 +nlBEzrLQNrl3XRYyQJXCN0BpWvyZBPM35KfGifc7zV70Qrz2XGhSv/lpZct5/D8I
   15.11 +L5GclT2b0VFdVBYbiCPZZj6DbHxtXwDBwmf3ABEBAAEAB/4zX9uqPk+3FCVSM8wa
   15.12 +cgvq4vdhN7C7yEhgGflh59QvtJDiBsVbGpLS6LKI6gKpk/1yRxtbl/HvWtWFhKaz
   15.13 +tSR09N9VV+w5FvVcKyG9IqiRiDgFq+JowVCkgsBsDjffaV4XOmf6Vqthj0ZqQcGT
   15.14 +z08xLKKfIhqzncJzfR9zc4i452CUNC3BNMOVN9JQqGAVLhfP7Gqa7aH/344M87Rf
   15.15 +AK9IjEj6PpFhlxhM2dp9xRNt70XMeGm98Bm4FVpaLHvM57UIxtzE4sZ/CDJQ8iOQ
   15.16 +xDwvwXLvTwFBIvgysjSKy+pUK1Ige102rvGN20MkXlodgl8dqnTq5UQQXixp/iab
   15.17 +h0uRBADQrssShenxA8/WRTWdSRKP3XeKvznb6eNBfg0WTbsodgBi9XoT099BAs+m
   15.18 +rRYPMUENKh/wmiKhNh1FQagvvsDWdGx16bDujB26a9YFQm4cF0CW61NpMDF/+Ww5
   15.19 +SwnM7gUZ6vPXQl9k6q/ohWukRcdnb6dfJq/GcRFJjr/4UpW/8wQA0y9NU+RE7jNE
   15.20 +7uV215QVSwSgVTki4e3NShqbtq5CH81aKSyMxPnA9SfiBSUOpWqf/ILjX0gOz83p
   15.21 +z5NWJlRGQNWtufZSY78mrMlpMj8vOQoGt3PsRjykjbogEwGHCaMfD2KdUBtPbOaB
   15.22 +B3/Fvrz3JGwIvEA7SVJVYHhwX/rCfO0D/j0xSIXMMZvTeuLzAY4Ovn9KWbXXMU13
   15.23 +cD5wdzWqwa4kGddodAvzjLLqZY1Kbl0GlWmjZEXJroR8aAUtLIMChbtL5jLr+RZ0
   15.24 +ysmGZOMDtl39aWK24irWFAtjHMCQWR3VOwHa+G0telqdKhXEjcHyqVIolByrMVbc
   15.25 +9Z+KPiy2nwnhOCq0N0JDQyBUZXN0IFBhcnRpY2lwYW50IDEgPGJjY190ZXN0X2R1
   15.26 +ZGVfMUBkYXJ0aG1hbWEuY29vbD6JAU4EEwEIADgWIQTQry+WleGGqNwFi5Nf4nk9
   15.27 +2sdGvgUCWxeupwIbLwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRBf4nk92sdG
   15.28 +vhPfCACH4rdbxWmPyp3KC4SRfX0hs9tDi4IMyp0FKasZZR6TS25B0wPHcn5Ujd2U
   15.29 +78sZUSWFiB3uajBSU8tZ5OhF/6Kq8OjD1gKyWr5fBBP78Jia20eOye63wVM8UCfJ
   15.30 +oTrZk+vtfFnC3tU7+xT+1XB/EkXLr8vV92sHziplhdWQ7Ufc6Ise6zwZarAEqPdQ
   15.31 +ImLUE+fUk/HnCIS7mh36lXS7pTm3RUHbraxLd+FFbwfoHydcJRqwIiiFqQY60oWL
   15.32 +i5TcEdw8RltoTpv1XZYYyqOQCAqZXAdWmjCv1xo+teEku9TW4TqBMKJTs8CVxLFF
   15.33 +3YN6Lgnju4L9Q2hfiXlSutCwFurcnQOYBFsXrqcBCADP7ZCJ4UluQDpguMuSCa/f
   15.34 +PI8RUDQzFppdLgBf14iuoCIaSKEtA/fPa0JkQ+SGHHR3y013lIEfdSI2hwUSvEDS
   15.35 +ZIJJ7pVrMkqooHNqO92yrM55f6nkBNFZc7jj1AP5VlgyAOirKF/ocPCl/d/mz13z
   15.36 +HEDqbnx3/ky8j9PVfZlZ45FbK50ErPvFlH2elOaS/BILHBpo2DFsBwZRZdyLfn/E
   15.37 +QkwPtgpznd+erx6zD8Be548/DLjDmgQEWRQ071rVdvIOInCEnXdDoWWpq+4gfU1n
   15.38 +KwMfKvQOvq1qeTJOKhMPkJQDciAvgN4TGvRKCaNoB3yrAYu6kj77+C9qvf9ZJZl9
   15.39 +ABEBAAEAB/48EYCBJLFnBW0YBirhTKUfU8ptEQOTgsMjiieXiJe3AxH3D+ZoL85G
   15.40 +gNEUUDzTtaK7/OKrWh6XbOpuYEFJ8VK0tU6idyd5aXUCFCBjn1njxWJ83THCatXk
   15.41 +BrdyMgzX2mbuQy70S1yxtPcArUAi2ONmWVIzp6mTrMaUbuSet4M24S6VJ2rr2bPg
   15.42 +6V/l+xhVRRF87QXFTYo3lUO9UuFIVNTHF5G25z0CGNOTqGhW8x7Mq+HSCzpZlXpn
   15.43 +taRkEXx5lGhigLRu/QSVnYdzqI5mD43Qi4xNZE5dmpWIThwapx8sQNA25SRwa8im
   15.44 +zKf+ruubm7Yf/NPtj5Bd/pfPrJwBWAgtBADUG4RBV3pR9EBZti/wwtheqICGGj4A
   15.45 +HN2J589SCHXapgg2573Dp2YwRGwXoXDLJ5e61jmIuDSjkZLwXEZP6/4/5O65RFSD
   15.46 +ol4ykDtn/QXd/nrad7gujMbXuaoiG5dS6kiLZYxn+aSRMqcP5dzhH4oHSlYuBMBc
   15.47 +kjwRBT+Ic29MvwQA+vSjH/nh9T69eWl/F78qKs5TVrnxuQ/jmmwDdgK26Ch1NtTa
   15.48 +yaOyO8doEArMyQEHIdjqmfJGj8wwrGqA4Hew1k4E/KIlgSLPJRM/JKeZE/njn4jl
   15.49 +NMM/+56dKfV+gu3pXUA+WPw+NSAX9pKtC7JwbXHUIlUpmTbeNW7ppxMW3MMD/irf
   15.50 +c0aXkwi/suW472Yg3F2853W6FRzlLpRa3ucQF7XHGHaoiI+eYbNK6mnH460eB6oF
   15.51 +CZp2XUALZosebFPnTQU65fLdf3fmAs2aJEo82noKf4yU4Fu2huYVTrOi25DemqRH
   15.52 +saT9xdY/JL/g+qf2boHE6jkG1hLL/z1pFhxyfa+YQ+mJAmwEGAEIACAWIQTQry+W
   15.53 +leGGqNwFi5Nf4nk92sdGvgUCWxeupwIbLgFACRBf4nk92sdGvsB0IAQZAQgAHRYh
   15.54 +BKzvhDSRUUC9vyWSEMYlKpnI+14GBQJbF66nAAoJEMYlKpnI+14GhqIH/0q0ulT0
   15.55 +JI9nNYjwBQTMZ1cx5otcBEZUT19dMKXVfmMsS0T2gpIwp63iPw3l1UiamXf1TgS8
   15.56 +P7mYg05pctdbdQuI2Q47sxHAKKGGozIrgrsPHc/lyWXd9do/IXmS9e8rX2G4YnRA
   15.57 +61cJzpBy+nSi36t/7uIlbrghQ7yfBfCv9748Q+5AwPa1v3PKtkARLEtTA17OQR5F
   15.58 +M29TcI1vTkhbs+6VpoHffbvwcWj9TNl4eGpfUgNXwEVxUFGocFJ++7oUxYUC53qK
   15.59 +ONB5X9Aw3zzwXyFwgpipcXKoGghf5vl5mAz8/UfeucfsvzJHvF2ST4I5qHXty0Et
   15.60 +5f/LqZTw+Cz4x4HIcQf+OZjmh3DazM1OS8fLZsPg1Hhe0S9HDNxcZDZx7pgG6VjR
   15.61 +osbpuBYN4Gembwn5HMaTG7SHn33EuTeo395HCuJXEHGWe8UDyo+kheIhWb/D/FbK
   15.62 +2sWRopeheZKmZHZPBFCHsH9zXzOvh+WJAe6y27gM4Ro2vh24jYMxWp+ONVODbiq6
   15.63 +GsaB8D1tMkh4vKDmDufpPjEoIBNFnbmPzdT0ply1fxRTR+tCdgAIBDC+beVSbZUX
   15.64 +AvtA/x3poIaeK4yRJ2xwBD6VrULwpZVkRpXav7SHMC7NkQ8eC9jm+zj5lUDcCsyL
   15.65 +QhZV1rZwRICSOt4E7BTD58NBP1AwkWQE7IZkFIkVPg==
   15.66 +=Jke2
   15.67 +-----END PGP PRIVATE KEY BLOCK-----
    16.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2 +++ b/test/test_keys/priv/bcc_test_dude_2-0x53CECCF7_priv.asc	Wed Jun 20 09:36:04 2018 +0200
    16.3 @@ -0,0 +1,64 @@
    16.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    16.5 +
    16.6 +lQOYBFsXrq4BCAC/A0IRUN17SqPDvTPN7XkLtg4Cear8oMWQRCX+OKoYVthbZJYZ
    16.7 +/XCHWgDqPtIEEzbT1607060ucWjWnGq3eMpnooxfVl2YclhrK/qdAkWe/CTb3c33
    16.8 +nXkGH8fBt+Memdn5Tuj92qnCqAdVSPeIx9ExBy4v/3j1jmZP6c/7TdsvPrz8GMy7
    16.9 +pQ2H4bkq0I8QNYs/rF1vZXnvRoXgunA5SlVmUakewixUicBpG/PRgAZnZHnfrwKH
   16.10 +AVmGQv7gfbAi4QYrgeZEthEJerHcD+OTKu/GVEjF0iH89oq8W/l2VQ7xRsiNZHWO
   16.11 +i+pABNR2Q5qMq0ja1Pb65dgG8pKtU8z/1GEvABEBAAEAB/9euOtk8eB7eQagFS3g
   16.12 +82ABBj2JTbOUxtdiFOFwYcI8AqkVHVrwNYW9oUzt3MxB+BNK11wRXIW3j8bpEjU7
   16.13 +mbtpzCpnRslwRVgCgZMslElZL3nJzIMMxXsUJeNl9d47uRjmcJLK/EoN/UxxpxcV
   16.14 +rd1XvlNRuxNNVln3TB/24+OLV+jguxF0Mq5kcYkIrhTm22uXHG5wMI836DD84jCE
   16.15 +BT0p6nUVR05BJdLbrJCc8FsYnbOG1UdWkhArOsXFUWm39/cO63aBIT5wTxNZ0u3b
   16.16 +X1ZaArFIT4LliYKQ+UD1Tk6BmsphRhDErKHgtCQL0E1wSYl0iGJUG/ZBrRG+Bnsi
   16.17 +t8fpBADDnyaqnMR6e4yRHuoqgRupaVdHOBQ32K2krqBhL0KNthgCZXwfagdvkhez
   16.18 +xE+SBliziVid7GP3Ewsw5vpy2WnkNxvJXRrXYE3RLylSiIYmBXT2yOcAHKiuHUyC
   16.19 +OWweaOlUNW6SmYXS2HJUqPMy9bzMUINmhZQ0Q7DlcJaCJHbqCQQA+ffvWux/oIFP
   16.20 +rpu74DWZfqEqhNMYBzkvnZkn4Dlop4d04/1RANM9WSh4Q9YfALNzCKdgxwtpMHvR
   16.21 +91ogiSrfmAZMnpRvQ05NOjbsiDF63V1QZJbunML6iJ7jdxNzcXDyvYZXSS763L7a
   16.22 +jG/oxrVHMSD98lWknRT3bKUOqzwin3cD/3xY1qKsu0FH6ScW4rgNZYYzAFHt0lEw
   16.23 +aqT2N/oyEz8+lJH3tHV2S02z5wZB9HU1uSB3kzQi4vbfkgT/z8Pp5n9ysUY+7f0b
   16.24 +7kwdAokQujXFB0t2RcD1eVywuNa+w93NKFOtETBS1OLTjHLOxLvtvGsyECQBYnfJ
   16.25 +JNUOrOFx/LDWPYK0N0JDQyBUZXN0IFBhcnRpY2lwYW50IDIgPGJjY190ZXN0X2R1
   16.26 +ZGVfMkBkYXJ0aG1hbWEuY29vbD6JAU4EEwEIADgWIQSzbkaOejgZRvzb3fqEsfPo
   16.27 +U87M9wUCWxeurgIbLwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCEsfPoU87M
   16.28 +98SNB/4oh5JrBPf8MIWLbRMrN+/qPXuNMvyegfVA7KQA/YfiX7MkacCYhu33zIHS
   16.29 +g7EY7pzUM8Kiuw7C3I8Rnb3zSvTarI73Z6g15nOHuFseyGcJCQj29uu15eUCwLMm
   16.30 +z2WAH0u2JWNMs7TqGDQcE7sVOU/ryIAWMa90dsObbRD6F1Sy4wLx/6DK2ErZX9rJ
   16.31 +e+2oY+8pFzzxl2lQb4I3YRDmwlHhOlmcEWFKlHkeenVzREAi7x5MxRe4mUMK/wbo
   16.32 +/IEGYXRWj2JhS6Uww+D0YJxQW6z1SJaQogTTkg/qOBrhvwAIKAkgCodu5FYTRbAI
   16.33 +u7M1UcIBR4vzO8d7HxY7y37DbAZtnQOXBFsXrq4BCAC7a8uQPa8IODpG/05ti4kb
   16.34 +0on5PVYqxC841sUeqF7MP5ptoznP5RnY45QDZKJD/ats+kXi9F94qJBPNIMeFW/W
   16.35 +35dZN/8s6PBAA3GYkSiRWoz53AOQsNv5ckXT811KQ+CJOgw0tWX2s8W6wdkcsKVe
   16.36 +FRx+lo4JVU8h3iSftG0Ukl8HyCIdHNwpsIf17OAz7ZeMYCUstryVwxsPkAAMsU6Q
   16.37 +K61bXMIPUlWvAZeK0duoVsq9X/NF0fh/RiqDrL8ee8sovuvh2wAL/gdfOMGesKn5
   16.38 +P8THp8Z6mfCRj+A2TFwMpHULQv3hRniWqHi7zaHYWYz9WaNyI9WCybWpfv95K+TX
   16.39 +ABEBAAEAB/UYzF231Asq4Vz54qjNCP0yh1U34bc13si92HnMzIOr7dXCPEG5H6nE
   16.40 +3vYTvgUlaZmdffj0eauTQiWCOXUpKMQ9IyCm8z98dTngVbTlTGuKvV3XQd7Qfh0x
   16.41 +9tol1BuNMQeXPJSrVsArsRtcmp1XavoZYXU1Lr/URHVig3sYj0SjEjYeYuNQa5K4
   16.42 +/pBIpIerTtyeItuu0MWgj5wVtR1Ex4+NBe/XWl4rEPN13Nh7TbigksqkIBs9/Hai
   16.43 +XtweXHom8+WC283qKiKierTpQrIqmuAvWJne3euhrB7vqfq66SVjycNAj0JlaJ2a
   16.44 +cBXoH3VvLUkERnLsOtwkFNt67qCohYEEAMPUFhGjEgcM5ywZG/+COzx1PMFVFTOh
   16.45 +Qyt0RgIHTa++5evAT38TMKQIT6KogtAB6XOvT/cEivpjJr4bwSY7/cE14j/AE8FX
   16.46 +pWPSFY4XZ/vqwRQ7BgU3VdFqI2E8qgxqfjSu7MCarKXZK8I2eU3wXkMKWRVyCgHc
   16.47 +uIW0dqKGiQRBBAD1AmHD3ax1FKZalbnTe0TPWlk7b71tbLFmiPO0IsXsS2qbVJEc
   16.48 +AV7nP0HZ0npPF8PEmcBoXoiQtlFq6GEeAVJiyL2RicJ4STD1G+HgU9DP76/aDzXR
   16.49 +Ai/epJWIgE3p4BH/m/8Z4gzi3WACYSA8C5O9AxqUVjZm5otcOAg8UN/DFwP/XIVA
   16.50 +/9ny2bziwbL3QRo/9UQ2/qR9yrVSVfjS8/uzUE2eUl5xdZl4YODsYBRzgbXLCtK9
   16.51 +PwUHqMRDdzs/y1SmWYtj21357nQkf1W39+FkZFlpbLiQHNVvZA+j/g9oaVIGspn4
   16.52 +TGwjdg/zAe6uRjCMEtkCSHCSKfQ0yGcwlBAbQEc+XIkCbAQYAQgAIBYhBLNuRo56
   16.53 +OBlG/Nvd+oSx8+hTzsz3BQJbF66uAhsuAUAJEISx8+hTzsz3wHQgBBkBCAAdFiEE
   16.54 ++lLFkcz3tty2vw9VyoRI/A/1Gg8FAlsXrq4ACgkQyoRI/A/1Gg8axAf/STY0pYDM
   16.55 +A+U0NeqSz6m3nNdzWwEcJxLCd/ggFm6S0Y19sYK61o+YVZFVyL3LgFN5lMN2t1Bp
   16.56 +EzPQQUMKBvRvLf62VQJg37x1lc9i/b/MRsEgf6/ELme2ab+S+SR9ZvzeUBN08pvr
   16.57 +fzwhzLm1iPx1X0r0lASE1h/S7X8oTEbn3MW22VTYXjPMjSN5PT2K7Nu23Vr+aXYi
   16.58 +hi7DcnrRLFUlRpzfRA/2mk+u2+EUlHDIUs+tkCqBQoPNYkmPgIQvvIA1CVTqBimv
   16.59 +6KdATcBUpPcraEmybe7FborWSI/R9JDT5eiqNSjA3BlDCEDlok6Kh2oHZc3iTHpE
   16.60 +SuafB2bRKONY80bdB/9JtT/ZXoYWhTtR54wRqn6lAtdvT3NBprj8WQJFnSu6GNon
   16.61 +2PdJkQT+07A92gOxR1DdRU6QN+k0+0tuYez8+rrExUO6UpFi+4CrsYsWuYkGbszB
   16.62 +da5SII/+wTpLvaYdkfdj8b67CdTf2IiBxeMP7OluB5VOXgL2HafgHQptkqpBCYJj
   16.63 +4xu+mDx/0xtNLvWD2FKpshCbateo/vRgaE0WwQ+eRNAr5sXFya+qaeb1Wcm542IR
   16.64 +o0Yv6Gs4D3XZVDU1Q5TbCZfCanQuEWFXHlU7jCUNIqpbxIw3nMLV/KY4ssjw9gP/
   16.65 +dbb6LUU0f3Cqped3DYga7VpZYlG4Zi7micuBoqa0
   16.66 +=Cykw
   16.67 +-----END PGP PRIVATE KEY BLOCK-----
    17.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.2 +++ b/test/test_keys/pub/bcc_test_dude_0-0x1CCCFC41_pub.asc	Wed Jun 20 09:36:04 2018 +0200
    17.3 @@ -0,0 +1,37 @@
    17.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    17.5 +
    17.6 +mQENBFsXrp0BCADYI/0kZfPXEtCNjF97pKDT2tke4kJyjL6BuR/eCf/LuvYMYvcr
    17.7 +eTB528zfyUNCnRMHDkUg07ng9lBjUkVM5GiG+TObS7NcSzsBSK2MatCi1hXIKz6e
    17.8 +MrqYBybn1Ef8UnSs8Qt64v4F6m625R3yUDk8G3QpNMyi2ibUEOeU7qLfhdObxoGU
    17.9 ++IwFygPbKpeitWR/Hb5WUBPFF13kAqn3UjmXNGA/FW5oYNSV+ovZuoNXfUlxFKJk
   17.10 +b/MFv6s0MwEf7CAU/GcfEHWgx1jxsVBYDDkRHqkuiUHUTXWJGMthnbvABQFtX5bR
   17.11 +fIzMqCundqZCncAk1DKJWzIxBgHOtpcGncmrABEBAAG0N0JDQyBUZXN0IFBhcnRp
   17.12 +Y2lwYW50IDAgPGJjY190ZXN0X2R1ZGVfMEBkYXJ0aG1hbWEuY29vbD6JAU4EEwEI
   17.13 +ADgWIQQK6ao+MgWVz5Mpa9+hVaxJHMz8QQUCWxeunQIbLwULCQgHAgYVCgkICwIE
   17.14 +FgIDAQIeAQIXgAAKCRChVaxJHMz8QVY2B/9KLgvTenscM2MERB4fJ0WXUY5J8+oe
   17.15 +UaXRSq5hx4YfbmIA1GTAEwwW9NwDFyX6iu0wqNnlheW+zlhdY3Nhsb0OM3MChAgX
   17.16 +rteAXtR3bjsS+aq+I/hASLZ7N4L8JRZKyGtP0g6cSSFSOXgXwCegju8xBHmJsH/s
   17.17 +Sc9pCCK+wGIDL1mr+C75gPeN77UZHOl7Xf7ILZYeSh/V5erNaJ2hZm1PkYKMVxIK
   17.18 +tfXB6n6lHAFFJ9MJLloJ+IDWbMzBrkn8OTxxQtchrG/WQM8VFMSARCPUA+VvBvoJ
   17.19 +WekBlL4S7TnT9ttdVsHZAPOAA7ttkrZ+8oSZnU33H/PtJcXfrWrmgGJEuQENBFsX
   17.20 +rp0BCACpGtYkycsi5kjvWp2d1ztFECPqWgO6csoB5Bv7LJTnoqacwsnsuNXq4OcF
   17.21 +vArQfw6AoMDXi4SADpIWHn42yymX4N1Ba8fKmm2zE7fS0CSFfGh0QiY93Irts9+M
   17.22 +QgEFlKcJ5TdrrklqIDBZmZ73Cqk3cy2B2ZL8dUlG8/zFk06cwGlf2vNcsYU5vYWb
   17.23 +nfOLmH1Pzmbd3IoWOxT3Yfjrq3ecdTB56wY40j/tk2ISGQXs3/5O1qPLJYTDy86l
   17.24 +umB9WS35JCjrn50JqM5ipyx6dVGQS+N3cjAljhHsTxGsRr1WfruHzfEoS21+O3y8
   17.25 +HMlv1P8+Jx7D3mRRh2LZf0Q8yprtABEBAAGJAmwEGAEIACAWIQQK6ao+MgWVz5Mp
   17.26 +a9+hVaxJHMz8QQUCWxeunQIbLgFACRChVaxJHMz8QcB0IAQZAQgAHRYhBCjWK3P5
   17.27 +Nbis4voQy58GBhMYDIJQBQJbF66dAAoJEJ8GBhMYDIJQiJgIAI1L1RF7Doep5kYo
   17.28 +MP87dl5Kcy7uW0YJ7sIGKIKOC6odBMP5ffwNYFfNQGJDd/9Q3b7aIV6OkQ8HnCvj
   17.29 +joPb8Ub4mDZ5OqAESIC8q6ThzY1RgugFcp+eR32gzTUzpn+PIkwD9Hu5T/MxhoEJ
   17.30 +1k1ZtNxk6t9+kII5wZ+ZUZwmP0LPSANNMHA2F4oJHTpyN+YHYaf6aWzoXD4q8JkQ
   17.31 +012uHF34rUsVsD7pNEoCNjOu4R6MKOhrLPF7b7NQHgtVvXbZ9qBj/yxEfEUxOLbq
   17.32 +JxAVdUtO0j+u0eB4tuD5qaB0FKQ/fiCvNr8/paA6u3heuaX8Saum8ll2Xsh84PZT
   17.33 +hpBhpR8UoQgAzkqKpERMykCuYuk3K0vPqtenL1oG1Ptn4vYlrBzrcoXLvtVxq4j+
   17.34 +7iWBuvvoz3ePQifo+eOZrpe4dQriN+KnA0Qi7VX5YuVPNBYsvpcg9FqPkTBWO26m
   17.35 +kfEiSFOVD4IcCSmo4nveB6EMfJJO5S74+MWSJRaE9EhaV42lmnBP4n7aBvQ8yrxE
   17.36 +qd4LQyCTgJpLAVswWT8cBNwmUuWqKSl6vmZ7mwdWJP2N4qgTnuG0ZCXcLgXHaySK
   17.37 +ICo0SpjtcFCTUYMpYGpWTW1VrO0zfqUMGPe0BzmtCYZjgA3bAp6qYtLTgZZLpwkr
   17.38 +O0PIdJo6tZF13FIQU7TYKTVjde50IF5efw==
   17.39 +=ABTI
   17.40 +-----END PGP PUBLIC KEY BLOCK-----
    18.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    18.2 +++ b/test/test_keys/pub/bcc_test_dude_1-0xDAC746BE_pub.asc	Wed Jun 20 09:36:04 2018 +0200
    18.3 @@ -0,0 +1,37 @@
    18.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    18.5 +
    18.6 +mQENBFsXrqcBCACsJqCAgpquWOhW0pxDTpe+OZHyowNewOK2E4xyQk+710YdKIrg
    18.7 +I8j9+l1E4gUgJ+IiP7AIoTo89CcQINSt4Dith1+AjZgVnN4jxC5Jg7oARafALOxm
    18.8 +kF3mcRqA1T/e7TKBlx5MXwz2HPQBDKRekYomiFXPbBAYnSaTzGoVPmLAULf+TgoT
    18.9 +MtXRG59zHmUtV8ZVTttT9tCAWie0pBscQVL1x/D6x3a221JBcfhcrLFMJf0UoWGB
   18.10 +nlBEzrLQNrl3XRYyQJXCN0BpWvyZBPM35KfGifc7zV70Qrz2XGhSv/lpZct5/D8I
   18.11 +L5GclT2b0VFdVBYbiCPZZj6DbHxtXwDBwmf3ABEBAAG0N0JDQyBUZXN0IFBhcnRp
   18.12 +Y2lwYW50IDEgPGJjY190ZXN0X2R1ZGVfMUBkYXJ0aG1hbWEuY29vbD6JAU4EEwEI
   18.13 +ADgWIQTQry+WleGGqNwFi5Nf4nk92sdGvgUCWxeupwIbLwULCQgHAgYVCgkICwIE
   18.14 +FgIDAQIeAQIXgAAKCRBf4nk92sdGvhPfCACH4rdbxWmPyp3KC4SRfX0hs9tDi4IM
   18.15 +yp0FKasZZR6TS25B0wPHcn5Ujd2U78sZUSWFiB3uajBSU8tZ5OhF/6Kq8OjD1gKy
   18.16 +Wr5fBBP78Jia20eOye63wVM8UCfJoTrZk+vtfFnC3tU7+xT+1XB/EkXLr8vV92sH
   18.17 +ziplhdWQ7Ufc6Ise6zwZarAEqPdQImLUE+fUk/HnCIS7mh36lXS7pTm3RUHbraxL
   18.18 +d+FFbwfoHydcJRqwIiiFqQY60oWLi5TcEdw8RltoTpv1XZYYyqOQCAqZXAdWmjCv
   18.19 +1xo+teEku9TW4TqBMKJTs8CVxLFF3YN6Lgnju4L9Q2hfiXlSutCwFurcuQENBFsX
   18.20 +rqcBCADP7ZCJ4UluQDpguMuSCa/fPI8RUDQzFppdLgBf14iuoCIaSKEtA/fPa0Jk
   18.21 +Q+SGHHR3y013lIEfdSI2hwUSvEDSZIJJ7pVrMkqooHNqO92yrM55f6nkBNFZc7jj
   18.22 +1AP5VlgyAOirKF/ocPCl/d/mz13zHEDqbnx3/ky8j9PVfZlZ45FbK50ErPvFlH2e
   18.23 +lOaS/BILHBpo2DFsBwZRZdyLfn/EQkwPtgpznd+erx6zD8Be548/DLjDmgQEWRQ0
   18.24 +71rVdvIOInCEnXdDoWWpq+4gfU1nKwMfKvQOvq1qeTJOKhMPkJQDciAvgN4TGvRK
   18.25 +CaNoB3yrAYu6kj77+C9qvf9ZJZl9ABEBAAGJAmwEGAEIACAWIQTQry+WleGGqNwF
   18.26 +i5Nf4nk92sdGvgUCWxeupwIbLgFACRBf4nk92sdGvsB0IAQZAQgAHRYhBKzvhDSR
   18.27 +UUC9vyWSEMYlKpnI+14GBQJbF66nAAoJEMYlKpnI+14GhqIH/0q0ulT0JI9nNYjw
   18.28 +BQTMZ1cx5otcBEZUT19dMKXVfmMsS0T2gpIwp63iPw3l1UiamXf1TgS8P7mYg05p
   18.29 +ctdbdQuI2Q47sxHAKKGGozIrgrsPHc/lyWXd9do/IXmS9e8rX2G4YnRA61cJzpBy
   18.30 ++nSi36t/7uIlbrghQ7yfBfCv9748Q+5AwPa1v3PKtkARLEtTA17OQR5FM29TcI1v
   18.31 +Tkhbs+6VpoHffbvwcWj9TNl4eGpfUgNXwEVxUFGocFJ++7oUxYUC53qKONB5X9Aw
   18.32 +3zzwXyFwgpipcXKoGghf5vl5mAz8/UfeucfsvzJHvF2ST4I5qHXty0Et5f/LqZTw
   18.33 ++Cz4x4HIcQf+OZjmh3DazM1OS8fLZsPg1Hhe0S9HDNxcZDZx7pgG6VjRosbpuBYN
   18.34 +4Gembwn5HMaTG7SHn33EuTeo395HCuJXEHGWe8UDyo+kheIhWb/D/FbK2sWRopeh
   18.35 +eZKmZHZPBFCHsH9zXzOvh+WJAe6y27gM4Ro2vh24jYMxWp+ONVODbiq6GsaB8D1t
   18.36 +Mkh4vKDmDufpPjEoIBNFnbmPzdT0ply1fxRTR+tCdgAIBDC+beVSbZUXAvtA/x3p
   18.37 +oIaeK4yRJ2xwBD6VrULwpZVkRpXav7SHMC7NkQ8eC9jm+zj5lUDcCsyLQhZV1rZw
   18.38 +RICSOt4E7BTD58NBP1AwkWQE7IZkFIkVPg==
   18.39 +=aoCm
   18.40 +-----END PGP PUBLIC KEY BLOCK-----
    19.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    19.2 +++ b/test/test_keys/pub/bcc_test_dude_2-0x53CECCF7_pub.asc	Wed Jun 20 09:36:04 2018 +0200
    19.3 @@ -0,0 +1,37 @@
    19.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    19.5 +
    19.6 +mQENBFsXrq4BCAC/A0IRUN17SqPDvTPN7XkLtg4Cear8oMWQRCX+OKoYVthbZJYZ
    19.7 +/XCHWgDqPtIEEzbT1607060ucWjWnGq3eMpnooxfVl2YclhrK/qdAkWe/CTb3c33
    19.8 +nXkGH8fBt+Memdn5Tuj92qnCqAdVSPeIx9ExBy4v/3j1jmZP6c/7TdsvPrz8GMy7
    19.9 +pQ2H4bkq0I8QNYs/rF1vZXnvRoXgunA5SlVmUakewixUicBpG/PRgAZnZHnfrwKH
   19.10 +AVmGQv7gfbAi4QYrgeZEthEJerHcD+OTKu/GVEjF0iH89oq8W/l2VQ7xRsiNZHWO
   19.11 +i+pABNR2Q5qMq0ja1Pb65dgG8pKtU8z/1GEvABEBAAG0N0JDQyBUZXN0IFBhcnRp
   19.12 +Y2lwYW50IDIgPGJjY190ZXN0X2R1ZGVfMkBkYXJ0aG1hbWEuY29vbD6JAU4EEwEI
   19.13 +ADgWIQSzbkaOejgZRvzb3fqEsfPoU87M9wUCWxeurgIbLwULCQgHAgYVCgkICwIE
   19.14 +FgIDAQIeAQIXgAAKCRCEsfPoU87M98SNB/4oh5JrBPf8MIWLbRMrN+/qPXuNMvye
   19.15 +gfVA7KQA/YfiX7MkacCYhu33zIHSg7EY7pzUM8Kiuw7C3I8Rnb3zSvTarI73Z6g1
   19.16 +5nOHuFseyGcJCQj29uu15eUCwLMmz2WAH0u2JWNMs7TqGDQcE7sVOU/ryIAWMa90
   19.17 +dsObbRD6F1Sy4wLx/6DK2ErZX9rJe+2oY+8pFzzxl2lQb4I3YRDmwlHhOlmcEWFK
   19.18 +lHkeenVzREAi7x5MxRe4mUMK/wbo/IEGYXRWj2JhS6Uww+D0YJxQW6z1SJaQogTT
   19.19 +kg/qOBrhvwAIKAkgCodu5FYTRbAIu7M1UcIBR4vzO8d7HxY7y37DbAZtuQENBFsX
   19.20 +rq4BCAC7a8uQPa8IODpG/05ti4kb0on5PVYqxC841sUeqF7MP5ptoznP5RnY45QD
   19.21 +ZKJD/ats+kXi9F94qJBPNIMeFW/W35dZN/8s6PBAA3GYkSiRWoz53AOQsNv5ckXT
   19.22 +811KQ+CJOgw0tWX2s8W6wdkcsKVeFRx+lo4JVU8h3iSftG0Ukl8HyCIdHNwpsIf1
   19.23 +7OAz7ZeMYCUstryVwxsPkAAMsU6QK61bXMIPUlWvAZeK0duoVsq9X/NF0fh/RiqD
   19.24 +rL8ee8sovuvh2wAL/gdfOMGesKn5P8THp8Z6mfCRj+A2TFwMpHULQv3hRniWqHi7
   19.25 +zaHYWYz9WaNyI9WCybWpfv95K+TXABEBAAGJAmwEGAEIACAWIQSzbkaOejgZRvzb
   19.26 +3fqEsfPoU87M9wUCWxeurgIbLgFACRCEsfPoU87M98B0IAQZAQgAHRYhBPpSxZHM
   19.27 +97bctr8PVcqESPwP9RoPBQJbF66uAAoJEMqESPwP9RoPGsQH/0k2NKWAzAPlNDXq
   19.28 +ks+pt5zXc1sBHCcSwnf4IBZuktGNfbGCutaPmFWRVci9y4BTeZTDdrdQaRMz0EFD
   19.29 +Cgb0by3+tlUCYN+8dZXPYv2/zEbBIH+vxC5ntmm/kvkkfWb83lATdPKb6388Icy5
   19.30 +tYj8dV9K9JQEhNYf0u1/KExG59zFttlU2F4zzI0jeT09iuzbtt1a/ml2IoYuw3J6
   19.31 +0SxVJUac30QP9ppPrtvhFJRwyFLPrZAqgUKDzWJJj4CEL7yANQlU6gYpr+inQE3A
   19.32 +VKT3K2hJsm3uxW6K1kiP0fSQ0+XoqjUowNwZQwhA5aJOiodqB2XN4kx6RErmnwdm
   19.33 +0SjjWPNG3Qf/SbU/2V6GFoU7UeeMEap+pQLXb09zQaa4/FkCRZ0ruhjaJ9j3SZEE
   19.34 +/tOwPdoDsUdQ3UVOkDfpNPtLbmHs/Pq6xMVDulKRYvuAq7GLFrmJBm7MwXWuUiCP
   19.35 +/sE6S72mHZH3Y/G+uwnU39iIgcXjD+zpbgeVTl4C9h2n4B0KbZKqQQmCY+Mbvpg8
   19.36 +f9MbTS71g9hSqbIQm2rXqP70YGhNFsEPnkTQK+bFxcmvqmnm9VnJueNiEaNGL+hr
   19.37 +OA912VQ1NUOU2wmXwmp0LhFhVx5VO4wlDSKqW8SMN5zC1fymOLLI8PYD/3W2+i1F
   19.38 +NH9wqqXndw2IGu1aWWJRuGYu5onLgaKmtA==
   19.39 +=O1eU
   19.40 +-----END PGP PUBLIC KEY BLOCK-----