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