1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
/*
* Off-the-Record Messaging Toolkit
* Copyright (C) 2004-2008 Ian Goldberg, Chris Alexander, Nikita Borisov
* <otr@cypherpunks.ca>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __PARSE_H__
#define __PARSE_H__
#include <gcrypt.h>
typedef struct s_KeyExchMsg {
unsigned char *raw; /* The base64-decoded data; must be free()d */
unsigned char reply;
gcry_mpi_t p, q, g, e;
unsigned int keyid;
gcry_mpi_t y;
gcry_mpi_t r, s;
unsigned char *sigstart; /* Pointers into the "raw" array. Don't */
unsigned char *sigend; /* free() these. */
} * KeyExchMsg;
typedef struct s_DataMsg {
unsigned char *raw; /* The base64-decoded data; must be free()d */
size_t rawlen;
int flags;
unsigned int sender_keyid;
unsigned int rcpt_keyid;
gcry_mpi_t y;
unsigned char ctr[8];
unsigned char *encmsg; /* A copy; must be free()d */
size_t encmsglen;
unsigned char mac[20];
unsigned char *mackeys; /* A copy; must be free()d */
size_t mackeyslen;
unsigned char *macstart; /* Pointers into the "raw" array. Don't */
unsigned char *macend; /* free() these. */
} * DataMsg;
typedef struct s_CommitMsg {
unsigned char *raw; /* The base64-decoded data; must be free()d */
unsigned char *enckey;
size_t enckeylen;
unsigned char *hashkey;
size_t hashkeylen;
} * CommitMsg;
typedef struct s_KeyMsg {
unsigned char *raw; /* The base64-decoded data; must be free()d */
gcry_mpi_t y;
} * KeyMsg;
typedef struct s_RevealSigMsg {
unsigned char *raw; /* The base64-decoded data; must be free()d */
unsigned char *key;
size_t keylen;
unsigned char *encsig;
size_t encsiglen;
unsigned char mac[20];
} * RevealSigMsg;
typedef struct s_SignatureMsg {
unsigned char *raw; /* The base64-decoded data; must be free()d */
unsigned char *encsig;
size_t encsiglen;
unsigned char mac[20];
} * SignatureMsg;
/* Dump an unsigned int to a FILE * */
void dump_int(FILE *stream, const char *title, unsigned int val);
/* Dump an mpi to a FILE * */
void dump_mpi(FILE *stream, const char *title, gcry_mpi_t val);
/* Dump data to a FILE * */
void dump_data(FILE *stream, const char *title, const unsigned char *data,
size_t datalen);
/* Parse a Key Exchange Message into a newly-allocated KeyExchMsg structure */
KeyExchMsg parse_keyexch(const char *msg);
/* Deallocate a KeyExchMsg and all of the data it points to */
void free_keyexch(KeyExchMsg keyexch);
/* Parse a D-H Commit Message into a newly-allocated CommitMsg structure */
CommitMsg parse_commit(const char *msg);
/* Parse a Data Message into a newly-allocated DataMsg structure */
DataMsg parse_datamsg(const char *msg);
/* Deallocate a CommitMsg and all of the data it points to */
void free_commit(CommitMsg cmsg);
/* Parse a Reveal Signature Message into a newly-allocated RevealSigMsg
* structure */
RevealSigMsg parse_revealsig(const char *msg);
/* Deallocate a RevealSigMsg and all of the data it points to */
void free_revealsig(RevealSigMsg rmsg);
/* Parse a Signature Message into a newly-allocated SignatureMsg structure */
SignatureMsg parse_signature(const char *msg);
/* Deallocate a SignatureMsg and all of the data it points to */
void free_signature(SignatureMsg smsg);
/* Parse a D-H Key Message into a newly-allocated KeyMsg structure */
KeyMsg parse_key(const char *msg);
/* Deallocate a KeyMsg and all of the data it points to */
void free_key(KeyMsg cmsg);
/* Recalculate the MAC on the message, base64-encode the resulting MAC'd
* message, and put on the appropriate header and footer. Return a
* newly-allocated pointer to the result, which the caller will have to
* free(). */
char *remac_datamsg(DataMsg datamsg, unsigned char mackey[20]);
/* Assemble a new Data Message from its pieces. Return a
* newly-allocated string containing the base64 representation. */
char *assemble_datamsg(unsigned char mackey[20], int flags,
unsigned int sender_keyid, unsigned int rcpt_keyid, gcry_mpi_t y,
unsigned char ctr[8], unsigned char *encmsg, size_t encmsglen,
unsigned char *mackeys, size_t mackeyslen);
/* Deallocate a DataMsg and all of the data it points to */
void free_datamsg(DataMsg datamsg);
/* Convert a string of hex chars to a buffer of unsigned chars. */
void argv_to_buf(unsigned char **bufp, size_t *lenp, char *arg);
#endif
|