blob: 4b6e1eb23a4b271299a6f26f66db5044deeada7d [file] [log] [blame]
/*
Copyright (C) 2006-2013 Werner Dittmann
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
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, see <http://www.gnu.org/licenses/>.
*/
/*
* Authors: Werner Dittmann <Werner.Dittmann@t-online.de>
*/
#ifndef _ZRTPPACKETCOMMIT_H_
#define _ZRTPPACKETCOMMIT_H_
/**
* @file ZrtpPacketCommit.h
* @brief The ZRTP Commit message
*
* @ingroup GNU_ZRTP
* @{
*/
#include <libzrtpcpp/ZrtpPacketBase.h>
// PRSH here only for completeness. We don't support PRSH in the other ZRTP parts.
#define COMMIT_DH_EX 29
#define COMMIT_MULTI 25
#define COMMIT_PRSH 27
/**
* Implement the Commit packet.
*
* The ZRTP message Commit. The ZRTP implementation sends or receives
* this message to commit the crypto parameters offered during a Hello
* message.
*
*
* @author Werner Dittmann <Werner.Dittmann@t-online.de>
*/
class __EXPORT ZrtpPacketCommit : public ZrtpPacketBase {
protected:
Commit_t* commitHeader; ///< Points to Commit message part
public:
typedef enum _commitType {
DhExchange = 1,
MultiStream = 2
} commitType;
/// Creates a Commit packet with default data
ZrtpPacketCommit();
/// Creates a Commit packet from received data
ZrtpPacketCommit(uint8_t* data);
/// Normal destructor
virtual ~ZrtpPacketCommit();
/// Get pointer to hash algorithm type field, a fixed length character array
uint8_t* getHashType() { return commitHeader->hash; };
/// Get pointer to cipher algorithm type field, a fixed length character array
uint8_t* getCipherType() { return commitHeader->cipher; };
/// Get pointer to SRTP authentication algorithm type field, a fixed length character array
uint8_t* getAuthLen() { return commitHeader->authlengths; };
/// Get pointer to key agreement algorithm type field, a fixed length character array
uint8_t* getPubKeysType() { return commitHeader->pubkey; };
/// Get pointer to SAS algorithm type field, a fixed length character array
uint8_t* getSasType() { return commitHeader->sas; };
/// Get pointer to ZID field, a fixed length byte array
uint8_t* getZid() { return commitHeader->zid; };
/// Get pointer to HVI field, a fixed length byte array
uint8_t* getHvi() { return commitHeader->hvi; };
/// Get pointer to NONCE field, a fixed length byte array, overlaps HVI field
uint8_t* getNonce() { return commitHeader->hvi; };
/// Get pointer to hashH2 field, a fixed length byte array
uint8_t* getH2() { return commitHeader->hashH2; };
/// Get pointer to MAC field, a fixed length byte array
uint8_t* getHMAC() { return commitHeader->hmac; };
/// Get pointer to MAC field during multi-stream mode, a fixed length byte array
uint8_t* getHMACMulti() { return commitHeader->hmac-4*ZRTP_WORD_SIZE; };
/// Check if packet length makes sense.
bool isLengthOk(commitType type) {int32_t len = getLength();
return ((type == DhExchange) ? len == COMMIT_DH_EX : len == COMMIT_MULTI);}
/// Set hash algorithm type field, fixed length character field
void setHashType(uint8_t* text) { memcpy(commitHeader->hash, text, ZRTP_WORD_SIZE); };
/// Set cipher algorithm type field, fixed length character field
void setCipherType(uint8_t* text) { memcpy(commitHeader->cipher, text, ZRTP_WORD_SIZE); };
/// Set SRTP authentication algorithm algorithm type field, fixed length character field
void setAuthLen(uint8_t* text) { memcpy(commitHeader->authlengths, text, ZRTP_WORD_SIZE); };
/// Set key agreement algorithm type field, fixed length character field
void setPubKeyType(uint8_t* text) { memcpy(commitHeader->pubkey, text, ZRTP_WORD_SIZE); };
/// Set SAS algorithm type field, fixed length character field
void setSasType(uint8_t* text) { memcpy(commitHeader->sas, text, ZRTP_WORD_SIZE); };
/// Set ZID field, a fixed length byte array
void setZid(uint8_t* text) { memcpy(commitHeader->zid, text, sizeof(commitHeader->zid)); };
/// Set HVI field, a fixed length byte array
void setHvi(uint8_t* text) { memcpy(commitHeader->hvi, text, sizeof(commitHeader->hvi)); };
/// Set conce field, a fixed length byte array, overlapping HVI field
void setNonce(uint8_t* text);
/// Set hashH2 field, a fixed length byte array
void setH2(uint8_t* hash) { memcpy(commitHeader->hashH2, hash, sizeof(commitHeader->hashH2)); };
/// Set MAC field, a fixed length byte array
void setHMAC(uint8_t* hash) { memcpy(commitHeader->hmac, hash, sizeof(commitHeader->hmac)); };
/// Set MAC field during multi-stream mode, a fixed length byte array
void setHMACMulti(uint8_t* hash) { memcpy(commitHeader->hmac-4*ZRTP_WORD_SIZE, hash, sizeof(commitHeader->hmac)); };
private:
CommitPacket_t data;
};
/**
* @}
*/
#endif // ZRTPPACKETCOMMIT