bZRTP
bZRTP is an opensource implementation of ZRTP keys exchange protocol
typedef.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014-2019 Belledonne Communications SARL.
3  *
4  * This file is part of bzrtp.
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 #ifndef TYPEDEF_H
20 #define TYPEDEF_H
21 
22 /* maximum number of simultaneous channels opened in a ZRTP session */
23 #define ZRTP_MAX_CHANNEL_NUMBER 2
24 /* aux secret may rarely be used define his maximum length in bytes */
25 #define MAX_AUX_SECRET_LENGTH 64
26 /* the context will store some of the sent or received packets */
27 #define PACKET_STORAGE_CAPACITY 4
28 
29 #define HELLO_MESSAGE_STORE_ID 0
30 #define COMMIT_MESSAGE_STORE_ID 1
31 #define DHPART_MESSAGE_STORE_ID 2
32 #define CONFIRM_MESSAGE_STORE_ID 3
33 
34 #ifdef HAVE_CONFIG_H
35 #include "config.h"
36 #endif
37 
38 #include <stdint.h>
39 
40 
41 #ifdef ZIDCACHE_ENABLED
42 #include "sqlite3.h"
43 #endif /* ZIDCACHE_ENABLED */
44 
46 
47 #include <bctoolbox/crypto.h>
48 #include <bctoolbox/port.h>
49 #include "packetParser.h"
50 #include "stateMachine.h"
51 
52 /* logging */
53 /* log domain is defined in CMakeList */
54 #include "bctoolbox/logging.h"
55 
56 #ifdef _WIN32
57 #define snprintf _snprintf
58 #endif
59 
60 /* timer related definitions */
61 #define BZRTP_TIMER_ON 1
62 #define BZRTP_TIMER_OFF 2
63 
64 /* values for retransmission timers, as recommended in rfc section 6 */
65 #define HELLO_BASE_RETRANSMISSION_STEP 50
66 #define HELLO_CAP_RETRANSMISSION_STEP 200
67 #define HELLO_MAX_RETRANSMISSION_NUMBER 20
68 
69 #define NON_HELLO_BASE_RETRANSMISSION_STEP 150
70 #define NON_HELLO_CAP_RETRANSMISSION_STEP 1200
71 #define NON_HELLO_MAX_RETRANSMISSION_NUMBER 10
72 
73 /* Client identifier can contain up to 16 characters, it identify the BZRTP library version */
74 /* Use it to pass bzrtp version number to peer, is it part of Hello message */
75 /* custom Linphone Instant Messaging Encryption depends on bzrtp version */
76 /* Note: ZRTP_VERSION and BZrtp version are for now both at 1.1 but they are unrelated */
77 /* historically since the creation of bzrtp, it used client idenfiers : */
78 #define ZRTP_CLIENT_IDENTIFIERv1_0a "LINPHONE-ZRTPCPP"
79 #define ZRTP_CLIENT_IDENTIFIERv1_0b "BZRTP"
80 /* Since version 1.1 which implement correctly the key export mechanism described in ZRTP RFC 4.5.2, bzrtp lib identifies itself as */
81 #define ZRTP_CLIENT_IDENTIFIERv1_1 "BZRTPv1.1"
82 
83 #define ZRTP_CLIENT_IDENTIFIER ZRTP_CLIENT_IDENTIFIERv1_1
84 
85 /* pgp word list for use with SAS */
86 extern const char * pgpWordsEven[];
87 extern const char * pgpWordsOdd[];
88 
93 typedef struct bzrtpTimer_struct {
97  int timerStep;
98 } bzrtpTimer_t;
99 
100 /* the rs1 and rs2 are 256 bits long - see rfc section 4.6.1 */
101 #define RETAINED_SECRET_LENGTH 32
102 
105 typedef struct cachedSecrets_struct {
114  uint8_t previouslyVerifiedSas; /* boolean, is a SAS has been previously verified with this user */
116 
121 typedef struct cachedSecretsHash_struct {
122  uint8_t rs1ID[8];
123  uint8_t rs2ID[8];
124  uint8_t pbxsecretID[8];
126 
127 
133 
134  void *clientData;
142  /* flags */
146  /* Hash chains, self is generated at channel context init */
147  uint8_t selfH[4][32];
148  uint8_t peerH[4][32];
150  /* packet storage : shall store some sent and received packets */
154  /* peer Hello hash : store the peer hello hash when given by signaling */
157  /* sequence number: self and peer */
161  /* algorithm agreed after Hello message exchange(use mapping define in cryptoUtils.h) and the function pointer to use them */
172  /* function pointer to the agreed algorithms - Note, key agreement manage directly this selection so it is not set here */
173  void (*hmacFunction)(const uint8_t *key, size_t keyLength, const uint8_t *input, size_t inputLength, uint8_t hmacLength, uint8_t *output);
174  void (*hashFunction)(const uint8_t *input, size_t inputLength, uint8_t hashLength, uint8_t *output);
175  void (*cipherEncryptionFunction)(const uint8_t *key, const uint8_t *IV, const uint8_t *input, size_t inputLength, uint8_t *output);
176  void (*cipherDecryptionFunction)(const uint8_t *key, const uint8_t *IV, const uint8_t *input, size_t inputLength, uint8_t *output);
177  void (*sasFunction)(uint32_t sas, char * output, int outputSize);
179  /* keys */
189  /* shared secret hash : unlike pbx, rs1 and rs2 secret hash, the auxsecret hash use a channel dependent data (H3) and is then stored in the channel context */
190  uint8_t initiatorAuxsecretID[8];
191  uint8_t responderAuxsecretID[8];
193  /* temporary buffer stored in the channel context */
196 };
197 
203  /* contexts */
204  bctbx_rng_context_t *RNGContext;
208  /* flags */
215  /* callbacks */
218  /* channel contexts */
221  /* List of available algorithms, initialised with algo implemented in cryptoWrapper but can be then be modified according to user settings */
223  uint8_t supportedHash[7];
225  uint8_t supportedCipher[7];
227  uint8_t supportedAuthTag[7];
229  uint8_t supportedKeyAgreement[7];
231  uint8_t supportedSas[7];
233  /* ZIDs and cache */
234 #ifdef ZIDCACHE_ENABLED
235  sqlite3 *zidCache;
236 #else
237  void *zidCache;
238 #endif /* ZIDCACHE_ENABLED */
239  bctbx_mutex_t *zidCacheMutex;
240  int zuid;
241  char *selfURI;
242  uint8_t selfZID[12];
243  char *peerURI;
244  uint8_t peerZID[12];
252  /* transient auxiliary shared secret : in addition to the auxiliary shared secret stored in ZID cache, caller can provide a shared secret to the zrtp context which will be used for this transaction only */
253  /* both auxiliary secret are used and combined as transientAuxiliarySecret appended to cachedAuxiliarySecret*/
257  /* keys */
263 };
264 
265 
266 
267 
268 #endif /* ifndef TYPEDEF_H */
uint8_t * peerHelloHash
Definition: typedef.h:155
uint8_t * mackeyi
Definition: typedef.h:183
bctbx_rng_context_t * RNGContext
Definition: typedef.h:204
struct cachedSecrets_struct cachedSecrets_t
A set of cached secrets retrieved from the cache as defined.
bzrtpTimer_t timer
Definition: typedef.h:138
uint8_t hc
Definition: typedef.h:222
bzrtpStateMachine_t stateMachine
Definition: typedef.h:137
#define PACKET_STORAGE_CAPACITY
Definition: typedef.h:27
Definition: bzrtp.h:106
bctbx_mutex_t * zidCacheMutex
Definition: typedef.h:239
uint8_t cacheMismatchFlag
Definition: typedef.h:249
const char * pgpWordsOdd[]
Definition: pgpwords.c:284
uint8_t isInitialised
Definition: typedef.h:209
All the callback functions provided by the client needed by the ZRTP engine.
Definition: bzrtp.h:150
cachedSecretsHash_t initiatorCachedSecretHash
Definition: typedef.h:247
uint8_t sc
Definition: typedef.h:230
uint8_t hashLength
Definition: typedef.h:163
Timer structure : The timer mechanism receives a tick giving a current time in ms a timer object will...
Definition: typedef.h:93
uint8_t * KDFContext
Definition: typedef.h:181
A set of cached secrets retrieved from the cache as defined.
Definition: typedef.h:105
unsigned short uint16_t
Definition: stdint.h:79
uint8_t * pbxsecret
Definition: typedef.h:112
uint8_t sasAlgo
Definition: typedef.h:169
Store all zrtpPacket informations according to type a specific structure type is mapped to the void *...
Definition: packetParser.h:75
unsigned char uint8_t
Definition: stdint.h:78
bzrtpCallbacks_t zrtpCallbacks
Definition: typedef.h:216
uint8_t * auxsecret
Definition: typedef.h:110
uint8_t * rs2
Definition: typedef.h:108
bzrtpSrtpSecrets_t srtpSecrets
Definition: typedef.h:187
uint8_t * s0
Definition: typedef.h:180
#define ZRTP_MAX_CHANNEL_NUMBER
Definition: typedef.h:23
char * selfURI
Definition: typedef.h:241
uint8_t keyAgreementAlgo
Definition: typedef.h:206
uint8_t * rs1
Definition: typedef.h:106
uint8_t peerPVS
Definition: typedef.h:250
uint8_t cc
Definition: typedef.h:224
uint8_t rs1Length
Definition: typedef.h:107
void * zidCache
Definition: typedef.h:237
uint8_t keyAgreementAlgo
Definition: typedef.h:167
uint8_t * ZRTPSess
Definition: typedef.h:258
uint8_t status
Definition: typedef.h:94
cachedSecrets_t cachedSecret
Definition: typedef.h:246
uint8_t * transientAuxSecret
Definition: typedef.h:254
struct cachedSecretsHash_struct cachedSecretsHash_t
The hash of cached secret truncated to the 64 leftmost bits aux secret ID is not part of it because c...
structure of the ZRTP engine context Store current state, timers, HMAC and encryption keys ...
Definition: typedef.h:202
unsigned int uint32_t
Definition: stdint.h:80
uint8_t * zrtpkeyi
Definition: typedef.h:185
uint8_t auxsecretLength
Definition: typedef.h:111
uint8_t ZRTPSessLength
Definition: typedef.h:259
uint8_t cipherAlgo
Definition: typedef.h:164
int timerStep
Definition: typedef.h:97
const char * pgpWordsEven[]
Definition: pgpwords.c:24
unsigned __int64 uint64_t
Definition: stdint.h:90
uint8_t pbxsecretLength
Definition: typedef.h:113
uint8_t previouslyVerifiedSas
Definition: typedef.h:114
char * peerURI
Definition: typedef.h:243
uint8_t isSecure
Definition: typedef.h:143
uint8_t kc
Definition: typedef.h:228
uint16_t KDFContextLength
Definition: typedef.h:182
uint8_t cipherKeyLength
Definition: typedef.h:165
uint8_t role
Definition: typedef.h:136
struct bzrtpTimer_struct bzrtpTimer_t
Timer structure : The timer mechanism receives a tick giving a current time in ms a timer object will...
size_t transientAuxSecretLength
Definition: typedef.h:255
uint8_t authTagAlgo
Definition: typedef.h:166
uint8_t sasLength
Definition: typedef.h:170
uint8_t isMainChannel
Definition: typedef.h:144
uint8_t hashAlgo
Definition: typedef.h:162
int zuid
Definition: typedef.h:240
The zrtp context of a channel.
Definition: typedef.h:132
uint8_t * zrtpkeyr
Definition: typedef.h:186
uint8_t rs2Length
Definition: typedef.h:109
uint8_t isSecure
Definition: typedef.h:210
uint32_t selfSSRC
Definition: typedef.h:140
uint8_t * mackeyr
Definition: typedef.h:184
uint8_t * exportedKey
Definition: typedef.h:260
int(* bzrtpStateMachine_t)(bzrtpEvent_t)
the state function pointer definition
Definition: stateMachine.h:49
bzrtpPacket_t * pingPacket
Definition: typedef.h:194
uint64_t timeReference
Definition: typedef.h:213
uint8_t peerSupportMultiChannel
Definition: typedef.h:211
uint8_t firingCount
Definition: typedef.h:96
uint8_t exportedKeyLength
Definition: typedef.h:261
uint64_t firingTime
Definition: typedef.h:95
void * keyAgreementContext
Definition: typedef.h:205
void * clientData
Definition: typedef.h:134
uint16_t selfSequenceNumber
Definition: typedef.h:158
uint16_t peerSequenceNumber
Definition: typedef.h:159
uint32_t peerBzrtpVersion
Definition: typedef.h:245
uint16_t keyAgreementLength
Definition: typedef.h:168
The hash of cached secret truncated to the 64 leftmost bits aux secret ID is not part of it because c...
Definition: typedef.h:121
uint8_t ac
Definition: typedef.h:226
cachedSecretsHash_t responderCachedSecretHash
Definition: typedef.h:248