185
/* Parse a D-H Commit Message into a newly-allocated CommitMsg structure */
186
CommitMsg parse_commit(const char *msg)
188
CommitMsg cmsg = NULL;
190
unsigned char *raw = decode(msg, &lenp);
191
unsigned char *bufp = raw;
194
cmsg = calloc(1, sizeof(struct s_CommitMsg));
203
if (memcmp(bufp, "\x00\x02\x02", 3)) goto inv;
204
bufp += 3; lenp -= 3;
206
read_int(cmsg->enckeylen);
207
cmsg->enckey = malloc(cmsg->enckeylen);
208
if (!cmsg->enckey && cmsg->enckeylen > 0) goto inv;
209
read_raw(cmsg->enckey, cmsg->enckeylen);
211
read_int(cmsg->hashkeylen);
212
cmsg->hashkey = malloc(cmsg->hashkeylen);
213
if (!cmsg->hashkey && cmsg->hashkeylen > 0) goto inv;
214
read_raw(cmsg->hashkey, cmsg->hashkeylen);
216
if (lenp != 0) goto inv;
224
/* Deallocate a CommitMsg and all of the data it points to */
225
void free_commit(CommitMsg cmsg)
234
/* Parse a D-H Key Message into a newly-allocated KeyMsg structure */
235
KeyMsg parse_key(const char *msg)
239
unsigned char *raw = decode(msg, &lenp);
240
unsigned char *bufp = raw;
243
kmsg = calloc(1, sizeof(struct s_KeyMsg));
252
if (memcmp(bufp, "\x00\x02\x0a", 3)) goto inv;
253
bufp += 3; lenp -= 3;
257
if (lenp != 0) goto inv;
265
/* Deallocate a KeyMsg and all of the data it points to */
266
void free_key(KeyMsg kmsg)
270
gcry_mpi_release(kmsg->y);
274
/* Parse a Reveal Signature Message into a newly-allocated RevealSigMsg
276
RevealSigMsg parse_revealsig(const char *msg)
278
RevealSigMsg rmsg = NULL;
280
unsigned char *raw = decode(msg, &lenp);
281
unsigned char *bufp = raw;
284
rmsg = calloc(1, sizeof(struct s_RevealSigMsg));
293
if (memcmp(bufp, "\x00\x02\x11", 3)) goto inv;
294
bufp += 3; lenp -= 3;
296
read_int(rmsg->keylen);
297
rmsg->key = malloc(rmsg->keylen);
298
if (!rmsg->key && rmsg->keylen > 0) goto inv;
299
read_raw(rmsg->key, rmsg->keylen);
301
read_int(rmsg->encsiglen);
302
rmsg->encsig = malloc(rmsg->encsiglen);
303
if (!rmsg->encsig && rmsg->encsiglen > 0) goto inv;
304
read_raw(rmsg->encsig, rmsg->encsiglen);
306
read_raw(rmsg->mac, 20);
308
if (lenp != 0) goto inv;
312
free_revealsig(rmsg);
316
/* Deallocate a RevealSigMsg and all of the data it points to */
317
void free_revealsig(RevealSigMsg rmsg)
326
/* Parse a Signature Message into a newly-allocated SignatureMsg structure */
327
SignatureMsg parse_signature(const char *msg)
329
SignatureMsg smsg = NULL;
331
unsigned char *raw = decode(msg, &lenp);
332
unsigned char *bufp = raw;
335
smsg = calloc(1, sizeof(struct s_SignatureMsg));
344
if (memcmp(bufp, "\x00\x02\x12", 3)) goto inv;
345
bufp += 3; lenp -= 3;
347
read_int(smsg->encsiglen);
348
smsg->encsig = malloc(smsg->encsiglen);
349
if (!smsg->encsig && smsg->encsiglen > 0) goto inv;
350
read_raw(smsg->encsig, smsg->encsiglen);
352
read_raw(smsg->mac, 20);
354
if (lenp != 0) goto inv;
358
free_signature(smsg);
362
/* Deallocate a SignatureMsg and all of the data it points to */
363
void free_signature(SignatureMsg smsg)
185
371
/* Parse a Data Message into a newly-allocated DataMsg structure */
186
372
DataMsg parse_datamsg(const char *msg)
239
435
size_t base64len;
241
437
unsigned char *raw, *bufp;
438
unsigned char version = (datamsg->flags >= 0 ? 2 : 1);
243
440
/* Calculate the size of the message that will result */
244
441
gcry_mpi_print(GCRYMPI_FMT_USG, NULL, 0, &ylen, datamsg->y);
245
rawlen = 3 + 4 + 4 + 4 + ylen + 8 + 4 + datamsg->encmsglen + 20 +
246
4 + datamsg->mackeyslen;
442
rawlen = 3 + (version == 2 ? 1 : 0) + 4 + 4 + 4 + ylen + 8 + 4 +
443
datamsg->encmsglen + 20 + 4 + datamsg->mackeyslen;
248
445
/* Construct the new raw message (note that some of the pieces may
249
446
* have been altered, so we construct it from scratch). */
260
457
datamsg->raw = raw;
261
458
datamsg->rawlen = rawlen;
263
memmove(bufp, "\x00\x01\x03", 3);
461
memmove(bufp, "\x00\x01\x03", 3);
463
memmove(bufp, "\x00\x02\x03", 3);
264
465
bufp += 3; lenp -= 3;
467
bufp[0] = datamsg->flags;
468
bufp += 1; lenp -= 1;
265
470
write_int(datamsg->sender_keyid);
266
471
write_int(datamsg->rcpt_keyid);
267
472
write_mpi(datamsg->y, ylen);
296
501
/* Assemble a new Data Message from its pieces. Return a
297
502
* newly-allocated string containing the base64 representation. */
298
char *assemble_datamsg(unsigned char mackey[20], unsigned int sender_keyid,
299
unsigned int rcpt_keyid, gcry_mpi_t y, unsigned char ctr[8],
300
unsigned char *encmsg, size_t encmsglen, unsigned char *mackeys,
503
char *assemble_datamsg(unsigned char mackey[20], int flags,
504
unsigned int sender_keyid, unsigned int rcpt_keyid, gcry_mpi_t y,
505
unsigned char ctr[8], unsigned char *encmsg, size_t encmsglen,
506
unsigned char *mackeys, size_t mackeyslen)
303
508
DataMsg datam = calloc(1, sizeof(struct s_DataMsg));
304
509
char *newmsg = NULL;
305
510
if (!datam) goto inv;
511
datam->flags = flags;
306
512
datam->sender_keyid = sender_keyid;
307
513
datam->rcpt_keyid = rcpt_keyid;
308
514
datam->y = gcry_mpi_copy(y);