...
authorvb
Sun, 08 Feb 2015 11:33:04 -0500
changeset 489ff5d2dfa75a
parent 47 5ed7e8a4f0c2
child 49 9143054c0213
...
src/cryptotech.h
src/etpan_mime.c
src/etpan_mime.h
src/message_api.c
src/message_api.h
src/mime.c
src/mime.h
src/pEp_internal.h
src/transport.c
src/transport.h
test/DF9B1541-sec.key
test/DF9B1541.key
test/Makefile
test/message_api_test.cc
     1.1 --- a/src/cryptotech.h	Mon Jan 26 13:11:40 2015 +0100
     1.2 +++ b/src/cryptotech.h	Sun Feb 08 11:33:04 2015 -0500
     1.3 @@ -13,38 +13,38 @@
     1.4  } PEP_cryptotech;
     1.5  
     1.6  typedef PEP_STATUS (*decrypt_and_verify_t)(
     1.7 -    PEP_SESSION session, const char *ctext, size_t csize,
     1.8 -    char **ptext, size_t *psize, stringlist_t **keylist
     1.9 +        PEP_SESSION session, const char *ctext, size_t csize,
    1.10 +        char **ptext, size_t *psize, stringlist_t **keylist
    1.11      );
    1.12  
    1.13  typedef PEP_STATUS (*verify_text_t)(
    1.14 -    PEP_SESSION session, const char *text, size_t size,
    1.15 -    const char *signature, size_t sig_size, stringlist_t **keylist
    1.16 +        PEP_SESSION session, const char *text, size_t size,
    1.17 +        const char *signature, size_t sig_size, stringlist_t **keylist
    1.18      );
    1.19  
    1.20  typedef PEP_STATUS (*encrypt_and_sign_t)(
    1.21 -    PEP_SESSION session, const stringlist_t *keylist, const char *ptext,
    1.22 -    size_t psize, char **ctext, size_t *csize
    1.23 +        PEP_SESSION session, const stringlist_t *keylist, const char *ptext,
    1.24 +        size_t psize, char **ctext, size_t *csize
    1.25      );
    1.26  
    1.27  typedef PEP_STATUS (*delete_keypair_t)(PEP_SESSION session, const char *fpr);
    1.28  
    1.29  typedef PEP_STATUS (*export_key_t)(
    1.30 -    PEP_SESSION session, const char *fpr, char **key_data, size_t *size
    1.31 +        PEP_SESSION session, const char *fpr, char **key_data, size_t *size
    1.32      );
    1.33  
    1.34  typedef PEP_STATUS (*find_keys_t)(
    1.35 -    PEP_SESSION session, const char *pattern, stringlist_t **keylist
    1.36 +        PEP_SESSION session, const char *pattern, stringlist_t **keylist
    1.37      );
    1.38  
    1.39  typedef PEP_STATUS (*generate_keypair_t)(
    1.40 -    PEP_SESSION session, pEp_identity *identity
    1.41 +        PEP_SESSION session, pEp_identity *identity
    1.42      );
    1.43  
    1.44  typedef PEP_STATUS (*get_key_rating_t)(
    1.45 -    PEP_SESSION session,
    1.46 -    const char *fpr,
    1.47 -    PEP_comm_type *comm_type
    1.48 +        PEP_SESSION session,
    1.49 +        const char *fpr,
    1.50 +        PEP_comm_type *comm_type
    1.51      );
    1.52  
    1.53  typedef PEP_STATUS (*import_key_t)(PEP_SESSION session, const char *key_data, size_t size);
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/src/etpan_mime.c	Sun Feb 08 11:33:04 2015 -0500
     2.3 @@ -0,0 +1,204 @@
     2.4 +#include <string.h>
     2.5 +#include <stdlib.h>
     2.6 +#include <unistd.h>
     2.7 +
     2.8 +#include "etpan_mime.h"
     2.9 +
    2.10 +#define MAX_MESSAGE_ID 512
    2.11 +
    2.12 +static char * generate_boundary(const char * boundary_prefix)
    2.13 +{
    2.14 +    char id[MAX_MESSAGE_ID];
    2.15 +    time_t now;
    2.16 +    char name[MAX_MESSAGE_ID];
    2.17 +    long value;
    2.18 +    
    2.19 +    now = time(NULL);
    2.20 +#ifndef WIN32
    2.21 +    value = random();
    2.22 +    
    2.23 +    gethostname(name, MAX_MESSAGE_ID);
    2.24 +#else
    2.25 +    value = now;
    2.26 +    strcpy(name, "WINDOWS");
    2.27 +#endif
    2.28 +    
    2.29 +    if (boundary_prefix == NULL)
    2.30 +        boundary_prefix = "";
    2.31 +    
    2.32 +    snprintf(id, MAX_MESSAGE_ID, "%s%lx_%lx_%x", boundary_prefix, now, value,
    2.33 +            getpid());
    2.34 +    
    2.35 +    return strdup(id);
    2.36 +}
    2.37 +
    2.38 +struct mailmime * part_new_empty(
    2.39 +        struct mailmime_content * content,
    2.40 +        struct mailmime_fields * mime_fields,
    2.41 +        const char * boundary_prefix,
    2.42 +        int force_single
    2.43 +    )
    2.44 +{
    2.45 +	struct mailmime * build_info;
    2.46 +	clist * list;
    2.47 +	int r;
    2.48 +	int mime_type;
    2.49 +
    2.50 +	list = NULL;
    2.51 +
    2.52 +	if (force_single) {
    2.53 +		mime_type = MAILMIME_SINGLE;
    2.54 +	}
    2.55 +	else {
    2.56 +		switch (content->ct_type->tp_type) {
    2.57 +			case MAILMIME_TYPE_DISCRETE_TYPE:
    2.58 +			mime_type = MAILMIME_SINGLE;
    2.59 +			break;
    2.60 +
    2.61 +			case MAILMIME_TYPE_COMPOSITE_TYPE:
    2.62 +			switch (content->ct_type->tp_data.tp_composite_type->ct_type) {
    2.63 +				case MAILMIME_COMPOSITE_TYPE_MULTIPART:
    2.64 +				mime_type = MAILMIME_MULTIPLE;
    2.65 +				break;
    2.66 +
    2.67 +				case MAILMIME_COMPOSITE_TYPE_MESSAGE:
    2.68 +				if (strcasecmp(content->ct_subtype, "rfc822") == 0)
    2.69 +					mime_type = MAILMIME_MESSAGE;
    2.70 +				else
    2.71 +					mime_type = MAILMIME_SINGLE;
    2.72 +				break;
    2.73 +
    2.74 +				default:
    2.75 +				goto err;
    2.76 +			}
    2.77 +			break;
    2.78 +
    2.79 +			default:
    2.80 +			goto err;
    2.81 +		}
    2.82 +	}
    2.83 +
    2.84 +	if (mime_type == MAILMIME_MULTIPLE) {
    2.85 +		char * attr_name;
    2.86 +		char * attr_value;
    2.87 +		struct mailmime_parameter * param;
    2.88 +		clist * parameters;
    2.89 +		char * boundary;
    2.90 +
    2.91 +		list = clist_new();
    2.92 +		if (list == NULL)
    2.93 +			goto err;
    2.94 +
    2.95 +		attr_name = strdup("boundary");
    2.96 +		boundary = generate_boundary(boundary_prefix);
    2.97 +		attr_value = boundary;
    2.98 +		if (attr_name == NULL) {
    2.99 +			free(attr_name);
   2.100 +			goto free_list;
   2.101 +		}
   2.102 +
   2.103 +		param = mailmime_parameter_new(attr_name, attr_value);
   2.104 +		if (param == NULL) {
   2.105 +			free(attr_value);
   2.106 +			free(attr_name);
   2.107 +			goto free_list;
   2.108 +		}
   2.109 +
   2.110 +		if (content->ct_parameters == NULL) {
   2.111 +			parameters = clist_new();
   2.112 +			if (parameters == NULL) {
   2.113 +				mailmime_parameter_free(param);
   2.114 +				goto free_list;
   2.115 +			}
   2.116 +		}
   2.117 +		else
   2.118 +			parameters = content->ct_parameters;
   2.119 +
   2.120 +		r = clist_append(parameters, param);
   2.121 +		if (r != 0) {
   2.122 +			clist_free(parameters);
   2.123 +			mailmime_parameter_free(param);
   2.124 +			goto free_list;
   2.125 +		}
   2.126 +
   2.127 +		if (content->ct_parameters == NULL)
   2.128 +			content->ct_parameters = parameters;
   2.129 +	}
   2.130 +
   2.131 +	build_info = mailmime_new(mime_type,
   2.132 +		NULL, 0, mime_fields, content,
   2.133 +		NULL, NULL, NULL, list,
   2.134 +		NULL, NULL);
   2.135 +	if (build_info == NULL) {
   2.136 +		clist_free(list);
   2.137 +		return NULL;
   2.138 +	}
   2.139 +
   2.140 +	return build_info;
   2.141 +
   2.142 +	free_list:
   2.143 +	clist_free(list);
   2.144 +	err:
   2.145 +	return NULL;
   2.146 +}
   2.147 +
   2.148 +struct mailmime * get_text_part(
   2.149 +        const char * mime_type,
   2.150 +        const char * text,
   2.151 +        size_t length,
   2.152 +        int encoding_type
   2.153 +    )
   2.154 +{
   2.155 +	struct mailmime_fields * mime_fields;
   2.156 +	struct mailmime * mime;
   2.157 +	struct mailmime_content * content;
   2.158 +	struct mailmime_parameter * param;
   2.159 +	struct mailmime_disposition * disposition;
   2.160 +	struct mailmime_mechanism * encoding;
   2.161 +    
   2.162 +	encoding = mailmime_mechanism_new(encoding_type, NULL);
   2.163 +	disposition = mailmime_disposition_new_with_data(MAILMIME_DISPOSITION_TYPE_INLINE,
   2.164 +		NULL, NULL, NULL, NULL, (size_t) -1);
   2.165 +	mime_fields = mailmime_fields_new_with_data(encoding,
   2.166 +		NULL, NULL, disposition, NULL);
   2.167 +
   2.168 +	content = mailmime_content_new_with_str(mime_type);
   2.169 +	param = mailmime_param_new_with_data("charset", "utf-8");
   2.170 +	clist_append(content->ct_parameters, param);
   2.171 +	mime = part_new_empty(content, mime_fields, NULL, 1);
   2.172 +	mailmime_set_body_text(mime, (char *) text, length);
   2.173 +	
   2.174 +	return mime;
   2.175 +}
   2.176 +
   2.177 +struct mailmime * part_multiple_new(
   2.178 +        const char * type,
   2.179 +        const char * boundary_prefix
   2.180 +    )
   2.181 +{
   2.182 +    struct mailmime_fields * mime_fields;
   2.183 +    struct mailmime_content * content;
   2.184 +    struct mailmime * mp;
   2.185 +    
   2.186 +    mime_fields = mailmime_fields_new_empty();
   2.187 +    if (mime_fields == NULL)
   2.188 +        goto err;
   2.189 +    
   2.190 +    content = mailmime_content_new_with_str(type);
   2.191 +    if (content == NULL)
   2.192 +        goto free_fields;
   2.193 +    
   2.194 +    mp = part_new_empty(content, mime_fields, boundary_prefix, 0);
   2.195 +    if (mp == NULL)
   2.196 +        goto free_content;
   2.197 +    
   2.198 +    return mp;
   2.199 +    
   2.200 +free_content:
   2.201 +    mailmime_content_free(content);
   2.202 +free_fields:
   2.203 +    mailmime_fields_free(mime_fields);
   2.204 +err:
   2.205 +    return NULL;
   2.206 +}
   2.207 +
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/src/etpan_mime.h	Sun Feb 08 11:33:04 2015 -0500
     3.3 @@ -0,0 +1,24 @@
     3.4 +#pragma once
     3.5 +
     3.6 +#include <libetpan/libetpan.h>
     3.7 +
     3.8 +
     3.9 +struct mailmime * part_new_empty(
    3.10 +        struct mailmime_content * content,
    3.11 +        struct mailmime_fields * mime_fields,
    3.12 +        const char * boundary_prefix,
    3.13 +        int force_single
    3.14 +    );
    3.15 +
    3.16 +struct mailmime * get_text_part(
    3.17 +        const char * mime_type,
    3.18 +        const char * text,
    3.19 +        size_t length,
    3.20 +        int encoding_type
    3.21 +    );
    3.22 +
    3.23 +struct mailmime * part_multiple_new(
    3.24 +        const char * type,
    3.25 +        const char * boundary_prefix
    3.26 +    );
    3.27 +
     4.1 --- a/src/message_api.c	Mon Jan 26 13:11:40 2015 +0100
     4.2 +++ b/src/message_api.c	Sun Feb 08 11:33:04 2015 -0500
     4.3 @@ -11,149 +11,8 @@
     4.4  
     4.5  #define NOT_IMPLEMENTED assert(0);
     4.6  
     4.7 -PEP_STATUS mime_encode_parts(const message *src, message **dst)
     4.8 -{
     4.9 -    struct mailmime * mime_body;
    4.10  
    4.11 -    assert(src);
    4.12 -    assert(src->enc_format == PEP_enc_none);
    4.13 -    assert(dst);
    4.14 -
    4.15 -    if (src->enc_format != PEP_enc_none)
    4.16 -        return PEP_ILLEGAL_VALUE;
    4.17 -
    4.18 -    *dst = NULL;
    4.19 -
    4.20 -    if (src->longmsg && src->longmsg_formatted) {
    4.21 -        struct mailmime * mime_text;
    4.22 -        struct mailmime * mime_html;
    4.23 -        NOT_IMPLEMENTED
    4.24 -    }
    4.25 -    else if (src->longmsg) {
    4.26 -        struct mailmime_fields * mime_fields
    4.27 -                = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT);
    4.28 -        assert(mime_fields);
    4.29 -        if (mime_fields == NULL)
    4.30 -            return PEP_OUT_OF_MEMORY;
    4.31 -
    4.32 -        struct mailmime_content * content
    4.33 -                = mailmime_content_new_with_str("text/plain");
    4.34 -        assert(content);
    4.35 -        if (content == NULL) {
    4.36 -            mailmime_fields_free(mime_fields);
    4.37 -            return PEP_OUT_OF_MEMORY;
    4.38 -        }
    4.39 -
    4.40 -        struct mailmime_parameter * param
    4.41 -                = mailmime_param_new_with_data("charset", "utf-8");
    4.42 -        assert(param);
    4.43 -        if (param == NULL) {
    4.44 -            mailmime_fields_free(mime_fields);
    4.45 -            mailmime_content_free(content);
    4.46 -            return PEP_OUT_OF_MEMORY;
    4.47 -        }
    4.48 -
    4.49 -        int r = clist_append(content->ct_parameters, param);
    4.50 -        if (r < 0) {
    4.51 -            mailmime_fields_free(mime_fields);
    4.52 -            mailmime_content_free(content);
    4.53 -            mailmime_parameter_free(param);
    4.54 -            return PEP_OUT_OF_MEMORY;
    4.55 -        }
    4.56 -
    4.57 -        mime_body = mailmime_new_empty(content, mime_fields);
    4.58 -        if (mime_body == NULL) {
    4.59 -            mailmime_fields_free(mime_fields);
    4.60 -            mailmime_content_free(content);
    4.61 -            return PEP_OUT_OF_MEMORY;
    4.62 -        }
    4.63 -
    4.64 -        r = mailmime_set_body_text(mime_body, src->longmsg, strlen(src->longmsg));
    4.65 -        if (r != MAILIMF_NO_ERROR) {
    4.66 -            mailmime_free(mime_body);
    4.67 -            return PEP_OUT_OF_MEMORY;
    4.68 -        }
    4.69 -    }
    4.70 -    else if (src->longmsg_formatted) {
    4.71 -        NOT_IMPLEMENTED
    4.72 -    }
    4.73 - 
    4.74 -    char *fn = strdup("/tmp/pEp.XXXXXXXXXX");
    4.75 -    assert(fn);
    4.76 -    if (fn == NULL) {
    4.77 -        mailmime_free(mime_body);
    4.78 -        return PEP_OUT_OF_MEMORY;
    4.79 -    }
    4.80 -
    4.81 -    int f = mkstemp(fn);
    4.82 -    assert(f != -1);
    4.83 -    free(fn);
    4.84 -    if (f == -1) {
    4.85 -        mailmime_free(mime_body);
    4.86 -        return PEP_CANNOT_CREATE_TEMP_FILE;
    4.87 -    }
    4.88 -
    4.89 -    FILE *fp = fdopen(f, "w+");
    4.90 -    assert(fp);
    4.91 -    if (fp == NULL) {
    4.92 -        return PEP_CANNOT_CREATE_TEMP_FILE;
    4.93 -    }
    4.94 -    // unlink(fn);
    4.95 -
    4.96 -    int col = 0;
    4.97 -    int r = mailmime_write_file(fp, &col, mime_body);
    4.98 -    assert(r == MAILIMF_NO_ERROR);
    4.99 -    mailmime_free(mime_body);
   4.100 -    if (r != MAILIMF_NO_ERROR) {
   4.101 -        fclose(fp);
   4.102 -        return PEP_CANNOT_CREATE_TEMP_FILE;
   4.103 -    }
   4.104 -
   4.105 -    rewind(fp);
   4.106 -
   4.107 -    char *buf = (char *) calloc(1, col + 1);
   4.108 -    assert(buf);
   4.109 -    if (buf == NULL) {
   4.110 -        fclose(fp);
   4.111 -        return PEP_OUT_OF_MEMORY;
   4.112 -    }
   4.113 -
   4.114 -    size_t size = fread(buf, col, 1, fp);
   4.115 -    assert(size);
   4.116 -    fclose(fp);
   4.117 -    if (size == 0L) {
   4.118 -        free(buf);
   4.119 -        return PEP_CANNOT_CREATE_TEMP_FILE;
   4.120 -    }
   4.121 -
   4.122 -    message *msg = new_message(src->dir, src->from, src->to, src->shortmsg);
   4.123 -    if (msg == NULL) {
   4.124 -        free(buf);
   4.125 -        return PEP_OUT_OF_MEMORY;
   4.126 -    }
   4.127 -    msg->longmsg = buf;
   4.128 -
   4.129 -    *dst = msg;
   4.130 -    return PEP_STATUS_OK;
   4.131 -}
   4.132 -
   4.133 -PEP_STATUS mime_decode_parts(const message *src, message **dst)
   4.134 -{
   4.135 -    PEP_STATUS status = PEP_STATUS_OK;
   4.136 -
   4.137 -    assert(src);
   4.138 -    assert(src->enc_format == PEP_enc_none_MIME);
   4.139 -    assert(dst);
   4.140 -
   4.141 -    if (src->enc_format != PEP_enc_none_MIME)
   4.142 -        return PEP_ILLEGAL_VALUE;
   4.143 -
   4.144 -    *dst = NULL;
   4.145 -
   4.146 -    return status;
   4.147 -}
   4.148 -
   4.149 -PEP_STATUS encrypt_message(
   4.150 +DYNAMIC_API PEP_STATUS encrypt_message(
   4.151          PEP_SESSION session,
   4.152          const message *src,
   4.153          stringlist_t * extra,
   4.154 @@ -182,6 +41,7 @@
   4.155      message *msg = new_message(src->dir, from, to, NULL);
   4.156      if (msg == NULL)
   4.157          return PEP_OUT_OF_MEMORY;
   4.158 +    msg->enc_format = PEP_enc_pieces;
   4.159  
   4.160      from->me = true;
   4.161  
   4.162 @@ -234,15 +94,20 @@
   4.163          char *ptext;
   4.164          char *ctext = NULL;
   4.165          size_t csize = 0;
   4.166 +        msg->enc_format = PEP_enc_pieces;
   4.167  
   4.168          switch (format) {
   4.169          case PEP_enc_MIME_multipart: {
   4.170 -            *dst = msg;
   4.171 -            break;
   4.172 +            message *interim;
   4.173 +//            status = mime_encode_parts(src, &interim);
   4.174 +//            assert(status == PEP_STATUS_OK);
   4.175 +//            if (status != PEP_STATUS_OK)
   4.176 +//                break;
   4.177 +            msg->enc_format = PEP_enc_MIME_multipart;
   4.178          }
   4.179  
   4.180          case PEP_enc_pieces:
   4.181 -            if (src->shortmsg && src->longmsg) {
   4.182 +            if (src->shortmsg && src->longmsg && strcmp(src->shortmsg, "pEp") != 0) {
   4.183                  ptext = calloc(1, strlen(src->shortmsg) + strlen(src->longmsg)
   4.184                          + 12);
   4.185                  if (ptext == NULL) {
   4.186 @@ -270,7 +135,7 @@
   4.187                      msg = NULL;
   4.188                  }
   4.189              }
   4.190 -            else if (src->shortmsg) {
   4.191 +            else if (src->shortmsg && strcmp(src->shortmsg, "pEp") != 0) {
   4.192                  ptext = calloc(1, strlen(src->shortmsg) + 12);
   4.193                  if (ptext == NULL) {
   4.194                      free_message(msg);
   4.195 @@ -366,7 +231,6 @@
   4.196                          }
   4.197                      }
   4.198                  }
   4.199 -                msg->enc_format = PEP_enc_pieces;
   4.200                  *dst = msg;
   4.201              }
   4.202              break;
   4.203 @@ -382,7 +246,7 @@
   4.204      return status;
   4.205  }
   4.206  
   4.207 -PEP_STATUS decrypt_message(
   4.208 +DYNAMIC_API PEP_STATUS decrypt_message(
   4.209          PEP_SESSION session,
   4.210          const message *src,
   4.211          message **dst
     5.1 --- a/src/message_api.h	Mon Jan 26 13:11:40 2015 +0100
     5.2 +++ b/src/message_api.h	Sun Feb 08 11:33:04 2015 -0500
     5.3 @@ -7,47 +7,22 @@
     5.4  #include "transport.h"
     5.5  
     5.6  
     5.7 -// mime_encode_parts() - encode message with MIME
     5.8 -//  parameters:
     5.9 -//      src                 message to encode
    5.10 -//      dst                 encoded message or NULL on error
    5.11 -//
    5.12 -//  return value:
    5.13 -//      error status or PEP_STATUS_OK on success
    5.14 -//
    5.15 -//  caveat:
    5.16 -//      message must be unencrypted
    5.17 -
    5.18 -DYNAMIC_API PEP_STATUS mime_encode_parts(const message *src, message **dst);
    5.19 -
    5.20 -
    5.21 -// mime_decode_parts() - decode MIME message
    5.22 -//  parameters:
    5.23 -//      src                 message to decode
    5.24 -//      dst                 decoded message or NULL on error
    5.25 -//
    5.26 -//  return value:
    5.27 -//      error status or PEP_STATUS_OK on success
    5.28 -//
    5.29 -//  caveat:
    5.30 -//      message must be unencrypted
    5.31 -
    5.32 -DYNAMIC_API PEP_STATUS mime_decode_parts(const message *src, message **dst);
    5.33 -
    5.34 -
    5.35  // encrypt_message() - encrypt message in memory
    5.36  //
    5.37  //  parameters:
    5.38 -//      session             session handle
    5.39 -//      src                 message to encrypt
    5.40 -//      extra               extra keys for encryption
    5.41 -//      dst                 pointer to encrypted message or NULL on failure
    5.42 -//      format              encryption format
    5.43 +//      session (in)        session handle
    5.44 +//      src (in)            message to encrypt
    5.45 +//      extra (in)          extra keys for encryption
    5.46 +//      dst (out)           pointer to encrypted message or NULL on failure
    5.47 +//      format (in)         encryption format
    5.48  //
    5.49  //  return value:
    5.50 -//      error status or PEP_STATUS_OK on success; PEP_KEY_NOT_FOUND if one
    5.51 -//      or more keys couldn't be found, but the message could be encrypted
    5.52 -//      with other keys
    5.53 +//      PEP_STATUS_OK                   on success
    5.54 +//		PEP_KEY_NOT_FOUND	            at least one of the receipient keys
    5.55 +//		                                could not be found
    5.56 +//		PEP_KEY_HAS_AMBIG_NAME          at least one of the receipient keys has
    5.57 +//		                                an ambiguous name
    5.58 +//		PEP_GET_KEY_FAILED		        cannot retrieve key
    5.59  
    5.60  DYNAMIC_API PEP_STATUS encrypt_message(
    5.61          PEP_SESSION session,
    5.62 @@ -61,9 +36,9 @@
    5.63  // decrypt_message() - decrypt message in memory
    5.64  //
    5.65  //  parameters:
    5.66 -//      session             session handle
    5.67 -//      src                 message to decrypt
    5.68 -//      dst                 pointer to decrypted message or NULL on failure
    5.69 +//      session (in)        session handle
    5.70 +//      src (in)            message to decrypt
    5.71 +//      dst (out)           pointer to decrypted message or NULL on failure
    5.72  //
    5.73  //  return value:
    5.74  //      error status or PEP_STATUS_OK on success
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/src/mime.c	Sun Feb 08 11:33:04 2015 -0500
     6.3 @@ -0,0 +1,180 @@
     6.4 +#include "mime.h"
     6.5 +
     6.6 +#include <libetpan/libetpan.h>
     6.7 +#include <string.h>
     6.8 +#include <stdlib.h>
     6.9 +#include <assert.h>
    6.10 +#include <errno.h>
    6.11 +#include <unistd.h>
    6.12 +
    6.13 +#include "etpan_mime.h"
    6.14 +
    6.15 +DYNAMIC_API PEP_STATUS mime_encode_text(
    6.16 +        const char *plaintext,
    6.17 +        const char *htmltext,
    6.18 +        char **resulttext
    6.19 +    )
    6.20 +{
    6.21 +    struct mailmime * msg_mime = NULL;
    6.22 +	struct mailimf_fields * fields = NULL;
    6.23 +    struct mailmime * mime = NULL;
    6.24 +    struct mailmime * submime = NULL;
    6.25 +    int col;
    6.26 +    int r;
    6.27 +    int fd;
    6.28 +    FILE *file = NULL;
    6.29 +    size_t size;
    6.30 +    char *buf = NULL;
    6.31 +    PEP_STATUS error = PEP_OUT_OF_MEMORY;
    6.32 +
    6.33 +    assert(plaintext);
    6.34 +    assert(resulttext);
    6.35 +
    6.36 +    *resulttext = NULL;
    6.37 +
    6.38 +    msg_mime = mailmime_new_message_data(NULL);
    6.39 +    assert(msg_mime);
    6.40 +    if (msg_mime == NULL)
    6.41 +        goto enomem;
    6.42 +
    6.43 +    fields = mailimf_fields_new_empty();
    6.44 +    assert(fields);
    6.45 +    if (fields == NULL)
    6.46 +        goto enomem;
    6.47 +
    6.48 +    mailmime_set_imf_fields(msg_mime, fields);
    6.49 +
    6.50 +    mime = part_multiple_new("multipart/mixed", NULL);
    6.51 +    assert(mime);
    6.52 +    if (mime == NULL)
    6.53 +        goto enomem;
    6.54 +
    6.55 +    submime = get_text_part("text/plain", plaintext, strlen(plaintext),
    6.56 +            MAILMIME_MECHANISM_QUOTED_PRINTABLE);
    6.57 +    assert(submime);
    6.58 +    if (submime == NULL) {
    6.59 +        mailmime_free(msg_mime);
    6.60 +        goto enomem;
    6.61 +    }
    6.62 +
    6.63 +    r = mailmime_smart_add_part(mime, submime);
    6.64 +    assert(r == MAILIMF_NO_ERROR);
    6.65 +    if (r == MAILIMF_ERROR_MEMORY) {
    6.66 +        mailmime_free(msg_mime);
    6.67 +        goto enomem;
    6.68 +    }
    6.69 +    else {
    6.70 +        // mailmime_smart_add_part() takes ownership of submime
    6.71 +        submime = NULL;
    6.72 +    }
    6.73 +
    6.74 +    r = mailmime_add_part(msg_mime, mime);
    6.75 +    assert(r == MAILIMF_NO_ERROR);
    6.76 +    if (r == MAILIMF_ERROR_MEMORY) {
    6.77 +        goto enomem;
    6.78 +    }
    6.79 +    // mailmime_add_part() takes ownership of mime
    6.80 +
    6.81 +    char *template = strdup("/tmp/temp.XXXXXXXXXXXXXXXXXXXX");
    6.82 +    assert(template);
    6.83 +    if (template == NULL)
    6.84 +        goto enomem;
    6.85 +
    6.86 +    do {
    6.87 +        fd = mkstemp(template);
    6.88 +    } while (fd == -1 && errno == EINTR);
    6.89 +
    6.90 +    assert(fd != -1);
    6.91 +    if (fd == -1)
    6.92 +        goto err_file;
    6.93 +
    6.94 +    r = unlink(template);
    6.95 +    assert(r == 0);
    6.96 +    if (r == -1)
    6.97 +        goto err_file;
    6.98 +
    6.99 +    free(template);
   6.100 +    template = NULL;
   6.101 +
   6.102 +    do {
   6.103 +        file = fdopen(fd, "w+");
   6.104 +    } while (file == NULL && errno == EINTR);
   6.105 +
   6.106 +    assert(file);
   6.107 +    if (file == NULL) {
   6.108 +        switch (errno) {
   6.109 +            case ENOMEM:
   6.110 +                goto enomem;
   6.111 +            default:
   6.112 +                goto err_file;
   6.113 +        }
   6.114 +    }
   6.115 +
   6.116 +    fd = -1;
   6.117 +
   6.118 +    col = 0;
   6.119 +    r = mailmime_write_file(file, &col, mime);
   6.120 +    assert(r == MAILIMF_NO_ERROR);
   6.121 +    if (r == MAILIMF_ERROR_MEMORY)
   6.122 +        goto enomem;
   6.123 +    else if (r != MAILIMF_NO_ERROR)
   6.124 +        goto err_file;
   6.125 +
   6.126 +    off_t len = ftello(file);
   6.127 +    assert(len != -1);
   6.128 +    if (len == -1 && errno == EOVERFLOW)
   6.129 +        goto err_file;
   6.130 +
   6.131 +    if (len + 1 > SIZE_T_MAX)
   6.132 +        goto err_buffer;
   6.133 +
   6.134 +    size = (size_t) len;
   6.135 +
   6.136 +    rewind(file);
   6.137 +
   6.138 +    buf = calloc(1, size + 1);
   6.139 +    assert(buf);
   6.140 +    if (buf == NULL)
   6.141 +        goto enomem;
   6.142 +    
   6.143 +    char *_buf = buf;
   6.144 +    size_t rest = size;
   6.145 +    for (size_t bytes_read = 0; rest > 0; rest -= bytes_read, _buf += rest) {
   6.146 +        assert(feof(file) == 0);
   6.147 +        if (feof(file))
   6.148 +            goto err_file;
   6.149 +        bytes_read = fread(_buf, rest, 1, file);
   6.150 +        if (ferror(file))
   6.151 +            goto err_file;
   6.152 +    }
   6.153 +
   6.154 +    fclose(file);
   6.155 +    mailmime_free(msg_mime);
   6.156 +    *resulttext = buf;
   6.157 +    return PEP_STATUS_OK;
   6.158 +
   6.159 +err_buffer:
   6.160 +    error = PEP_BUFFER_TOO_SMALL;
   6.161 +    goto enomem;
   6.162 +
   6.163 +err_file:
   6.164 +    error = PEP_CANNOT_CREATE_TEMP_FILE;
   6.165 +
   6.166 +enomem:
   6.167 +    free(buf);
   6.168 +    free(template);
   6.169 +
   6.170 +    if (file)
   6.171 +        fclose(file);
   6.172 +    else if (fd != -1)
   6.173 +        close(fd);
   6.174 +
   6.175 +    if (msg_mime)
   6.176 +        mailmime_free(msg_mime);
   6.177 +    if (fields)
   6.178 +        mailimf_fields_free(fields);
   6.179 +    if (submime)
   6.180 +        mailmime_free(submime);
   6.181 +
   6.182 +    return error;
   6.183 +}
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/src/mime.h	Sun Feb 08 11:33:04 2015 -0500
     7.3 @@ -0,0 +1,40 @@
     7.4 +#pragma once
     7.5 +
     7.6 +#include "pEpEngine.h"
     7.7 +
     7.8 +#ifdef __cplusplus
     7.9 +extern "C" {
    7.10 +#endif
    7.11 +
    7.12 +
    7.13 +// mime_encode_text() - encode a MIME message
    7.14 +//
    7.15 +//  parameters:
    7.16 +//      plaintext (in)          plaintext of message as UTF-8 string
    7.17 +//      htmltext (in)           optional HTML version of message as UTF-8
    7.18 +//                              string or NULL if it does not apply
    7.19 +//      resulttext (out)        the resulting encoded text
    7.20 +//
    7.21 +//  return value:
    7.22 +//      PEP_STATUS_OK           if everything worked
    7.23 +//      PEP_BUFFER_TOO_SMALL    if encoded message size is too big to handle
    7.24 +//      PEP_CANNOT_CREATE_TEMP_FILE
    7.25 +//                              if there are issues with temp files; in
    7.26 +//                              this case errno will contain the underlying
    7.27 +//                              error
    7.28 +//      PEP_OUT_OF_MEMORY       if not enough memory could be allocated
    7.29 +//
    7.30 +//  caveat:
    7.31 +//      the resulttext will go to the ownership of the caller; plaintext
    7.32 +//      and htmltext will remain in the ownership of the caller
    7.33 +
    7.34 +DYNAMIC_API PEP_STATUS mime_encode_text(
    7.35 +        const char *plaintext,
    7.36 +        const char *htmltext,
    7.37 +        char **resulttext
    7.38 +    );
    7.39 +
    7.40 +#ifdef __cplusplus
    7.41 +}
    7.42 +#endif
    7.43 +
     8.1 --- a/src/pEp_internal.h	Mon Jan 26 13:11:40 2015 +0100
     8.2 +++ b/src/pEp_internal.h	Sun Feb 08 11:33:04 2015 -0500
     8.3 @@ -84,3 +84,7 @@
     8.4      sqlite3_stmt *set_trust;
     8.5      sqlite3_stmt *get_trust;
     8.6  } pEpSession;
     8.7 +
     8.8 +PEP_STATUS init_transport_system(PEP_SESSION session);
     8.9 +void release_transport_system(PEP_SESSION session);
    8.10 +
     9.1 --- a/src/transport.c	Mon Jan 26 13:11:40 2015 +0100
     9.2 +++ b/src/transport.c	Sun Feb 08 11:33:04 2015 -0500
     9.3 @@ -27,7 +27,7 @@
     9.4      // nothing yet
     9.5  }
     9.6  
     9.7 -identity_list *new_identity_list(pEp_identity *ident)
     9.8 +DYNAMIC_API identity_list *new_identity_list(pEp_identity *ident)
     9.9  {
    9.10      identity_list *id_list = calloc(1, sizeof(identity_list));
    9.11      assert(id_list);
    9.12 @@ -41,7 +41,7 @@
    9.13      return id_list;
    9.14  }
    9.15  
    9.16 -identity_list *identity_list_dup(const identity_list *src)
    9.17 +DYNAMIC_API identity_list *identity_list_dup(const identity_list *src)
    9.18  {
    9.19      assert(src);
    9.20  
    9.21 @@ -61,7 +61,7 @@
    9.22      return id_list;
    9.23  }
    9.24  
    9.25 -void free_identity_list(identity_list *id_list)
    9.26 +DYNAMIC_API void free_identity_list(identity_list *id_list)
    9.27  {
    9.28      if (id_list) {
    9.29          free_identity_list(id_list->next);
    9.30 @@ -70,7 +70,7 @@
    9.31      }
    9.32  }
    9.33  
    9.34 -identity_list *identity_list_add(identity_list *id_list, pEp_identity *ident)
    9.35 +DYNAMIC_API identity_list *identity_list_add(identity_list *id_list, pEp_identity *ident)
    9.36  {
    9.37      assert(ident);
    9.38  
    9.39 @@ -90,7 +90,7 @@
    9.40      }
    9.41  }
    9.42  
    9.43 -bloblist_t *new_bloblist(char *blob, size_t size, const char *mime_type,
    9.44 +DYNAMIC_API bloblist_t *new_bloblist(char *blob, size_t size, const char *mime_type,
    9.45          const char *file_name)
    9.46  {
    9.47      bloblist_t * bloblist = calloc(1, sizeof(bloblist_t));
    9.48 @@ -116,7 +116,7 @@
    9.49      return bloblist;
    9.50  }
    9.51  
    9.52 -void free_bloblist(bloblist_t *bloblist)
    9.53 +DYNAMIC_API void free_bloblist(bloblist_t *bloblist)
    9.54  {
    9.55      if (bloblist) {
    9.56          if (bloblist->next)
    9.57 @@ -128,7 +128,7 @@
    9.58      }
    9.59  }
    9.60  
    9.61 -bloblist_t *bloblist_add(bloblist_t *bloblist, char *blob, size_t size,
    9.62 +DYNAMIC_API bloblist_t *bloblist_add(bloblist_t *bloblist, char *blob, size_t size,
    9.63          const char *mime_type, const char *file_name)
    9.64  {
    9.65      assert(blob);
    9.66 @@ -165,7 +165,7 @@
    9.67      return bloblist_add(bloblist->next, blob, size, mime_type, file_name);
    9.68  }
    9.69  
    9.70 -message *new_message(
    9.71 +DYNAMIC_API message *new_message(
    9.72          PEP_msg_direction dir,
    9.73          pEp_identity *from,
    9.74          identity_list *to,
    9.75 @@ -193,7 +193,7 @@
    9.76      return msg;
    9.77  }
    9.78  
    9.79 -void free_message(message *msg)
    9.80 +DYNAMIC_API void free_message(message *msg)
    9.81  {
    9.82      free(msg->id);
    9.83      free(msg->shortmsg);
    9.84 @@ -210,7 +210,7 @@
    9.85      free(msg);
    9.86  }
    9.87  
    9.88 -message_ref_list *new_message_ref_list(message *msg)
    9.89 +DYNAMIC_API message_ref_list *new_message_ref_list(message *msg)
    9.90  {
    9.91      message_ref_list *msg_list = calloc(1, sizeof(message_ref_list));
    9.92      assert(msg_list);
    9.93 @@ -222,7 +222,7 @@
    9.94      return msg_list;
    9.95  }
    9.96  
    9.97 -void free_message_ref_list(message_ref_list *msg_list)
    9.98 +DYNAMIC_API void free_message_ref_list(message_ref_list *msg_list)
    9.99  {
   9.100      if (msg_list) {
   9.101          free_message_ref_list(msg_list->next);
   9.102 @@ -230,7 +230,7 @@
   9.103      }
   9.104  }
   9.105  
   9.106 -message_ref_list *message_ref_list_add(message_ref_list *msg_list, message *msg)
   9.107 +DYNAMIC_API message_ref_list *message_ref_list_add(message_ref_list *msg_list, message *msg)
   9.108  {
   9.109      assert(msg);
   9.110  
    10.1 --- a/src/transport.h	Mon Jan 26 13:11:40 2015 +0100
    10.2 +++ b/src/transport.h	Sun Feb 08 11:33:04 2015 -0500
    10.3 @@ -1,9 +1,13 @@
    10.4  #pragma once
    10.5  
    10.6 +#include <time.h>
    10.7  #include "pEpEngine.h"
    10.8 -#include <time.h>
    10.9  
   10.10 -// all functions are using POSIX struct tm
   10.11 +#ifdef __cplusplus
   10.12 +extern "C" {
   10.13 +#endif
   10.14 +
   10.15 +// for time values all functions are using POSIX struct tm
   10.16  
   10.17  typedef struct tm timestamp;
   10.18  
   10.19 @@ -27,7 +31,7 @@
   10.20  // new_identity_list() - allocate a new identity list
   10.21  //
   10.22  //  parameters:
   10.23 -//      ident               identity to move for first element
   10.24 +//      ident (in)          identity to move for first element
   10.25  //
   10.26  //  return value:
   10.27  //      new identity_list or NULL if out of memory
   10.28 @@ -41,7 +45,7 @@
   10.29  // identity_list_dup() - duplicate identity_list (deep copy)
   10.30  //
   10.31  //  parameters:
   10.32 -//      id_list             identity_list to copy
   10.33 +//      id_list (in)        identity_list to copy
   10.34  //
   10.35  //  return value:
   10.36  //      new identity_list or NULL if out of memory
   10.37 @@ -52,7 +56,7 @@
   10.38  // free_identity_list() - free memory allocated by identity_list
   10.39  //
   10.40  //  parameters:
   10.41 -//      id_list             identity_list to free
   10.42 +//      id_list (in)        identity_list to free
   10.43  //
   10.44  //  caveat:
   10.45  //      this function frees all identities in the list additional to the
   10.46 @@ -64,8 +68,8 @@
   10.47  // identity_list_add - add identity to an identity_list
   10.48  //
   10.49  //  parameters:
   10.50 -//      id_list             identity_list to add to
   10.51 -//      ident               identity being added
   10.52 +//      id_list (in)        identity_list to add to
   10.53 +//      ident (in)          identity being added
   10.54  //
   10.55  //  return value:
   10.56  //      pointer to the last element in identity_list or NULL if out of memory
   10.57 @@ -99,10 +103,10 @@
   10.58  // new_bloblist() - allocate a new bloblist
   10.59  //
   10.60  //  parameters:
   10.61 -//      blob            blob to add to the list
   10.62 -//      size            size of the blob
   10.63 -//      mime_type       MIME type of the blob data or NULL if unknown
   10.64 -//      file_name       file name of origin of blob data or NULL if unknown
   10.65 +//      blob (in)       blob to add to the list
   10.66 +//      size (in)       size of the blob
   10.67 +//      mime_type (in)  MIME type of the blob data or NULL if unknown
   10.68 +//      file_name (in)  file name of origin of blob data or NULL if unknown
   10.69  //
   10.70  //  return value:
   10.71  //      pointer to new bloblist_t or NULL if out of memory
   10.72 @@ -118,7 +122,7 @@
   10.73  // free_bloblist() - free bloblist
   10.74  //
   10.75  //  parameters:
   10.76 -//      bloblist        bloblist to free
   10.77 +//      bloblist (in)   bloblist to free
   10.78  
   10.79  DYNAMIC_API void free_bloblist(bloblist_t *bloblist);
   10.80  
   10.81 @@ -126,11 +130,11 @@
   10.82  // bloblist_add() - add reference to a blob to bloblist
   10.83  //
   10.84  //  parameters:
   10.85 -//      bloblist        bloblist to add to
   10.86 -//      blob            blob
   10.87 -//      size            size of the blob
   10.88 -//      mime_type       MIME type of the blob or NULL if unknown
   10.89 -//      file_name       file name of the blob or NULL if unknown
   10.90 +//      bloblist (in)   bloblist to add to
   10.91 +//      blob (in)       blob
   10.92 +//      size (in)       size of the blob
   10.93 +//      mime_type (in)  MIME type of the blob or NULL if unknown
   10.94 +//      file_name (in)  file name of the blob or NULL if unknown
   10.95  //
   10.96  //  return value:
   10.97  //      pointer to the last element of bloblist or NULL if out of memory
   10.98 @@ -176,6 +180,7 @@
   10.99                                              // is received
  10.100      identity_list *cc;                      // whom a CC is being sent
  10.101      identity_list *bcc;                     // whom a BCC is being sent
  10.102 +    pEp_identity *reply_to;                 // where a reply should go to
  10.103      char * refering_id;                     // UTF-8 string of refering message ID
  10.104      struct _message *refering_msg_ref;      // reference to refering message
  10.105      struct _message_ref_list *refered_by;   // list of references to messages being
  10.106 @@ -192,10 +197,10 @@
  10.107  // new_message() - allocate new message
  10.108  //
  10.109  //  parameters:
  10.110 -//      dir             PEP_dir_incoming or PEP_dir_outgoing
  10.111 -//      from            identity whom the message is from
  10.112 -//      to              identity list whom the message is sent to
  10.113 -//      shortmsg        UTF-8 string of short message
  10.114 +//      dir (in)        PEP_dir_incoming or PEP_dir_outgoing
  10.115 +//      from (in)       identity whom the message is from
  10.116 +//      to (in)         identity list whom the message is sent to
  10.117 +//      shortmsg (in)   UTF-8 string of short message
  10.118  //
  10.119  //  return value:
  10.120  //      pointer to new message or NULL if out of memory
  10.121 @@ -216,7 +221,7 @@
  10.122  // free_message() - free message struct
  10.123  //
  10.124  //  parameters:
  10.125 -//      msg             message struct to free
  10.126 +//      msg (in)        message struct to free
  10.127  //
  10.128  //  caveat:
  10.129  //      raw data as well as referenced other messages aren't freed and remain
  10.130 @@ -228,7 +233,7 @@
  10.131  // new_message_ref_list() - allocate new message reference list
  10.132  //
  10.133  //  parameters:
  10.134 -//      msg             message to add a reference to or NULL
  10.135 +//      msg (in)        message to add a reference to or NULL
  10.136  //
  10.137  //  return value:
  10.138  //      pointer to new message_ref_list or NULL if out of memory
  10.139 @@ -239,7 +244,7 @@
  10.140  // free_message_ref_list() - free message reference list
  10.141  //
  10.142  //  parameters:
  10.143 -//      msg_list        message_ref_list to free
  10.144 +//      msg_list (in)   message_ref_list to free
  10.145  
  10.146  DYNAMIC_API void free_message_ref_list(message_ref_list *msg_list);
  10.147  
  10.148 @@ -248,8 +253,8 @@
  10.149  // list
  10.150  //
  10.151  //  parameters:
  10.152 -//      msg_list        message_ref_list to add to
  10.153 -//      msg             message to add a reference to
  10.154 +//      msg_list (in)   message_ref_list to add to
  10.155 +//      msg (in)        message to add a reference to
  10.156  //
  10.157  //  return value:
  10.158  //      pointer to the last element of message_ref_list or NULL if out of
  10.159 @@ -276,6 +281,7 @@
  10.160  
  10.161  typedef uint64_t transports_mask;
  10.162  
  10.163 -PEP_STATUS init_transport_system(PEP_SESSION session);
  10.164 -void release_transport_system(PEP_SESSION session);
  10.165 +#ifdef __cplusplus
  10.166 +}
  10.167 +#endif
  10.168  
    11.1 --- a/test/DF9B1541-sec.key	Mon Jan 26 13:11:40 2015 +0100
    11.2 +++ b/test/DF9B1541-sec.key	Sun Feb 08 11:33:04 2015 -0500
    11.3 @@ -1,106 +1,105 @@
    11.4 ------BEGIN PGP PRIVATE KEY BLOCK-----
    11.5 -Version: GnuPG v2.0.22 (MingW32)
    11.6 -
    11.7 -lQcYBFLefd0BEADB97Pmcz0yfkOWD2978HRUCUa7H4JpuDHZs+hurMlkuE7mLGh5
    11.8 -PAQ61/nL5gppl0cHFNlO7doG2gcRixWZfeQZywkJia5xNzcdjyAiC5jZ6IQpXk2T
    11.9 -wwzBIDYrU+9DhppY5hnE90yDv0MBS2SVjDergZTPDBbIYPTtPf5h51pVULCAtiyN
   11.10 -2Htv3M3tDwJJ9IrLFpJL+ClocgrmeDANKbico63qlBl9NjiUqdnt5INoE6/SnKSu
   11.11 -zaBE37C+/10bswFpjjVffyhu+hplxp6MlalZZYJEip6rmDe0P+nMbEmNvNuUmZwc
   11.12 -sPwvr1vRwhGGpZao2j4/SnDsKNNmsLrwyVEQboHYcKIgLEuHY4WtHDUt6umu7zdt
   11.13 -I6VDUoiSuNkVB+TM51HeQOoLZJ4Evcrdh6zKB2wWMW1RJQIknlMDwnRhHj+WJD06
   11.14 -texTzvAfDdsHV6NNs2WeUKesyivCyaKMPU7o95D+ZMi22CQ2qUCSLegivpnk/gKS
   11.15 -pM+JqwyAPnzJBW43qr13zA0tWMO2nzSzcYnRhTNTGeqkxn7t2Uc0ItMk360Xy7n6
   11.16 -yI2AL79daP0NGM9P0F4wD44FCnrvcDO0gbk3zJJnynnfFSF6Dk4/2sRUPsp2gm9B
   11.17 -hiHFt4w13mySETjd0sbcQYbpHZbJEPm2YY/q7rTCCCA106vg1S2IduY2GwARAQAB
   11.18 -AA//QydAc/UKx2v6dz4B0W2GwL9zav52NqbML3x/aK3Ojd3Xhw3x36M9Lagvdf2/
   11.19 -Nh5nO1bnA1IKrVuXneXCxSDWM23dQ52UtOKyZLv0GoVcVnkPJIlfH1ykkkpWJrsI
   11.20 -955m2odTfaNGrMgvaQfSm4nvjiOvQt2DF72lnmtbokaoOihU60Lm+vbriWdvLfcH
   11.21 -ylXtJXG7laylnWD6UB9lN3Ft1mE+qZu7lWOLxEBn0FpQelxyf163D0PmjGHLfdzI
   11.22 -PfpD72kKJnVOKNnTANB6fN6lwmsH5jX9yBfLlU6ZYapN7tHnTbO+3hoSPWofRmhD
   11.23 -jBPRLMVeTqg1nzVlN0TRe+Ke+xAMkrlAcC2xJyU4vi9VgGJNeXZk0m0aDpxGaHwS
   11.24 -p1lskMQoKO9cswCeBGUbWmuhC6MXPwUpN3s1r7GSwQGB8O1xQbSghTqozgIwlu/H
   11.25 -JRfC8yvQJpxK9UtFJ1t41vq/urxxlL2BC67ms9u1W+/yY/bgrKPAlP7QcYJqXFQa
   11.26 -b+1xmL2gG0avgGISzu86hN3VLFZ6xKyIfgrAP4N44ZrJ2dvgR6jCpU6qg4Mzkiuf
   11.27 -j7dnLRfRcjRT3K+a62Ma1cd0DqeFdYHyOO6u/68I50doj5X8NDJQLy6zwOtzmbKz
   11.28 -5l7DLZbX9hnhvrk0mMOflLq0+adr5KloGGYcQHtpfF8VKy0IAM0wqLeGWmkSMQeA
   11.29 -jj77lpF3JR1OObw7Od8GewMuGBOZjdc5EC2CvLwM040dT2a93QJb5qF08AHKi8g/
   11.30 -GKGnSZ3YqfSuHOxqtAycURUWsR/5qVc2aEcueimq9RvKPOH+jihhcJofgYS85xuD
   11.31 -pIZRCpHITiWaWeE2FxlATzOAldReThNm1W6uaQ/A0VFZ4It1jvHeHtiL1v9KHwH+
   11.32 -7MQCK0hQ0MxrK5RudPFLTky4FAfIXSOTUZBzzrL5kiFxEcLARj1UVZjD7BvwZOQT
   11.33 -gNVYOA7BfsqfH17NEnkaZTFUUVb1+nggzl4/Csv+1ZPkHnfzv3KpTRE1Mh7oXs1B
   11.34 -cvo/Ds0IAPH/obEvqL3sSJtxDWuPd6iKhcJ5EbbrFi4XQNjFy/sJTVmX9HWfwDF3
   11.35 -WU9qPfKuF5f9EN/VH/ge7amlnJvHMRBfnvk8ViAiitucZAc4HzFIIyLB2SWRE6RX
   11.36 -AUplhRKn/9LAz8Q+VgHDSlvk3KuwE1CYQXg2qNHjw2xeWepDHgshGBFlnmx69Lcv
   11.37 -atiqwKlvFCJND9eu022ViDJ4gYxH2S9DpBuVqhAaZLa4jWssOGn28vUEv9gD7zAA
   11.38 -02ja08cO8Zkf9+aawN+XiYYKuSaPwg4K31SFP/VTkJv0sA9YBaqLOqjnvjjZ0igO
   11.39 -4gmP3zR65gpWLn6liZig4sGRp7XrCIcIAMxGghMsK6NNb7prVTJ7GiOnsgAmIiNf
   11.40 -BqmkcESNJBRSglKPW2fQ5D6TY0IUrNDZyf8lyO/5whnEVdzzapMr/jzcdX2lCByo
   11.41 -tTtxkU6UivAS3AXwSkqH+CG4WdrkkLziCMTH/pGmOH/BiVdkvEyAlSzt1ECpHKP1
   11.42 -hWIrJfBC6xc9c1c5wySqX6422fBG6G79soLaAxpITl+VQ0VyRG+RG6V0OrafGfnR
   11.43 -glZB58jUjBVW6Cs8AvIW1D3BXL1zb2M+Bwa2pgaoopp4ZX7/aqmfFpUhlYFXud2r
   11.44 -K/z0Ua7wHi1bEHbWxMdPLCfTWGv0AJJItQfY9n+GR+awzoMyVwS0TV542bQ/Vm9s
   11.45 -a2VyIEJpcmsgKFRlc3RrZXkgLSBkb24ndCB1c2UpIDx2b2xrZXIuYmlya0BkaWdp
   11.46 -dGFsZWtoby5jb20+iQI/BBMBAgApBQJS3n3dAhsDBQkB4TOABwsJCAcDAgEGFQgC
   11.47 -CQoLBBYCAwECHgECF4AACgkQ3VW/Kd+bFUGMYA//XifXG1F9g983n/VVZiP9k04c
   11.48 -xU+H8oez5WAjl1UIUEBwmDpbA1Ts7OAcozyclwdY36ud2b2v3SPzMXsHy/ttcpzo
   11.49 -lHJMIdvBNCiIc1GOCidR9GKgNZS/ffJgyyhZ6JkoQLPapHv+zPCvschlHR7HmbyX
   11.50 -MX79QgDu6bN11JIGWiu2xq/mH2IUg5Xp5VyRlE0zWrNwu4es72t8qzHxprVrMIo7
   11.51 -2Ar8hk5Z3bRvPK4vi8EINubEfYeFbELopMGPWMgeZz8CTeeB8W7ut9FgYdQFFJkz
   11.52 -ZTAT/KhBzsu2Nvzpj7DoMhCsee5hksP200S+Wgdtvs/l4brNQqwxD20J9lGqK8th
   11.53 -FBbxQ+jf2xvAd+2/6L9FhtaDEExpc6hbbleXU0p8AYjPOcGIpGzU4v+pgafMbSk+
   11.54 -LtchFPUUCjtIlqHoqZ1xVnxdb+B5PxhhJGfIHy72zibTvfh/qEz4FRBISb7ma13q
   11.55 -WsdplNsoeqBb5qnQuQkXaM+MLqzowVQ3V9csj6VNHTvCrKYZjQzsLduLz8GgApQY
   11.56 -hsZqfotI4MVx/s6Aon8ZYpXDvY2dzoNAS3Q9ADzrI+mMHlEgzYZwsmEWcdAGc+1X
   11.57 -kV4PKCpPA0mVzDSGDaJ13qxK66NV1pqZisqVEcuhCZ8aB2N1Yk2VnDdmT1MwcAAb
   11.58 -jCbRyJe+sqb9ReEPIXudBxgEUt593QEQALwSjvQuRsVyI8p2DS8NdGTOEe+11NJr
   11.59 -1pIWy0JRYVW+zhAhXZwKhdueCTW+zcrB/ygKokCj2/Kh7GgnyJf7SGpBGnoMTGHt
   11.60 -M7WjiZr7E26FvQIVUMfE+P4h1lVDrHX4Ah3zJRasGQRlVHvJiC5875X0f3wNqPmN
   11.61 -LDYf8IG9kEaL3n6H0tG8p+VZAELZxgbdt0LMBa/TK/hp8OtaDmO4ME7+Nudg5Uth
   11.62 -7zHhmBwhij4bSre37+HM9u12RnYf1SCbManmR51OtbjmNWA4H+Tb8sa22zgxNmhz
   11.63 -CQ3bggXeMLIP9lpVNC9rk3uH0Adb7rjpbh0y0lzzUmfKO6yasoC9zznzdiHhsKAh
   11.64 -mfn4F+GlcMjUhgGtnHKbq81RVfS8cT/XIWdCLT/nogJ3xiv7G/uDNjq1A/X2Vah0
   11.65 -T8eMvvBOmnRdwQtblK3CfpMsFzqDZht9C/c6py/wPuHQZti4G2K4zFwP4nN0vTEv
   11.66 -3EkZ3+wCK7Lw8nWu+d2DzzXl3r3+l6wqQ3DdGv8JyL6tnSlR+D2kgDeLYqpbaMHr
   11.67 -+LJsZN8d5Lf/ilJqxaeiEB0tYg11yi64D9AbjwURV7BnuDbh2eNeIg0wQ63dLjQ8
   11.68 -aZF4Y/rxgWvOAo2/lveUOUMcPcuOBFN+pFchKqosALwQ75JYib5gYo0tgtUkhpJM
   11.69 -jnJFMUquLOxbABEBAAEAD/4tXma41d8Bq26h3QeCJcNBvApMorcDybrZxADlbx9F
   11.70 -YYFxF7NuvIUc/QsouW4IbvL/9Ey+viiFZ/VRDOPRce8+npTmA0h7yQ5Tz28XAWFn
   11.71 -JID7WywA/O251GzRZcFZNepA0lJMnVhtnIocUHn3CPF84Z3NTbhI9vrG1b6ddZ6z
   11.72 -vfL+4AIF0XZJF8a92a3xIxQd23y1tQHi65+QDsnw2VJiA+Y3u8KkhCwBAvRAOQER
   11.73 -yWClYAxQkrKwhvspbLVrp7R70U7OTln9EB+pJfDfswVmVV8dt5Vx7eotuxmrE7X4
   11.74 -hmw9z1cG53MM9i7DT7SPS9Rh28wuWw4ydnEdyrWr4930qVLoXnP5zvA9rVfVg9Ou
   11.75 -EvPRT2B7Ht9ygyuc+RnzLKdLgt1/riJQHMDrTlyKV4MZR31Pkwofc1AusVptfnm/
   11.76 -B3X6moxVdhHKc+r/uAVGuUFdyBfyPql5oyLCkqSnW7DCroxbAbGoT2kgzW7DIM+v
   11.77 -qSttqdD7TCY6Os7nL5dmkHDyfP53xgkcn1gMEsthnMuu1q40DGFHqEOHhOGw+14P
   11.78 -3NH0/cA3QnU3h/4vWXnich+0BmvsXJyQh04qR9g9yf8vP8k5EiPkL1sKtX8B2zAj
   11.79 -YrXEqpWKu4YXJo3SBFQN+r7l/kZKm7cnRRdGU8p7sUkoqKgnXZM+H522H535u0jZ
   11.80 -nQgAz02bJQddSQFdTsARz91JJthExBnphzZnLNTLulRN5rVotsXX7vffsZdTQABl
   11.81 -juRfe/S/TlurC4NtaEXsZpmkTb3Mzg/Q4tC9bLpfbd00F9B76rpvxbXo8roZpdNM
   11.82 -QnNy0CaBhtAH5TjeKtnNcF3hYHf9esaDTQBTrERUDJCX9ERls9VSOyb13SLENgPm
   11.83 -qXmuuooRFRt1/gbmq62JEpqREVgdTxqGqjQWwQwWXLbRYWC7KKTrG87KSGny0LRi
   11.84 -UfY5yPyzwRSe8R6hv+XpeBz4017CHzHn2mWY7ENqbyYI30NaYroK66+1e1uToXzG
   11.85 -ydOxiJ7bwBDIGuCrXqH22XcsVwgA6EB/Iv56xO/yKHjz5J254ZxXtk228LY+se4t
   11.86 -BUWb20hcAbuNH6H2a8cyD98WEBVQmmBtbDCE754IU+poZGiVjfwBT6vvk/cuCx8a
   11.87 -NAzY0DVmk/aXI9PiHP2DPZf5kZsgIzW/ESjGZqtIsWrYgIujnI6I/euE8dvbKAHv
   11.88 -OnkKlCpP2AquKtPXhreY0s3iJY0WF5FECM3yoCCEAQOr0P6wnqTSt6BDZCpVaILD
   11.89 -4KXnDuYaQABH6/txyYmWOJFH+vNZdLnPfhdcCEqWU+Y5A4qS6ekBY5ZjPTnjGDtV
   11.90 -670I29hAXsz4szuHr3xhDYXzrmmVQ93Hs3y/35mnTZv11eo9nQf+K9W58hNpV9mx
   11.91 -TOK2LOWNuFwkEakhP6VxtyHR1swpJV+krabNxLEprMBQLwX0gj2gPKhF2q9joZGh
   11.92 -GPwHjshDQd2znU05zm7b444RU0f+hdAAy15nAJaZ5VyRt3frrpSOq4/FlNrjXycO
   11.93 -2oLsMbcAbHrWa7bYAkNFTLePgE6LCuIL8fGXT6w/dJwkIHTFKFpKL1zcr/SC/tS8
   11.94 -Yt0Sph2GxFu4/5hOmtuUXf16vX9TrgVP1s9crOKA9V77piXJvzx84/nNl9ykO6Uw
   11.95 -p+rm26TZku19/5SQL+EqhmykqZ9an0+1hZH2F3gp3NZ7dEiaQ7lNVWT85/Ki0g/4
   11.96 -yio8jnNtH5sBiQIlBBgBAgAPBQJS3n3dAhsMBQkB4TOAAAoJEN1VvynfmxVB86MP
   11.97 -/irZ3rtclMnbCDBqloMdD1GW9Imtl4BSKKhunEKNWeCUD536/NCgerbxOKoaEfZ7
   11.98 -QkVKTd0UGXh6Y87o1gWCXPSCF6NYjbf3mKkEPm/UGK8W3lcTse91cq5oMaygQAHb
   11.99 -ky/p4FbqRPzSpq6gMY+jXPnf2BFZkKf9m3S4Z8HRD51pGeSisvcqLNUr6qufs9mQ
  11.100 -t1xtZjWnio4NiYkW71oIgeYxRMR82nvOyXTAiHGrpT4kWMxyFoqj68Gl1/ATNzai
  11.101 -kai2pb9rzwHRiLk+m/ldrsKJ2lGGG3QRgFMgdcGeTA0O09cLCO90KAzz6VCZXxDB
  11.102 -LANPhNhBtJLJ9TD3VkcW7L2oj5nlhNhoezj/dv2Gcv9IGyjZ5Gx7mMIRZIqvdvBu
  11.103 -XkbQg7fTaKKpZXsLXVeNPlv34raBLe+dTsAJac7Q5GvQ1YxnuAWVZfvLXr0QeuZO
  11.104 -9/45gqnpA6mNM6YNoMHIAMbMyDIp5ebGtsEPDAu57QgcvqHXjDKX3GiR9VgnYKJG
  11.105 -jNE+ehJFr5Xa7Q0ZmcuKgWv/7slOMvaubYVDeoKP2cH9kd7Tlqh1pkjrVZnNDRDK
  11.106 -h0RfvsvEISo7QuWvio+Hs3aDGdcCIde38FgtpqbsZFiG9Wjf0K2fR8asntc6uIBm
  11.107 -H0O110myJNSAZ1UqOSdI52vQf8O6y0D3CDhhXQJNvxRi
  11.108 -=NZw5
  11.109 ------END PGP PRIVATE KEY BLOCK-----
  11.110 +-----BEGIN PGP PRIVATE KEY BLOCK-----
  11.111 +
  11.112 +lQcYBFLefd0BEADB97Pmcz0yfkOWD2978HRUCUa7H4JpuDHZs+hurMlkuE7mLGh5
  11.113 +PAQ61/nL5gppl0cHFNlO7doG2gcRixWZfeQZywkJia5xNzcdjyAiC5jZ6IQpXk2T
  11.114 +wwzBIDYrU+9DhppY5hnE90yDv0MBS2SVjDergZTPDBbIYPTtPf5h51pVULCAtiyN
  11.115 +2Htv3M3tDwJJ9IrLFpJL+ClocgrmeDANKbico63qlBl9NjiUqdnt5INoE6/SnKSu
  11.116 +zaBE37C+/10bswFpjjVffyhu+hplxp6MlalZZYJEip6rmDe0P+nMbEmNvNuUmZwc
  11.117 +sPwvr1vRwhGGpZao2j4/SnDsKNNmsLrwyVEQboHYcKIgLEuHY4WtHDUt6umu7zdt
  11.118 +I6VDUoiSuNkVB+TM51HeQOoLZJ4Evcrdh6zKB2wWMW1RJQIknlMDwnRhHj+WJD06
  11.119 +texTzvAfDdsHV6NNs2WeUKesyivCyaKMPU7o95D+ZMi22CQ2qUCSLegivpnk/gKS
  11.120 +pM+JqwyAPnzJBW43qr13zA0tWMO2nzSzcYnRhTNTGeqkxn7t2Uc0ItMk360Xy7n6
  11.121 +yI2AL79daP0NGM9P0F4wD44FCnrvcDO0gbk3zJJnynnfFSF6Dk4/2sRUPsp2gm9B
  11.122 +hiHFt4w13mySETjd0sbcQYbpHZbJEPm2YY/q7rTCCCA106vg1S2IduY2GwARAQAB
  11.123 +AA//QydAc/UKx2v6dz4B0W2GwL9zav52NqbML3x/aK3Ojd3Xhw3x36M9Lagvdf2/
  11.124 +Nh5nO1bnA1IKrVuXneXCxSDWM23dQ52UtOKyZLv0GoVcVnkPJIlfH1ykkkpWJrsI
  11.125 +955m2odTfaNGrMgvaQfSm4nvjiOvQt2DF72lnmtbokaoOihU60Lm+vbriWdvLfcH
  11.126 +ylXtJXG7laylnWD6UB9lN3Ft1mE+qZu7lWOLxEBn0FpQelxyf163D0PmjGHLfdzI
  11.127 +PfpD72kKJnVOKNnTANB6fN6lwmsH5jX9yBfLlU6ZYapN7tHnTbO+3hoSPWofRmhD
  11.128 +jBPRLMVeTqg1nzVlN0TRe+Ke+xAMkrlAcC2xJyU4vi9VgGJNeXZk0m0aDpxGaHwS
  11.129 +p1lskMQoKO9cswCeBGUbWmuhC6MXPwUpN3s1r7GSwQGB8O1xQbSghTqozgIwlu/H
  11.130 +JRfC8yvQJpxK9UtFJ1t41vq/urxxlL2BC67ms9u1W+/yY/bgrKPAlP7QcYJqXFQa
  11.131 +b+1xmL2gG0avgGISzu86hN3VLFZ6xKyIfgrAP4N44ZrJ2dvgR6jCpU6qg4Mzkiuf
  11.132 +j7dnLRfRcjRT3K+a62Ma1cd0DqeFdYHyOO6u/68I50doj5X8NDJQLy6zwOtzmbKz
  11.133 +5l7DLZbX9hnhvrk0mMOflLq0+adr5KloGGYcQHtpfF8VKy0IAM0wqLeGWmkSMQeA
  11.134 +jj77lpF3JR1OObw7Od8GewMuGBOZjdc5EC2CvLwM040dT2a93QJb5qF08AHKi8g/
  11.135 +GKGnSZ3YqfSuHOxqtAycURUWsR/5qVc2aEcueimq9RvKPOH+jihhcJofgYS85xuD
  11.136 +pIZRCpHITiWaWeE2FxlATzOAldReThNm1W6uaQ/A0VFZ4It1jvHeHtiL1v9KHwH+
  11.137 +7MQCK0hQ0MxrK5RudPFLTky4FAfIXSOTUZBzzrL5kiFxEcLARj1UVZjD7BvwZOQT
  11.138 +gNVYOA7BfsqfH17NEnkaZTFUUVb1+nggzl4/Csv+1ZPkHnfzv3KpTRE1Mh7oXs1B
  11.139 +cvo/Ds0IAPH/obEvqL3sSJtxDWuPd6iKhcJ5EbbrFi4XQNjFy/sJTVmX9HWfwDF3
  11.140 +WU9qPfKuF5f9EN/VH/ge7amlnJvHMRBfnvk8ViAiitucZAc4HzFIIyLB2SWRE6RX
  11.141 +AUplhRKn/9LAz8Q+VgHDSlvk3KuwE1CYQXg2qNHjw2xeWepDHgshGBFlnmx69Lcv
  11.142 +atiqwKlvFCJND9eu022ViDJ4gYxH2S9DpBuVqhAaZLa4jWssOGn28vUEv9gD7zAA
  11.143 +02ja08cO8Zkf9+aawN+XiYYKuSaPwg4K31SFP/VTkJv0sA9YBaqLOqjnvjjZ0igO
  11.144 +4gmP3zR65gpWLn6liZig4sGRp7XrCIcIAMxGghMsK6NNb7prVTJ7GiOnsgAmIiNf
  11.145 +BqmkcESNJBRSglKPW2fQ5D6TY0IUrNDZyf8lyO/5whnEVdzzapMr/jzcdX2lCByo
  11.146 +tTtxkU6UivAS3AXwSkqH+CG4WdrkkLziCMTH/pGmOH/BiVdkvEyAlSzt1ECpHKP1
  11.147 +hWIrJfBC6xc9c1c5wySqX6422fBG6G79soLaAxpITl+VQ0VyRG+RG6V0OrafGfnR
  11.148 +glZB58jUjBVW6Cs8AvIW1D3BXL1zb2M+Bwa2pgaoopp4ZX7/aqmfFpUhlYFXud2r
  11.149 +K/z0Ua7wHi1bEHbWxMdPLCfTWGv0AJJItQfY9n+GR+awzoMyVwS0TV542bQ/Vm9s
  11.150 +a2VyIEJpcmsgKFRlc3RrZXkgLSBkb24ndCB1c2UpIDx2b2xrZXIuYmlya0BkaWdp
  11.151 +dGFsZWtoby5jb20+iQI5BBMBCgAjAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgEC
  11.152 +F4AFAlTGNOwACgkQ3VW/Kd+bFUH65A//T0I+c5QpIFj3EWq3qLsQt/kg/6Ae8Ct0
  11.153 +A10kzXPxUm8a+JKG8KeAjZeW7YK9zFfB7Lt62E5POYP0K4wX8JChfDFlr2eGUW+E
  11.154 +xi0XfT/8viybhogoMlo8rSOtEZKdv8mka6lOVHmDoy8T2W/lZJPw5me4sXJzxzAK
  11.155 +NOCOsiycGhNZFjXxILsUgQrT5qY0gslxzGBY+jza4Lq1UD6wXO0KFdy3Ucsr394Y
  11.156 +i28OIyRexVX/I1GNg3jaP5lmmAag1W1maI4MuMFwephqF2q0brtapoaAS/n71cfo
  11.157 +xgTxqRwzV1LsnRRDxisxc3EtWHD09HpTaxDddvjeoamY3+1Tu/4N3naSkYuqMqKa
  11.158 +1d0dbrvqh+jOHIIO16P+oArHb3SmmDQqpluzVF1j5tquVsyFRSS7dc6LYe2CbYTx
  11.159 +UQSRaGNDyt41eXUTU8Va0WCAAht9n32vWbxHsFOP0QXGZfGZF8V4ukOOvL/PDnFi
  11.160 +9EkEbmvM9BaSkPTuiXgrta+dos7b7JhbrGdN26R5LxhsO2835KrghLIDqjkOiYom
  11.161 +GLNCGoQWUimeu4r0znevmJVq1w6T8MneWJTXhZsVHNvcUB6drVf18i7pRxx92zio
  11.162 +HxylmwrTkp1ntwbg21Pq997YKmfgEap1kwCHHTosjgDftcNcrcqlOHAMYCeeK847
  11.163 +XQoSJjpTvQydBxgEUt593QEQALwSjvQuRsVyI8p2DS8NdGTOEe+11NJr1pIWy0JR
  11.164 +YVW+zhAhXZwKhdueCTW+zcrB/ygKokCj2/Kh7GgnyJf7SGpBGnoMTGHtM7WjiZr7
  11.165 +E26FvQIVUMfE+P4h1lVDrHX4Ah3zJRasGQRlVHvJiC5875X0f3wNqPmNLDYf8IG9
  11.166 +kEaL3n6H0tG8p+VZAELZxgbdt0LMBa/TK/hp8OtaDmO4ME7+Nudg5Uth7zHhmBwh
  11.167 +ij4bSre37+HM9u12RnYf1SCbManmR51OtbjmNWA4H+Tb8sa22zgxNmhzCQ3bggXe
  11.168 +MLIP9lpVNC9rk3uH0Adb7rjpbh0y0lzzUmfKO6yasoC9zznzdiHhsKAhmfn4F+Gl
  11.169 +cMjUhgGtnHKbq81RVfS8cT/XIWdCLT/nogJ3xiv7G/uDNjq1A/X2Vah0T8eMvvBO
  11.170 +mnRdwQtblK3CfpMsFzqDZht9C/c6py/wPuHQZti4G2K4zFwP4nN0vTEv3EkZ3+wC
  11.171 +K7Lw8nWu+d2DzzXl3r3+l6wqQ3DdGv8JyL6tnSlR+D2kgDeLYqpbaMHr+LJsZN8d
  11.172 +5Lf/ilJqxaeiEB0tYg11yi64D9AbjwURV7BnuDbh2eNeIg0wQ63dLjQ8aZF4Y/rx
  11.173 +gWvOAo2/lveUOUMcPcuOBFN+pFchKqosALwQ75JYib5gYo0tgtUkhpJMjnJFMUqu
  11.174 +LOxbABEBAAEAD/4tXma41d8Bq26h3QeCJcNBvApMorcDybrZxADlbx9FYYFxF7Nu
  11.175 +vIUc/QsouW4IbvL/9Ey+viiFZ/VRDOPRce8+npTmA0h7yQ5Tz28XAWFnJID7WywA
  11.176 +/O251GzRZcFZNepA0lJMnVhtnIocUHn3CPF84Z3NTbhI9vrG1b6ddZ6zvfL+4AIF
  11.177 +0XZJF8a92a3xIxQd23y1tQHi65+QDsnw2VJiA+Y3u8KkhCwBAvRAOQERyWClYAxQ
  11.178 +krKwhvspbLVrp7R70U7OTln9EB+pJfDfswVmVV8dt5Vx7eotuxmrE7X4hmw9z1cG
  11.179 +53MM9i7DT7SPS9Rh28wuWw4ydnEdyrWr4930qVLoXnP5zvA9rVfVg9OuEvPRT2B7
  11.180 +Ht9ygyuc+RnzLKdLgt1/riJQHMDrTlyKV4MZR31Pkwofc1AusVptfnm/B3X6moxV
  11.181 +dhHKc+r/uAVGuUFdyBfyPql5oyLCkqSnW7DCroxbAbGoT2kgzW7DIM+vqSttqdD7
  11.182 +TCY6Os7nL5dmkHDyfP53xgkcn1gMEsthnMuu1q40DGFHqEOHhOGw+14P3NH0/cA3
  11.183 +QnU3h/4vWXnich+0BmvsXJyQh04qR9g9yf8vP8k5EiPkL1sKtX8B2zAjYrXEqpWK
  11.184 +u4YXJo3SBFQN+r7l/kZKm7cnRRdGU8p7sUkoqKgnXZM+H522H535u0jZnQgAz02b
  11.185 +JQddSQFdTsARz91JJthExBnphzZnLNTLulRN5rVotsXX7vffsZdTQABljuRfe/S/
  11.186 +TlurC4NtaEXsZpmkTb3Mzg/Q4tC9bLpfbd00F9B76rpvxbXo8roZpdNMQnNy0CaB
  11.187 +htAH5TjeKtnNcF3hYHf9esaDTQBTrERUDJCX9ERls9VSOyb13SLENgPmqXmuuooR
  11.188 +FRt1/gbmq62JEpqREVgdTxqGqjQWwQwWXLbRYWC7KKTrG87KSGny0LRiUfY5yPyz
  11.189 +wRSe8R6hv+XpeBz4017CHzHn2mWY7ENqbyYI30NaYroK66+1e1uToXzGydOxiJ7b
  11.190 +wBDIGuCrXqH22XcsVwgA6EB/Iv56xO/yKHjz5J254ZxXtk228LY+se4tBUWb20hc
  11.191 +AbuNH6H2a8cyD98WEBVQmmBtbDCE754IU+poZGiVjfwBT6vvk/cuCx8aNAzY0DVm
  11.192 +k/aXI9PiHP2DPZf5kZsgIzW/ESjGZqtIsWrYgIujnI6I/euE8dvbKAHvOnkKlCpP
  11.193 +2AquKtPXhreY0s3iJY0WF5FECM3yoCCEAQOr0P6wnqTSt6BDZCpVaILD4KXnDuYa
  11.194 +QABH6/txyYmWOJFH+vNZdLnPfhdcCEqWU+Y5A4qS6ekBY5ZjPTnjGDtV670I29hA
  11.195 +Xsz4szuHr3xhDYXzrmmVQ93Hs3y/35mnTZv11eo9nQf+K9W58hNpV9mxTOK2LOWN
  11.196 +uFwkEakhP6VxtyHR1swpJV+krabNxLEprMBQLwX0gj2gPKhF2q9joZGhGPwHjshD
  11.197 +Qd2znU05zm7b444RU0f+hdAAy15nAJaZ5VyRt3frrpSOq4/FlNrjXycO2oLsMbcA
  11.198 +bHrWa7bYAkNFTLePgE6LCuIL8fGXT6w/dJwkIHTFKFpKL1zcr/SC/tS8Yt0Sph2G
  11.199 +xFu4/5hOmtuUXf16vX9TrgVP1s9crOKA9V77piXJvzx84/nNl9ykO6Uwp+rm26TZ
  11.200 +ku19/5SQL+EqhmykqZ9an0+1hZH2F3gp3NZ7dEiaQ7lNVWT85/Ki0g/4yio8jnNt
  11.201 +H5sBiQIfBBgBCgAJAhsMBQJUxjT8AAoJEN1VvynfmxVBKUwQAICLBFwL1MJHQCcd
  11.202 +cUWIGcjemnNcXB6gJ7woa/qlcacNJwcIuwmqYflr1wh7YCttxbyUHQm0vHHXbJ5F
  11.203 +q0qGZsjkkRbt+GGi65AUYv9SaW8/7GcdiF8+/zLY8QbTSOS6S0prdpcXQ1tNsd4q
  11.204 +bvJN6oJAcJKMKa5BIeWmM6Tf1SDzpmr9cNSqOH66ZML4QSkd36A6qWExj1TBQC/I
  11.205 +7JBovzUJZJyJqGGn3Z0o9HsOOxBOP/x5r5iocBkgSXG/lrcGOAwPzzKJasmOxtOV
  11.206 +TXTFSory++SkgbexYYz7sd52p3PzVAf2Yueup2krBl/zSOcVfgPke5lDtZENqkBc
  11.207 +BewebdigBRUzPHGeiUV+yh+T5d7opvPcavCPabff5vwRJpc18nYmavtXXKL/Zm5a
  11.208 +XF1HGCUh2EEl9ZM03KJeX6biC+n3uqpI6vZ3eGvv7q/td5Hlr+qJ4gtLQ0vqUaY8
  11.209 +QCgi17ssHOkh3nWJTM4GoocoX4zQVo28hN5dEi0voU2ShIjEafha3fFzkxniSavw
  11.210 +zh/s4f1rpbQXO+ueWPlsLWVTIOEfsqMO3O1HpdZyHIsAvDeMWkPbEWoYsvPlItnb
  11.211 +n7MzXc4oJ1F+R1tsgGVvgu/Q45MtNxZ8CXftS95a/J61MVY103yI5gpGgNLj+X0U
  11.212 ++N3C7yIoyB94aBWuQF/F53IQVNIo
  11.213 +=Onin
  11.214 +-----END PGP PRIVATE KEY BLOCK-----
    12.1 --- a/test/DF9B1541.key	Mon Jan 26 13:11:40 2015 +0100
    12.2 +++ b/test/DF9B1541.key	Sun Feb 08 11:33:04 2015 -0500
    12.3 @@ -1,52 +1,65 @@
    12.4 ------BEGIN PGP PUBLIC KEY BLOCK-----
    12.5 -Version: GnuPG v2.0.22 (MingW32)
    12.6 -
    12.7 -mQINBFLefd0BEADB97Pmcz0yfkOWD2978HRUCUa7H4JpuDHZs+hurMlkuE7mLGh5
    12.8 -PAQ61/nL5gppl0cHFNlO7doG2gcRixWZfeQZywkJia5xNzcdjyAiC5jZ6IQpXk2T
    12.9 -wwzBIDYrU+9DhppY5hnE90yDv0MBS2SVjDergZTPDBbIYPTtPf5h51pVULCAtiyN
   12.10 -2Htv3M3tDwJJ9IrLFpJL+ClocgrmeDANKbico63qlBl9NjiUqdnt5INoE6/SnKSu
   12.11 -zaBE37C+/10bswFpjjVffyhu+hplxp6MlalZZYJEip6rmDe0P+nMbEmNvNuUmZwc
   12.12 -sPwvr1vRwhGGpZao2j4/SnDsKNNmsLrwyVEQboHYcKIgLEuHY4WtHDUt6umu7zdt
   12.13 -I6VDUoiSuNkVB+TM51HeQOoLZJ4Evcrdh6zKB2wWMW1RJQIknlMDwnRhHj+WJD06
   12.14 -texTzvAfDdsHV6NNs2WeUKesyivCyaKMPU7o95D+ZMi22CQ2qUCSLegivpnk/gKS
   12.15 -pM+JqwyAPnzJBW43qr13zA0tWMO2nzSzcYnRhTNTGeqkxn7t2Uc0ItMk360Xy7n6
   12.16 -yI2AL79daP0NGM9P0F4wD44FCnrvcDO0gbk3zJJnynnfFSF6Dk4/2sRUPsp2gm9B
   12.17 -hiHFt4w13mySETjd0sbcQYbpHZbJEPm2YY/q7rTCCCA106vg1S2IduY2GwARAQAB
   12.18 -tD9Wb2xrZXIgQmlyayAoVGVzdGtleSAtIGRvbid0IHVzZSkgPHZvbGtlci5iaXJr
   12.19 -QGRpZ2l0YWxla2hvLmNvbT6JAj8EEwECACkFAlLefd0CGwMFCQHhM4AHCwkIBwMC
   12.20 -AQYVCAIJCgsEFgIDAQIeAQIXgAAKCRDdVb8p35sVQYxgD/9eJ9cbUX2D3zef9VVm
   12.21 -I/2TThzFT4fyh7PlYCOXVQhQQHCYOlsDVOzs4ByjPJyXB1jfq53Zva/dI/MxewfL
   12.22 -+21ynOiUckwh28E0KIhzUY4KJ1H0YqA1lL998mDLKFnomShAs9qke/7M8K+xyGUd
   12.23 -HseZvJcxfv1CAO7ps3XUkgZaK7bGr+YfYhSDlenlXJGUTTNas3C7h6zva3yrMfGm
   12.24 -tWswijvYCvyGTlndtG88ri+LwQg25sR9h4VsQuikwY9YyB5nPwJN54Hxbu630WBh
   12.25 -1AUUmTNlMBP8qEHOy7Y2/OmPsOgyEKx57mGSw/bTRL5aB22+z+Xhus1CrDEPbQn2
   12.26 -Uaory2EUFvFD6N/bG8B37b/ov0WG1oMQTGlzqFtuV5dTSnwBiM85wYikbNTi/6mB
   12.27 -p8xtKT4u1yEU9RQKO0iWoeipnXFWfF1v4Hk/GGEkZ8gfLvbOJtO9+H+oTPgVEEhJ
   12.28 -vuZrXepax2mU2yh6oFvmqdC5CRdoz4wurOjBVDdX1yyPpU0dO8KsphmNDOwt24vP
   12.29 -waAClBiGxmp+i0jgxXH+zoCifxlilcO9jZ3Og0BLdD0APOsj6YweUSDNhnCyYRZx
   12.30 -0AZz7VeRXg8oKk8DSZXMNIYNonXerErro1XWmpmKypURy6EJnxoHY3ViTZWcN2ZP
   12.31 -UzBwABuMJtHIl76ypv1F4Q8he7kCDQRS3n3dARAAvBKO9C5GxXIjynYNLw10ZM4R
   12.32 -77XU0mvWkhbLQlFhVb7OECFdnAqF254JNb7NysH/KAqiQKPb8qHsaCfIl/tIakEa
   12.33 -egxMYe0ztaOJmvsTboW9AhVQx8T4/iHWVUOsdfgCHfMlFqwZBGVUe8mILnzvlfR/
   12.34 -fA2o+Y0sNh/wgb2QRovefofS0byn5VkAQtnGBt23QswFr9Mr+Gnw61oOY7gwTv42
   12.35 -52DlS2HvMeGYHCGKPhtKt7fv4cz27XZGdh/VIJsxqeZHnU61uOY1YDgf5Nvyxrbb
   12.36 -ODE2aHMJDduCBd4wsg/2WlU0L2uTe4fQB1vuuOluHTLSXPNSZ8o7rJqygL3POfN2
   12.37 -IeGwoCGZ+fgX4aVwyNSGAa2ccpurzVFV9LxxP9chZ0ItP+eiAnfGK/sb+4M2OrUD
   12.38 -9fZVqHRPx4y+8E6adF3BC1uUrcJ+kywXOoNmG30L9zqnL/A+4dBm2LgbYrjMXA/i
   12.39 -c3S9MS/cSRnf7AIrsvDyda753YPPNeXevf6XrCpDcN0a/wnIvq2dKVH4PaSAN4ti
   12.40 -qltowev4smxk3x3kt/+KUmrFp6IQHS1iDXXKLrgP0BuPBRFXsGe4NuHZ414iDTBD
   12.41 -rd0uNDxpkXhj+vGBa84Cjb+W95Q5Qxw9y44EU36kVyEqqiwAvBDvkliJvmBijS2C
   12.42 -1SSGkkyOckUxSq4s7FsAEQEAAYkCJQQYAQIADwUCUt593QIbDAUJAeEzgAAKCRDd
   12.43 -Vb8p35sVQfOjD/4q2d67XJTJ2wgwapaDHQ9RlvSJrZeAUiiobpxCjVnglA+d+vzQ
   12.44 -oHq28TiqGhH2e0JFSk3dFBl4emPO6NYFglz0ghejWI2395ipBD5v1BivFt5XE7Hv
   12.45 -dXKuaDGsoEAB25Mv6eBW6kT80qauoDGPo1z539gRWZCn/Zt0uGfB0Q+daRnkorL3
   12.46 -KizVK+qrn7PZkLdcbWY1p4qODYmJFu9aCIHmMUTEfNp7zsl0wIhxq6U+JFjMchaK
   12.47 -o+vBpdfwEzc2opGotqW/a88B0Yi5Ppv5Xa7CidpRhht0EYBTIHXBnkwNDtPXCwjv
   12.48 -dCgM8+lQmV8QwSwDT4TYQbSSyfUw91ZHFuy9qI+Z5YTYaHs4/3b9hnL/SBso2eRs
   12.49 -e5jCEWSKr3bwbl5G0IO302iiqWV7C11XjT5b9+K2gS3vnU7ACWnO0ORr0NWMZ7gF
   12.50 -lWX7y169EHrmTvf+OYKp6QOpjTOmDaDByADGzMgyKeXmxrbBDwwLue0IHL6h14wy
   12.51 -l9xokfVYJ2CiRozRPnoSRa+V2u0NGZnLioFr/+7JTjL2rm2FQ3qCj9nB/ZHe05ao
   12.52 -daZI61WZzQ0QyodEX77LxCEqO0Llr4qPh7N2gxnXAiHXt/BYLaam7GRYhvVo39Ct
   12.53 -n0fGrJ7XOriAZh9DtddJsiTUgGdVKjknSOdr0H/DustA9wg4YV0CTb8UYg==
   12.54 -=c+rW
   12.55 ------END PGP PUBLIC KEY BLOCK-----
   12.56 +-----BEGIN PGP PUBLIC KEY BLOCK-----
   12.57 +
   12.58 +mQINBFLefd0BEADB97Pmcz0yfkOWD2978HRUCUa7H4JpuDHZs+hurMlkuE7mLGh5
   12.59 +PAQ61/nL5gppl0cHFNlO7doG2gcRixWZfeQZywkJia5xNzcdjyAiC5jZ6IQpXk2T
   12.60 +wwzBIDYrU+9DhppY5hnE90yDv0MBS2SVjDergZTPDBbIYPTtPf5h51pVULCAtiyN
   12.61 +2Htv3M3tDwJJ9IrLFpJL+ClocgrmeDANKbico63qlBl9NjiUqdnt5INoE6/SnKSu
   12.62 +zaBE37C+/10bswFpjjVffyhu+hplxp6MlalZZYJEip6rmDe0P+nMbEmNvNuUmZwc
   12.63 +sPwvr1vRwhGGpZao2j4/SnDsKNNmsLrwyVEQboHYcKIgLEuHY4WtHDUt6umu7zdt
   12.64 +I6VDUoiSuNkVB+TM51HeQOoLZJ4Evcrdh6zKB2wWMW1RJQIknlMDwnRhHj+WJD06
   12.65 +texTzvAfDdsHV6NNs2WeUKesyivCyaKMPU7o95D+ZMi22CQ2qUCSLegivpnk/gKS
   12.66 +pM+JqwyAPnzJBW43qr13zA0tWMO2nzSzcYnRhTNTGeqkxn7t2Uc0ItMk360Xy7n6
   12.67 +yI2AL79daP0NGM9P0F4wD44FCnrvcDO0gbk3zJJnynnfFSF6Dk4/2sRUPsp2gm9B
   12.68 +hiHFt4w13mySETjd0sbcQYbpHZbJEPm2YY/q7rTCCCA106vg1S2IduY2GwARAQAB
   12.69 +tCVPdXRsb29rdGVzdCA8b3V0bG9va3Rlc3RAZGluZ2Vucy5vcmc+iQI5BBMBCgAj
   12.70 +AhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AFAlTGNOwACgkQ3VW/Kd+bFUH6
   12.71 +5A//T0I+c5QpIFj3EWq3qLsQt/kg/6Ae8Ct0A10kzXPxUm8a+JKG8KeAjZeW7YK9
   12.72 +zFfB7Lt62E5POYP0K4wX8JChfDFlr2eGUW+Exi0XfT/8viybhogoMlo8rSOtEZKd
   12.73 +v8mka6lOVHmDoy8T2W/lZJPw5me4sXJzxzAKNOCOsiycGhNZFjXxILsUgQrT5qY0
   12.74 +gslxzGBY+jza4Lq1UD6wXO0KFdy3Ucsr394Yi28OIyRexVX/I1GNg3jaP5lmmAag
   12.75 +1W1maI4MuMFwephqF2q0brtapoaAS/n71cfoxgTxqRwzV1LsnRRDxisxc3EtWHD0
   12.76 +9HpTaxDddvjeoamY3+1Tu/4N3naSkYuqMqKa1d0dbrvqh+jOHIIO16P+oArHb3Sm
   12.77 +mDQqpluzVF1j5tquVsyFRSS7dc6LYe2CbYTxUQSRaGNDyt41eXUTU8Va0WCAAht9
   12.78 +n32vWbxHsFOP0QXGZfGZF8V4ukOOvL/PDnFi9EkEbmvM9BaSkPTuiXgrta+dos7b
   12.79 +7JhbrGdN26R5LxhsO2835KrghLIDqjkOiYomGLNCGoQWUimeu4r0znevmJVq1w6T
   12.80 +8MneWJTXhZsVHNvcUB6drVf18i7pRxx92zioHxylmwrTkp1ntwbg21Pq997YKmfg
   12.81 +Eap1kwCHHTosjgDftcNcrcqlOHAMYCeeK847XQoSJjpTvQy0P1ZvbGtlciBCaXJr
   12.82 +IChUZXN0a2V5IC0gZG9uJ3QgdXNlKSA8dm9sa2VyLmJpcmtAZGlnaXRhbGVraG8u
   12.83 +Y29tPokCOQQTAQoAIwIbAwcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheABQJUxjTs
   12.84 +AAoJEN1VvynfmxVBRI8P/0hUFq6YqbYbcCi2sJ+LN6K3T6wSL203p50qO8PS2QDz
   12.85 +5U/5TzTPnmGcRvVlXZrX18QQJZYv1HJkysvKCPOnUHj/AC2zXxQNw1dSgEqMmPg0
   12.86 +WmSW4+PsGE1ZK6A13TW+psb4rtGC2htdSfspo9eKDDd6ekLYA22xMWS2zBKiEdwe
   12.87 +VQekp2pt7sN52H0obtxDEES9ZdIYoaI6AO/l/9e5O0Oci3uwdPZLNPbwsBXctGSC
   12.88 +dDMJ/cP+GHiCVVT+HrqjwQcDmD5l+S8h1rDbfYtL2JgQaABAVScIWqJc7LG9QUQA
   12.89 +6iEBlXVK8u4LTIUX1o/fqpah/a2iM21VZ4Uov0nhJo2xrS+TSf9kv1VrWS0wIPIM
   12.90 +iMYdNs/GU4t1BrbPLG9eCj7Ql48V+//sftFWfePbPrspVg/3KH2ADZv39JrmNWjc
   12.91 +AYN0E5ucOzTiJbDlFxk5nXmnXMGtVcQwaaWhzg8SCYnHEvw9NT7gjs/Gz/49R5a/
   12.92 +AXv1GfRhv7CgTn7oz3Brh9cspdnx/McfpSJAmTbaTzjKxB3C17HeC4iX+m2AqulH
   12.93 +owGZEeJQKEFkBcNL+Oe7WWM87cZNRCIKrb+aPDEvhEENbykZKg+Ge5wYNVKpyJGF
   12.94 +0tGQbmh1rCN2sHrC3EeigEIQUXDYTxHfrkgAHEtDo8LBqOS3G3TVkXw5dplLJghN
   12.95 +iEYEEBECAAYFAlMWAIEACgkQDHsQm/pyYfec4ACg72MDXTSipGZ1/dCZ/qiPEM4r
   12.96 +HyoAn3P2pW/JkUuBG8qcN489LXKvQU3XuQINBFLefd0BEAC8Eo70LkbFciPKdg0v
   12.97 +DXRkzhHvtdTSa9aSFstCUWFVvs4QIV2cCoXbngk1vs3Kwf8oCqJAo9vyoexoJ8iX
   12.98 ++0hqQRp6DExh7TO1o4ma+xNuhb0CFVDHxPj+IdZVQ6x1+AId8yUWrBkEZVR7yYgu
   12.99 +fO+V9H98Daj5jSw2H/CBvZBGi95+h9LRvKflWQBC2cYG3bdCzAWv0yv4afDrWg5j
  12.100 +uDBO/jbnYOVLYe8x4ZgcIYo+G0q3t+/hzPbtdkZ2H9UgmzGp5kedTrW45jVgOB/k
  12.101 +2/LGtts4MTZocwkN24IF3jCyD/ZaVTQva5N7h9AHW+646W4dMtJc81JnyjusmrKA
  12.102 +vc8583Yh4bCgIZn5+BfhpXDI1IYBrZxym6vNUVX0vHE/1yFnQi0/56ICd8Yr+xv7
  12.103 +gzY6tQP19lWodE/HjL7wTpp0XcELW5Stwn6TLBc6g2YbfQv3Oqcv8D7h0GbYuBti
  12.104 +uMxcD+JzdL0xL9xJGd/sAiuy8PJ1rvndg8815d69/pesKkNw3Rr/Cci+rZ0pUfg9
  12.105 +pIA3i2KqW2jB6/iybGTfHeS3/4pSasWnohAdLWINdcouuA/QG48FEVewZ7g24dnj
  12.106 +XiINMEOt3S40PGmReGP68YFrzgKNv5b3lDlDHD3LjgRTfqRXISqqLAC8EO+SWIm+
  12.107 +YGKNLYLVJIaSTI5yRTFKrizsWwARAQABiQIfBBgBCgAJAhsMBQJUxjT8AAoJEN1V
  12.108 +vynfmxVBKUwQAICLBFwL1MJHQCcdcUWIGcjemnNcXB6gJ7woa/qlcacNJwcIuwmq
  12.109 +Yflr1wh7YCttxbyUHQm0vHHXbJ5Fq0qGZsjkkRbt+GGi65AUYv9SaW8/7GcdiF8+
  12.110 +/zLY8QbTSOS6S0prdpcXQ1tNsd4qbvJN6oJAcJKMKa5BIeWmM6Tf1SDzpmr9cNSq
  12.111 +OH66ZML4QSkd36A6qWExj1TBQC/I7JBovzUJZJyJqGGn3Z0o9HsOOxBOP/x5r5io
  12.112 +cBkgSXG/lrcGOAwPzzKJasmOxtOVTXTFSory++SkgbexYYz7sd52p3PzVAf2Yueu
  12.113 +p2krBl/zSOcVfgPke5lDtZENqkBcBewebdigBRUzPHGeiUV+yh+T5d7opvPcavCP
  12.114 +abff5vwRJpc18nYmavtXXKL/Zm5aXF1HGCUh2EEl9ZM03KJeX6biC+n3uqpI6vZ3
  12.115 +eGvv7q/td5Hlr+qJ4gtLQ0vqUaY8QCgi17ssHOkh3nWJTM4GoocoX4zQVo28hN5d
  12.116 +Ei0voU2ShIjEafha3fFzkxniSavwzh/s4f1rpbQXO+ueWPlsLWVTIOEfsqMO3O1H
  12.117 +pdZyHIsAvDeMWkPbEWoYsvPlItnbn7MzXc4oJ1F+R1tsgGVvgu/Q45MtNxZ8CXft
  12.118 +S95a/J61MVY103yI5gpGgNLj+X0U+N3C7yIoyB94aBWuQF/F53IQVNIo
  12.119 +=6vQn
  12.120 +-----END PGP PUBLIC KEY BLOCK-----
    13.1 --- a/test/Makefile	Mon Jan 26 13:11:40 2015 +0100
    13.2 +++ b/test/Makefile	Sun Feb 08 11:33:04 2015 -0500
    13.3 @@ -1,55 +1,26 @@
    13.4  include ../Makefile.conf
    13.5  
    13.6 -ifeq ($(BUILD_FOR),Windoze)
    13.7 -CXX=i686-w64-mingw32-g++
    13.8 -LD=i686-w64-mingw32-c++
    13.9 -LDFLAGS=-lstdc++
   13.10 -else ifeq ($(BUILD_FOR),MINGW32_NT-6.1)
   13.11 -CXX=g++ -std=gnu++11 -DWIN32 -pthread
   13.12 -LD=g++
   13.13 -LDFLAGS=-L../src -lpEpEngine -lstdc++
   13.14 -else
   13.15  CC=g++ -std=gnu++11 -pthread
   13.16  CXX=g++ -std=gnu++11 -pthread
   13.17 -LD=g++
   13.18 +LD=$(CXX)
   13.19  LDFLAGS=-L$(HOME)/lib -lpEpEngine -lstdc++
   13.20 -endif
   13.21  CXXFLAGS=-g -O0 -I../src
   13.22  # CXXFLAGS=-O3 -DNDEBUG
   13.23  
   13.24  TARGET=pEpEngineTest
   13.25  
   13.26 -ifeq ($(BUILD_FOR),Windoze)
   13.27 -all: $(TARGET).exe
   13.28 +UNIT_TEST_SOURCE=$(wildcard *_test.cc)
   13.29 +UNIT_TESTS=$(subst .cc,,$(UNIT_TEST_SOURCE))
   13.30  
   13.31 -$(TARGET).exe: $(TARGET).o ../src/libpEpEngine.a
   13.32 -	$(CXX) $(LDFLAGS) -o $(TARGET).exe $(TARGET).o ../src/libpEpEngine.a
   13.33 -else ifeq ($(BUILD_FOR),MINGW32_NT-6.1)
   13.34 -all: $(TARGET).exe pEpEngine.dll
   13.35 -
   13.36 -$(TARGET).exe: $(TARGET).o ../src/libpEpEngine.a
   13.37 -	$(CXX) $(LDFLAGS) -o $(TARGET).exe $(TARGET).o ../src/libpEpEngine.a
   13.38 -else
   13.39 -all: $(TARGET)
   13.40 -
   13.41 -$(TARGET): $(TARGET).o
   13.42 -	$(CXX) $(LDFLAGS) -o $(TARGET) $(TARGET).o
   13.43 -endif
   13.44 -
   13.45 -%.o: %.cc ../pEpEngine.h
   13.46 -	$(CXX) $(CXXFLAGS) -c -o $@ $<
   13.47 -
   13.48 -pEpEngine.dll: ../src/pEpEngine.dll
   13.49 -	cp $< $@
   13.50 +all: $(TARGET) $(UNIT_TESTS)
   13.51  
   13.52  .PHONY: clean
   13.53  
   13.54  clean:
   13.55 -	rm -f *.o $(TARGET) *.exe *.a *~ pEpEngine.dll message_api_test
   13.56 +	rm -f *.o $(TARGET) *.a *~ $(UNIT_TESTS)
   13.57  
   13.58 -test: all
   13.59 +test: pEpEngineTest
   13.60  	LD_LIBRARY_PATH=~/lib:../src ./pEpEngineTest
   13.61  
   13.62 -message_api_test: message_api_test.o
   13.63 -	$(LD) $(LDFLAGS) -o message_api_test message_api_test.o
   13.64 -
   13.65 +unit_tests: $(UNIT_TESTS)
   13.66 +	LD_LIBRARY_PATH=~/lib:../src ./unit_tests
    14.1 --- a/test/message_api_test.cc	Mon Jan 26 13:11:40 2015 +0100
    14.2 +++ b/test/message_api_test.cc	Sun Feb 08 11:33:04 2015 -0500
    14.3 @@ -21,27 +21,26 @@
    14.4      assert(msg);
    14.5      cout << "message created.\n";
    14.6  
    14.7 -    cout << "encrypting message…\n";
    14.8 -    message *enc_msg;
    14.9 +//     cout << "encrypting message in pieces…\n";
   14.10 +//     message *enc_msg;
   14.11 +//     cout << "calling encrypt_message()\n";
   14.12 +//     PEP_STATUS status2 = encrypt_message(session, msg, NULL, &enc_msg, PEP_enc_pieces);
   14.13 +//     assert(status2 == PEP_STATUS_OK);
   14.14 +//     assert(enc_msg);
   14.15 +//     cout << "message encrypted.\n";
   14.16 +
   14.17 +    cout << "encrypting message as MIME multipart…\n";
   14.18 +    message *enc_msg2;
   14.19      cout << "calling encrypt_message()\n";
   14.20 -    PEP_STATUS status2 = encrypt_message(session, msg, NULL, &enc_msg, PEP_enc_pieces);
   14.21 -    assert(status2 == PEP_STATUS_OK);
   14.22 -    assert(enc_msg);
   14.23 +    PEP_STATUS status3 = encrypt_message(session, msg, NULL, &enc_msg2, PEP_enc_MIME_multipart);
   14.24 +    assert(status3 == PEP_STATUS_OK);
   14.25 +    assert(enc_msg2);
   14.26      cout << "message encrypted.\n";
   14.27 -
   14.28 -//     cout << "MIME encoding message…\n";
   14.29 -//     message *mmsg;
   14.30 -//     PEP_STATUS status3 = mime_encode_parts(msg, &mmsg);
   14.31 -//     assert(mmsg);
   14.32 -//     assert(status3 == PEP_STATUS_OK);
   14.33 -//     cout << "message:\n";
   14.34 -//     cout << mmsg->longmsg;
   14.35 -//     cout << "\n";
   14.36 -
   14.37 +    
   14.38      cout << "freeing messages…\n";
   14.39      free_message(msg);
   14.40 -    free_message(enc_msg);
   14.41 -//     free_message(mmsg);
   14.42 +//    free_message(enc_msg);
   14.43 +    free_message(enc_msg2);
   14.44      cout << "done.\n";
   14.45  
   14.46      cout << "calling release()\n";