-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkeyagent.h
217 lines (176 loc) · 6.2 KB
/
keyagent.h
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
/*
* Copyright (c) 2009-2011, Adrian Thurston <[email protected]>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _KEYAGENT_H
#define _KEYAGENT_H
#include <pthread.h>
#include <string>
#include <map>
#include <list>
#include "encrypt.h"
using std::map;
using std::pair;
using std::string;
struct Key;
struct KeyThread;
struct PrivateKey;
struct OpenKey
{
OpenKey()
: isOpen(false), priv2(0)
{
pthread_mutex_init( &mutex, 0 );
}
void mutexOpen( KeyThread *keyThread, long long userId, const String &pass );
void open( KeyThread *keyThread, long long userId, const String &pass );
pthread_mutex_t mutex;
bool isOpen;
String priv1Sig;
Keys *priv2;
};
struct LoginTokenMap
{
LoginTokenMap()
{
pthread_mutex_init( &mutex, 0 );
}
pthread_mutex_t mutex;
typedef map<String, OpenKey*> TokenMap;
typedef pair<String, OpenKey*> TokenMapPair;
TokenMap tokenMap;
OpenKey *addToken( const String &token );
};
struct KeyAgentActivity
{
KeyAgentActivity()
: activeAgents(0)
{
pthread_cond_init( &cond, 0 );
pthread_mutex_init( &mutex, 0 );
}
void bump();
void signalDone();
void waitDone();
pthread_mutex_t mutex;
pthread_cond_t cond;
int activeAgents;
};
struct KeyAgent
: public Barrier
{
KeyAgent( int fd )
: Barrier(fd) {}
void storePublicKey( Identity &identity, const String &encPacket );
void generateKey( long long userId, const String &pass );
void storePutBroadcastKey( long long id, const char *broadcastKey );
void storeGetBroadcastKey( long long id, const String &bkKeys );
void getPutBroadcastKey( long long id );
int checkPass( long long userId, const String &pass, const String &token );
void generateFriendClaimKeys( long long friendClaimId );
void storeFriendClaimSigKey( long long friendClaimId, const String &friendClaimPubKey );
Allocated getFriendClaimRbSigKey( long long friendClaimId );
String pubSet;
String bk;
String pub1;
String pub2;
Allocated signEncrypt( Identity &pubEncVer, User &privDecSign, const String &msg );
Allocated signIdEncrypt( Identity &pubEncVer, User &privDecSign, const String &iduri, const String &msg );
Allocated decryptVerify( Identity &pubEncVer, User &privDecSign, const String &msg );
Allocated decryptVerify1( User &privDecSign, const String &msg );
Allocated decryptVerify2( Identity &pubEncVer, User &privDecSign, const String &msg );
Allocated bkSignEncrypt( User &privDecSign, long long bkId, const String &msg );
Allocated bkDecryptVerify( Identity &pubEncVer, long long bkId, const String &msg );
Allocated bkSign( User &privDecSign, long long bkId, const String &msg );
Allocated bkVerify( Identity &pubEncVer, long long bkId, const String &msg );
Allocated bkEncrypt( long long bkId, const String &msg );
Allocated bkDecrypt( long long bkId, const String &msg );
/* Just sign a messaging using some get broadcast key (foreign) that
* belongs to somone else. This is for the inner signature in remote
* broadcasts. */
Allocated bkForeignSign( User &privDecSign, long long bkId, const String &msg );
Allocated bkForeignVerify( Identity &pubEncVer, long long bkId, const String &msg );
Allocated bkDetachedSign( User &privDecSign, long long bkId, const String &msg );
bool bkDetachedVerify( Identity &pubEncVer, long long bkId, const String &sig, const String &plainMsg );
Allocated bkDetachedForeignSign( User &privDecSign, long long bkId, const String &msg );
bool bkDetachedForeignVerify( Identity &pubEncVer, long long bkId, const String &sig, const String &plainMsg );
Allocated bkDetachedRepubForeignSign( User &privDecSign, long long friendClaimId,
long long bkId, const String &msg );
bool bkDetachedRepubForeignVerify( Identity &pubEncVer, long long friendClaimId,
long long bkId, const String &sig, const String &plainMsg );
void publicKey( User &user );
};
struct KeyThread
:
public ConfigCtx,
public Barrier
{
KeyThread( Config *c, LoginTokenMap *loginTokenMap,
KeyAgentActivity *keyAgentActivity, int fd )
:
ConfigCtx(c),
Barrier(fd),
loginTokenMap(loginTokenMap),
keyAgentActivity(keyAgentActivity)
{}
LoginTokenMap *loginTokenMap;
KeyAgentActivity *keyAgentActivity;
pthread_t thread;
pthread_attr_t attr;
void create();
static int _startRoutine( KeyThread *thread );
int startRoutine();
int startRoutineBare();
void dbConnect();
Keys *loadKeyPub( long long identityId );
Keys *loadKeyPriv( long long userId, int keyPriv, const String *pass );
Keys *loadKeyPriv( long long userId );
Keys *generateKey( long long userId, PrivateKey &key,
int keyPriv, bool encrypt, const String &pass );
void recvConfig();
void storePublicKey( long long identityId, int keyPriv, const String &key );
void recvStorePublicKey();
void recvGenerateKey();
void recvSignEncrypt();
void recvSignIdEncrypt();
void recvDecryptVerify();
void recvDecryptVerify1();
void recvDecryptVerify2();
void recvBkSignEncrypt();
void recvBkDecryptVerify();
void recvBkForeignSign();
void recvBkForeignVerify();
void recvGetPublicKey();
void recvStorePutBroadcastKey();
void recvStoreGetBroadcastKey();
void recvGetPutBroadcastKey();
void recvCheckPass();
void recvBkEncrypt();
void recvBkDecrypt();
void recvBkSign();
void recvBkVerify();
void recvBkDetachedSign();
void recvBkDetachedVerify();
void recvBkDetachedForeignSign();
void recvBkDetachedForeignVerify();
void recvGenerateFriendClaimKeys();
void recvStoreFriendClaimSigKey();
void recvGetFriendClaimRbSigKey();
void recvBkDetachedRepubForeignSign();
void recvBkDetachedRepubForeignVerify();
void test( long long userId );
MYSQL *mysql;
KeyThread *next, *prev;
};
#endif