diff options
Diffstat (limited to 'comm/third_party/libotr/toolkit/parse.h')
-rw-r--r-- | comm/third_party/libotr/toolkit/parse.h | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/comm/third_party/libotr/toolkit/parse.h b/comm/third_party/libotr/toolkit/parse.h new file mode 100644 index 0000000000..21a335f5dd --- /dev/null +++ b/comm/third_party/libotr/toolkit/parse.h @@ -0,0 +1,163 @@ +/* + * Off-the-Record Messaging Toolkit + * Copyright (C) 2004-2012 Ian Goldberg, Rob Smits, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 char version; + unsigned int sender_instance; + unsigned int receiver_instance; + 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 version; + unsigned int sender_instance; + unsigned int receiver_instance; + 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 */ + unsigned char version; + unsigned int sender_instance; + unsigned int receiver_instance; + gcry_mpi_t y; +} * KeyMsg; + +typedef struct s_RevealSigMsg { + unsigned char *raw; /* The base64-decoded data; must be free()d */ + unsigned char version; + unsigned int sender_instance; + unsigned int receiver_instance; + 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 version; + unsigned int sender_instance; + unsigned int receiver_instance; + 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], + unsigned char version, unsigned int sender_instance, + unsigned int receiver_instance, 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 |