src/message_api.c
author vb
Mon, 29 Dec 2014 20:48:30 +0100
changeset 38 271bea5552dc
parent 37 7928e0e6eee9
child 39 66b5cc6cb987
permissions -rw-r--r--
encrypt in pieces
vb@37
     1
#include "message_api.h"
vb@37
     2
#include "keymanagement.h"
vb@37
     3
vb@37
     4
#include <libetpan/libetpan.h>
vb@37
     5
#include <assert.h>
vb@37
     6
#include <string.h>
vb@37
     7
vb@37
     8
PEP_STATUS encrypt_message(
vb@37
     9
        PEP_SESSION session,
vb@37
    10
        const message *src,
vb@37
    11
        stringlist_t * extra,
vb@38
    12
        message **dst,
vb@38
    13
        PEP_enc_format format
vb@37
    14
    )
vb@37
    15
{
vb@37
    16
    PEP_STATUS status = PEP_STATUS_OK;
vb@37
    17
vb@37
    18
    assert(session);
vb@37
    19
    assert(src);
vb@38
    20
    assert(src->shortmsg || src->longmsg);
vb@37
    21
    assert(dst);
vb@37
    22
    *dst = NULL;
vb@38
    23
    assert(format != PEP_enc_none);
vb@37
    24
vb@37
    25
    message *msg = new_message(src->dir, src->from, src->to, NULL);
vb@37
    26
    if (msg == NULL)
vb@37
    27
        return PEP_OUT_OF_MEMORY;
vb@37
    28
vb@38
    29
    msg->from->me = true;
vb@37
    30
vb@38
    31
    status = myself(session, msg->from);
vb@37
    32
    if (status != PEP_STATUS_OK) {
vb@37
    33
        free_message(msg);
vb@37
    34
        return status;
vb@37
    35
    }
vb@37
    36
vb@38
    37
    stringlist_t * keys = new_stringlist(msg->from->fpr);
vb@37
    38
    if (keys == NULL) {
vb@37
    39
        free_message(msg);
vb@37
    40
        return PEP_OUT_OF_MEMORY;
vb@37
    41
    }
vb@37
    42
vb@37
    43
    stringlist_t *_x;
vb@37
    44
    for (_x = extra; _x && _x->value; _x = _x->next) {
vb@37
    45
        if (stringlist_add(keys, _x->value) == NULL) {
vb@37
    46
            free_message(msg);
vb@37
    47
            free_stringlist(keys);
vb@37
    48
            return PEP_OUT_OF_MEMORY;
vb@37
    49
        }
vb@37
    50
    }
vb@37
    51
    
vb@37
    52
    identity_list * _il;
vb@38
    53
    for (_il = msg->to; _il && _il->ident; _il = _il->next) {
vb@37
    54
        status = update_identity(session, _il->ident);
vb@37
    55
        if (status != PEP_STATUS_OK) {
vb@37
    56
            free_message(msg);
vb@37
    57
            free_stringlist(keys);
vb@37
    58
            return status;
vb@37
    59
        }
vb@37
    60
        if (_il->ident->fpr) {
vb@37
    61
            if (stringlist_add(keys, _il->ident->fpr) == NULL) {
vb@37
    62
                free_message(msg);
vb@37
    63
                free_stringlist(keys);
vb@37
    64
                return PEP_OUT_OF_MEMORY;
vb@37
    65
            }
vb@37
    66
        }
vb@37
    67
        else
vb@37
    68
            status = PEP_KEY_NOT_FOUND;
vb@37
    69
    }
vb@37
    70
vb@37
    71
    int _own_keys = 1;
vb@37
    72
    if (extra)
vb@37
    73
        _own_keys += stringlist_length(extra);
vb@37
    74
    
vb@37
    75
    if (stringlist_length(keys) > _own_keys) {
vb@38
    76
        char *ptext;
vb@37
    77
        char *ctext = NULL;
vb@37
    78
        size_t csize = 0;
vb@37
    79
vb@38
    80
        switch (format) {
vb@38
    81
        case PEP_enc_MIME_multipart:
vb@38
    82
            break;
vb@37
    83
vb@38
    84
        case PEP_enc_pieces:
vb@38
    85
            if (src->shortmsg && src->longmsg) {
vb@38
    86
                ptext = calloc(1, strlen(src->shortmsg) + strlen(src->longmsg) + 12);
vb@38
    87
                if (ptext == NULL) {
vb@38
    88
                    free_message(msg);
vb@38
    89
                    free_stringlist(keys);
vb@38
    90
                    return PEP_OUT_OF_MEMORY;
vb@38
    91
                }
vb@38
    92
                strcpy(ptext, "subject: ");
vb@38
    93
                strcat(ptext, src->shortmsg);
vb@38
    94
                strcat(ptext, "\n\n");
vb@38
    95
                strcat(ptext, src->longmsg);
vb@38
    96
                status = encrypt_and_sign(session, keys, ptext, strlen(ptext), &ctext, &csize);
vb@38
    97
                if (ctext) {
vb@38
    98
                    msg->longmsg = ctext;
vb@38
    99
                    msg->longmsg_size = csize;
vb@38
   100
                    msg->shortmsg = strdup("pEp");
vb@38
   101
                }
vb@38
   102
                else {
vb@38
   103
                    free_message(msg);
vb@38
   104
                    msg = NULL;
vb@38
   105
                }
vb@38
   106
            }
vb@38
   107
            else if (src->shortmsg) {
vb@38
   108
                ptext = src->shortmsg;
vb@38
   109
                status = encrypt_and_sign(session, keys, ptext, strlen(ptext), &ctext, &csize);
vb@38
   110
                if (ctext) {
vb@38
   111
                    msg->shortmsg = ctext;
vb@38
   112
                    msg->shortmsg_size = csize;
vb@38
   113
                }
vb@38
   114
                else {
vb@38
   115
                    free_message(msg);
vb@38
   116
                    msg = NULL;
vb@38
   117
                }
vb@38
   118
            }
vb@38
   119
            else if (src->longmsg) {
vb@38
   120
                ptext = src->longmsg;
vb@38
   121
                status = encrypt_and_sign(session, keys, ptext, strlen(ptext), &ctext, &csize);
vb@38
   122
                if (ctext) {
vb@38
   123
                    msg->longmsg = ctext;
vb@38
   124
                    msg->longmsg_size = csize;
vb@38
   125
                    msg->shortmsg = strdup("pEp");
vb@38
   126
                }
vb@38
   127
                else {
vb@38
   128
                    free_message(msg);
vb@38
   129
                    msg = NULL;
vb@38
   130
                }
vb@38
   131
            }
vb@38
   132
            if (msg && msg->longmsg_formatted) {
vb@38
   133
                ptext = src->longmsg_formatted;
vb@38
   134
                status = encrypt_and_sign(session, keys, ptext, strlen(ptext), &ctext, &csize);
vb@38
   135
                if (ctext) {
vb@38
   136
                    msg->longmsg_formatted = ctext;
vb@38
   137
                    msg->longmsg_formatted_size = csize;
vb@38
   138
                }
vb@38
   139
                else {
vb@38
   140
                    free_message(msg);
vb@38
   141
                    msg = NULL;
vb@38
   142
                }
vb@38
   143
            }
vb@38
   144
            if (msg) {
vb@38
   145
                bloblist_t *_s;
vb@38
   146
                bloblist_t *_d = new_bloblist(NULL, 0);
vb@38
   147
                if (_d == NULL) {
vb@38
   148
                    free_message(msg);
vb@38
   149
                    free_stringlist(keys);
vb@38
   150
                    return PEP_OUT_OF_MEMORY;
vb@38
   151
                }
vb@38
   152
                msg->attachments = _d;
vb@38
   153
                for (_s = src->attachments; _s && _s->data_ref; _s = _s->next) {
vb@38
   154
                    int psize = _s->size;
vb@38
   155
                    ptext = _s->data_ref;
vb@38
   156
                    status = encrypt_and_sign(session, keys, ptext, psize, &ctext, &csize);
vb@38
   157
                    if (ctext) {
vb@38
   158
                        _d = bloblist_add(_d, ctext, csize);
vb@38
   159
                    }
vb@38
   160
                    else {
vb@38
   161
                        free_message(msg);
vb@38
   162
                        msg = NULL;
vb@38
   163
                        break;
vb@38
   164
                    }
vb@38
   165
                }
vb@38
   166
                *dst = msg;
vb@38
   167
            }
vb@38
   168
            break;
vb@38
   169
vb@38
   170
        default:
vb@38
   171
            assert(0);
vb@37
   172
        }
vb@37
   173
    }
vb@37
   174
    else
vb@37
   175
        free_message(msg);
vb@37
   176
vb@37
   177
    free_stringlist(keys);
vb@37
   178
    return status;
vb@37
   179
}
vb@37
   180
vb@37
   181
PEP_STATUS decrypt_message(
vb@37
   182
        PEP_SESSION session,
vb@37
   183
        const message *src,
vb@37
   184
        message **dst
vb@37
   185
    )
vb@37
   186
{
vb@37
   187
    PEP_STATUS status = PEP_STATUS_OK;
vb@37
   188
vb@37
   189
    return status;
vb@37
   190
}
vb@37
   191