-
Notifications
You must be signed in to change notification settings - Fork 2
/
notes.txt
613 lines (441 loc) · 20.9 KB
/
notes.txt
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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
========================================
explanations of various features
Probalistic Drop (PD) and Do Not Die on DNF (DNDoDNF)
http://thread.gmane.org/gmane.network.freenet.devel/8629
"Adapating Freenet to NGRouting"
Tue, 09 Dec 2003 03:18:01 +0000
Binary Estimators
http://thread.gmane.org/gmane.network.freenet.devel/8369
"Decaying Exponential Decay for binary estimators"
Wed, 03 Dec 2003 03:24:35 +0000
Fine grained failure estimation
http://thread.gmane.org/gmane.network.freenet.devel/8143
"Corrections to NGR formula (improves routing and protects from black hole attack)"
Fri, 28 Nov 2003 02:21:46 +0000
Unobtanium Routing
http://thread.gmane.org/gmane.network.freenet.devel/7791
"Improving NGR"
Mon, 17 Nov 2003 09:05:56 +0000
Unobtanium Routing Implementation
http://thread.gmane.org/gmane.network.freenet.devel/8329
"Implementation of unobtanium selective rejection"
Tue, 02 Dec 2003 20:23:27 +0000
Multiplexing (MUXing)
http://thread.gmane.org/gmane.network.freenet.devel/4408
Connection Multiplexing
Fri, 25 Jul 2003 02:42:35 +0100
Original NGRouting Estimator Formula
http://thread.gmane.org/gmane.network.freenet.devel/4320
"NGRouting formula summary"
Wed, 23 Jul 2003 18:56:16 +0100
pcaching
http://thread.gmane.org/gmane.network.freenet.devel/1750
"Probabilistic caching"
Fri, 28 Mar 2003 16:08:31 +0000
description of announcment protcol (mid-thread)
http://article.gmane.org/gmane.network.freenet.devel/5441
"Re: Routing and Spcialisation"
Tue, 16 Sep 2003 17:23:28 +0100
ngrouting paper
http://freenetproject.org/index.php?page=ngrouting
========================================
alternate implementations
ocaml: http://savannah.gnu.org/projects/ethel/
c: http://thalassocracy.org/libfreenet/
c++: http://cvs.sourceforge.net/viewcvs.py/freenet/whiterose/
=====================
alternate networks
http://www.ovmj.org/GNUnet/
http://entropy.stop1984.com/en/home.html
http://www.grapevineproject.org/
======================================
Main
FnpLinkManager - collection of peer connections, methods for creating and deleting em
TransportHandler - use catalog of different transports (tcp, appletalk)
Node
OpenConnectionManager (via core.connections)
*PeerHandler (member connectionHandlers)
*ConnectionHandler - is a Thread, NIOReader and NIOWriter
FNPLink
tcpConnection
[static]ReadSelectorLoop
[static]WriteSelectorLoop
ReadSelectorLoop
WriteSelectorLoop
*PublicNIOInterface (via Core.interfaces[])
ConnectionRunner (FreenetConnectionRunner)
Identity
ClientFactory, instance of client.FNPClient
node.rt.RoutingTable
node.rt.RoutingTable
Authentity
============
ConnectionHandler.process()
-> ConnectionHandler.innerProcess()
-> ConnectionHandler.handleReceivedMessage() // file:///m:/russ/source/freenet/dox/ConnectionHandler_8java-source.html#l01230
-> PeerHandler.registerMessageReceived()
-> ConnectionHandler.handleReceivedIdentifyMessage()
-> Ticker.add()
node.Main.startNode()
-> transport.tcpConnection.startSelectorLoops()
~> interfaces.FreenetConnectionRunner.handle()
-> SessionHandler.get() // returns the LinkManager for this protocol
-> session.FnpLinkManager.acceptIncoming() // nil
-> session.FnpLink.accept() // read a byte and decide what to do
-> session.FnpLink.negotiateInbound // finally the crypto
-> setOutputStream
-> session.FnpLinkManager.addlink()
transport.ReadSelectorLoop.beforeSelect()
-> ConnectionHandler.process()
-> ConnectionHandler.innerProcess()
-> MessageHandler.getMessageFor()
PeerHandler.innerSendMessageAsync
-> PeerHandler.sendSinglePacket
-> ConnectionHandler.forceSendPacket
-> ConnectionHandler.getPacket
-> ConnectionHandler.innerSendPacket
-> (see above)
Node.scheduleConnectionOpener()
ConnectionOpener.scheduleConnectionOpener()
?> ConnectionOpener.checkpoint()
-> OpenConnectionManager.makePeerHandler()
-> OpenConnectionManager.createConnection() // file:///m:/russ/source/freenet/dox/OpenConnectionManager_8java-source.html#l00517
-> OpenConnectionManager.ConnectionJob.run() // sent id bytes, file:///m:/russ/source/freenet/dox/FnpLink_8java-source.html#l00128
-> session.FnpLinkManager.createOutgoing() // file:///m:/russ/source/freenet/dox/FnpLinkManager_8java-source.html#l00073
-> session.FnpLink.solicit() file:///m:/russ/source/freenet/dox/FnpLink_8java-source.html#l00128
-> session.FnpLink.negotiateOutbound() file:///m:/russ/source/freenet/dox/FnpLink_8java-source.html#l00540
[ privMe, pubMe, bob = node keys]
[ R = dhParams[0] = client ephermal public ]
[ Ca = dhParams[1] = client ephermal private ]
[ Cb = dhParams[1] = server ephermal public ]
-> DLES.encrypt() // file:///m:/russ/source/freenet/dox/DLES_8java-source.html#l00070
[ u = ephermal private ]
[ gu = ephermal public ]
[ guv = secret value ]
-> session.FnpLink.setOutputStream()
-> ConnectionHandler.registerOCM() // send "Identify" message
-> ConnectionHandler.innerSendPacket
-> ConnectionHandler.sendBytes
-> transport.WriteSelectorLoop.send // put shit on queue
BufferedTransformation::PutWord16()
-> BufferedTransformation::ChannelPutWord16()
-> BufferedTransformation::ChannelPut()
-> BufferedTransformation::ChannelPut2()
-> NetworkSink::Put2()
-> NetworkSink::TimedFlush()
-> SocketSender::Send()
--------------
over the wire
c: FnpLinkManager.DESIGNATOR (1) big endian
c: AUTH_LAYER_VERSION << (8-VER_BIT_LENGTH)) + AUTHENTICATE
c: TempPubKey[c] as MPI and PKEncrypt(TempPubKey[c], PubKey[s]) as 3 MPIs
s: silent bob byte
over the wire
cw: OpenConnectionManager.ConnectionJob.run(), line 967 file:///m:/russ/source/freenet/dox/OpenConnectionManager_8java-source.html#l00908
cw: FNPLink.NegotiateOutbound, line 568, file:///m:/russ/source/freenet/dox/FnpLink_8java-source.html#l00540
cw: FNPLink.NegotiateOutbound, line 597 file:///m:/russ/source/freenet/dox/FnpLink_8java-source.html#l00540
cr: FNPLink.NegotiateOutbound, line 607 file:///m:/russ/source/freenet/dox/FnpLink_8java-source.html#l00540
privMe = core.privateKey,
pubMe = core.identity
bob = peer's public key
G = 2
P = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
"29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
"EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
"E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
"EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381"
"FFFFFFFFFFFFFFFF"
Rijndael keysize = 128;
Rijndael blocksize = 128;
R = dhParams[0] = 256 bit random
Ca = dhParams[1] = G ^ dhParams[0] mod P
k = rijndael key
Cb = first mpi received over wire
Z = Cb ^ R, shared secret
kent = mpibytes(Z)
k = freenet.crypt.Util.makeKey(kent)
DSAPublicKey/DSAPrivateKey members
y = g ^ x mod p
-- in dles.encrypt() --
pub = bob
M = dhParams[1] <---- plainText
u = random <---- x
gu = g ^ u <---- q
g^uv = pub.y^u
hv = hash(MPIbytes(g^u) + MPIbytes(g^uv))
enckey = t[0] = hv[0:128]
mackey = t[1] = hv[128:256]
C[0] = g^u
C[1] =
C[2]
-- out --
DLESCa = C
2-3[cw]: OpenConnectionManager.ConnectionJob.run(), line 988 file:///m:/russ/source/freenet/dox/OpenConnectionManager_8java-source.html#l00908
registerOCM 1145
?-?[cw]: FnpLink.negotiateRestart()
?-?[sr]: session.FnpLink.accept(), line 74
?-?[sr]: FreenetConnectionRunner.handle(), line 66 file:///m:/russ/source/freenet/dox/FreenetConnectionRunner_8java-source.html#l00053
?-?[sr]: FreenetConnectionRunner.handle(), line 83 file:///m:/russ/source/freenet/dox/FreenetConnectionRunner_8java-source.html#l00053
public static int AUTH_LAYER_VERSION = 0x01;
public static int AUTH_LAYER_VERSION = 0x01;
protected static final int
VER_BIT_LENGTH = 5,
VER_BIT_MASK = 0x1f,
NEGOTIATION_MODE_MASK = 0x03,
RESTART = 0x01,
AUTHENTICATE = 0x00,
SILENT_BOB_BYTE = 0xfb,
SILENT_BOB_HANGUP = 0xfc;
0-1: freenet.presentation.FreenetProtocol.DESIGNATOR (1) big endian
2-3: (AUTH_LAYER_VERSION << (8-VER_BIT_LENGTH)) + AUTHENTICATE
0:00 happy
0:20 sad
0:50 happy
1:00 sad
1:03 panic
1:26 war
1:40 war + wailing
1:55 rest
2:18 fast war
2:30 sparse fast war
2:40 triumph
3:09 fast war + wailing
3:26 worry
3:48 sparse fast war
4:05 low key triumph
4:26 defeat
4:44 fast panic
-------------
This section describes the Freenet protocol for encrypted node-to-node communications. It is meant to be useful to implementors, but it should be understandable to anyone who knows about publick key crytocraphy and how it is used. (If you don't, there are descriptions of it all over the web. Here are three good, nonmathematical ones.
http://www.gnupg.org/gph/en/manual.html#CONCEPTS
http://www.rsasecurity.com/rsalabs/faq/2-1-1.html
http://www.webopedia.com/TERM/P/public_key_cryptography.html
Freenet protocl is made of oveseveral primitives
- Symmetric cipher-
A symmetric cipher encrypts a message with a secret key. The message can only be decrypted using the same key.
It provides two functions
decrypt(plaintext, key) -> ciphertext
encrypt(ciphertext, key) -> plaintext
that satisfy
plaintext = decrypt(encrypt(plaintext, key), key)
The Symmetric cipher used by freenet is Rijndael. Rijndael is a block cipher, which means that one it's own, it can only encrypt messages of a specified length. To get around this restriction, Freenet uses Rijdnael indirectly through a PCBV mode.
ASymmetric Cipher
An assymetric Cipher uses different keys for encrypting and decrypting a message. The keys used to encrypt messages can't be used to decrypt them, so can be made publically available without comprimising the security of the messages. They're called public keys. A keys used to decrypt messages are called private keys. An assymetric cipher consists of two functions:
pk_encrypt(plaintext, pub_key) -> ciphertext
pk_decrypt(ciphertext, priv_key) -> plaintext
and guarantees that
plaintext = pk_decrypt(pk_encrypt(plaintext, pub_key), priv_key)
The assymetric cipher used by freenet is called DLES (Discrete Log Encryption Scheme) One of the nice features of this cipher is that it provides messages validation along with encryption so it detect an error when a message is decrypted with the wrong key (most ciphers just return gobbeldygook when this happens). This helps us implement silent bob.
Key Agreement Function
A key agreement function derives a secret value from two keypairs using the private key from one keypair and the public key from the other. Expressed as a function this looks like
agree(pub_key1, priv_key2) -> secret
and guarantees that
agree(pub_key1, priv_key2) = agree(pub_key2, priv_key1)
Freenet uses the Diffie-Hellman algorithm for key agreement.
Summary
Node A is connecting to node B. Each node is associated with a permanent keypair, and the transcript below will use the following names to refer to these keys:
PubKey[a], PrivKey[a], PubKey[b], PrivKey[b]
Each node also generates an ephermal keypair that used only for this one connection and then discarded. The transcript uses these names to refer to ephermal keys:
TempPubKey[a], TempPrivKey[a], TempPubKey[b], TempPrivKey[b]
The permanent keypairs are used for public key encryption and the private keypairs are used for key agreement (both use have same format since Diffie-Hellman and DLES use the same types of keys).
Node A is connecting to Node B. Node A must know Node B's public key beforehand.
Node A: TempPubKey[a]
Node A: pk_encrypt(TempPubKey[a], Pub)
Freenet MPI's are similar to OpenPGP MPI's (described in
Section 3.2 of http://www.ietf.org/rfc/rfc2440.txt)
Sidebar
Two's complement is a scheme for representing negative numbers in binary form by encoding the sign of a number into the number itself. It's not terribly intuitive, but it works well and is used in pretty much all computer hardware. The rules for counting, adding, and subtracting with two's complement numbers are the same as for normal binary numbers. The only difference is that two's complement numbers that begin with ones get interpreted as negatives and two's complement numbers that begin with 0's get interpreted as non-negatives. The chart below shows the numbers from 7 to -8, in minimal and padded forms.
Decimal Binary 2's Padded 2's
7 111 0111 00000111
6 110 0110 00000110
5 101 0101 00000101
4 100 0100 00000100
3 11 011 00000011
2 10 010 00000010
1 1 01 00000001
0 0 0 00000000
-1 -1 1 11111111
-2 -10 10 11111110
-3 -11 101 11111101
-4 -100 100 11111100
-5 -101 1011 11111011
-6 -110 1010 11111010
-7 -111 1001 11111001
-8 -1000 1000 11111000
First, Alice sends her ephermal public key. After that, Alice sends her ephermal public key again, this time encrypted with the assymetric encyrption cipher and Bob's public key.
When Bob recieves this message and decides it is valid, he will sent back an ackwoledgement byte. The byte value is 251, and is called the "silent bob" byte because bob will only sent it if he recieves a proper greeting and will otherwise remain silent. This behavior is important because it makes it difficult to detect freenet nodes by probing or port scanneing. You can't get a node to respond to you if you don't know it's public key.
-'-----'-----'
============
SimpleKeyAgreementDomain
|
DL_SimpleKeyAgreementDomainBase<Element>
|
DH_Domain
CFB_CipherAbstractPolicy
|0
SimpleKeyedTransformation<StreamTransformation>
||
SymmetricCipher
|
CipherModeBase
|1
ModePolicyCommonTemplate<CFB_CipherAbstractPolicy>
|
CFB_ModePolicy
|
AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy>
|
CFB_CipherTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> >
|
CFB_EncryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> >
|
ConcretePolicyHolder<Empty, CFB_EncryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> > >
|0
ObjectHolder<Rijndael::Encryption>, public BASE
|1
CipherModeFinalTemplate_CipherHolder<Rijndael::Encryption, ConcretePolicyHolder<Empty, CFB_EncryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> > > >
||
CFB_Mode<Rijndael>::Encryption
DL_ElgamalLikeSignatureAlgorithm<Integer>
|
DL_Algorithm_GDSA<Integer>
DL_Key<DL_Keys_DSA::Element>
|
DL_PrivateKey<DL_Keys_DSA::Element>
|
DL_Base<DL_PrivateKey<DL_Keys_DSA::Element>>
|0
PK_Signer
|1
DL_SignatureSchemeBase<PK_Signer, DL_PrivateKey<DL_Keys_DSA::Element> >
|
DL_SignerBase<DL_Keys_DSA::Element>
+ SignAndRestart()
|
AlgorithmImpl<DL_SignerBase<DL_Keys_DSA::Element>, DSA>
|
DL_ObjectImplBase<DL_SignerBase<DL_Keys_DSA::Element>, DL_SignatureSchemeOptions<DSA, DL_Keys_DSA, DL_Algorithm_GDSA<Integer>, DL_SignatureMessageEncodingMethod_DSA, SHA>, DL_Keys_DSA::PrivateKey>
+ GetKey(), AccessKey(), AccessPublicKey(), m_key
|
DL_ObjectImpl<DL_SignerBase<DL_Keys_DSA::Element>, DL_SignatureSchemeOptions<DSA, DL_Keys_DSA, DL_Algorithm_GDSA<Integer>, DL_SignatureMessageEncodingMethod_DSA, SHA>, DL_Keys_DSA::PrivateKey>
|0
PrivateKeyCopier<DL_SignatureSchemeOptions<DSA, DL_Keys_DSA, DL_Algorithm_GDSA<Integer>, DL_SignatureMessageEncodingMethod_DSA, SHA>>
|1
DL_PrivateObjectImpl<DL_SignerBase<DL_Keys_DSA::Element>, DL_SignatureSchemeOptions<DSA, DL_Keys_DSA, DL_Algorithm_GDSA<Integer>, DL_SignatureMessageEncodingMethod_DSA, SHA> >
+ CopyKeyInto()
|
DL_SignerImpl<DL_SignatureSchemeOptions<DSA, DL_Keys_DSA, DL_Algorithm_GDSA<Integer>, DL_SignatureMessageEncodingMethod_DSA, SHA> >
|
PK_FinalTemplate<DL_SignerImpl<DL_SignatureSchemeOptions<DSA, DL_Keys_DSA, DL_Algorithm_GDSA<Integer>, DL_SignatureMessageEncodingMethod_DSA, SHA> > >
||
DSA::Signer
DL_SS<DL_Keys_DSA, DL_Algorithm_GDSA<Integer>, DL_SignatureMessageEncodingMethod_DSA, SHA, DSA>
|
DSA
DL_KeyImpl<PKCS8PrivateKey, DL_GroupParameters_DSA>
|0
DL_Key<DL_GroupParameters_DSA::Element>
|
DL_PrivateKey<DL_GroupParameters_DSA::Element>
|1
DL_PrivateKeyImpl<DL_GroupParameters_DSA>
+ m_x
|
DL_PrivateKey_GFP<DL_GroupParameters_DSA>
+ Initialize(...)
|
DL_PrivateKey_WithSignaturePairwiseConsistencyTest<DL_PrivateKey_GFP<DL_GroupParameters_DSA>, DSA>
||
DL_Keys_DSA::PrivateKey
ASN1CryptoMaterial
|0
DL_GroupParameters<Integer>
|1
DL_GroupParameters_IntegerBased
|
DL_GroupParameters_IntegerBasedImpl<ModExpPrecomputation>
|
DL_GroupParameters_GFP
|
DL_GroupParameters_GFP_DefaultSafePrime
ASN1CryptoMaterial
|0
DL_GroupParameters<Integer>
|1
DL_GroupParameters_IntegerBased
|
DL_GroupParameters_IntegerBasedImpl<ModExpPrecomputation>
|
DL_GroupParameters_GFP
|
DL_GroupParameters_DSA
X509PublicKey
|
DL_KeyImpl<X509PublicKey, DL_GroupParameters_GFP_DefaultSafePrime>
|0
DL_Key<DL_GroupParameters_GFP_DefaultSafePrime::Element>
|
DL_PublicKey<DL_GroupParameters_GFP_DefaultSafePrime::Element>
|1
DL_PublicKeyImpl<DL_GroupParameters_GFP_DefaultSafePrime>
|
DL_PublicKey_GFP<DL_GroupParameters_GFP_DefaultSafePrime>
|
DL_CryptoKeys_GFP::PublicKey
DL_Base<DL_PublicKey<DL_CryptoKeys_GFP::Element>>
|0
PK_Encryptor
|1
DL_CryptoSystemBase<PK_Encryptor, DL_PublicKey<DL_CryptoKeys_GFP::Element> >
|
DL_EncryptorBase<DL_CryptoKeys_GFP::Element>
|
AlgorithmImpl<DL_EncryptorBase<DL_CryptoKeys_GFP::Element>, DLIES<>>
|
DL_ObjectImplBase<DL_EncryptorBase<DL_CryptoKeys_GFP::Element>, DL_CryptoSchemeOptions<DLIES<>, DL_CryptoKeys_GFP, DL_KeyAgreementAlgorithm_DH<Integer, COFACTOR_OPTION>, DL_KeyDerivationAlgorithm_P1363<Integer, DHAES_MODE, P1363_KDF2<SHA1> >, DL_EncryptionAlgorithm_Xor<HMAC<SHA1>, DHAES_MODE>>, DL_CryptoKeys_GFP::PublicKey>
|
DL_ObjectImpl<DL_EncryptorBase<DL_CryptoKeys_GFP::Element>, DL_CryptoSchemeOptions<DLIES<>, DL_CryptoKeys_GFP, DL_KeyAgreementAlgorithm_DH<Integer, COFACTOR_OPTION>, DL_KeyDerivationAlgorithm_P1363<Integer, DHAES_MODE, P1363_KDF2<SHA1> >, DL_EncryptionAlgorithm_Xor<HMAC<SHA1>, DHAES_MODE>>, DL_CryptoKeys_GFP::PublicKey>
|0
PublicKeyCopier<DL_CryptoSchemeOptions<DLIES<>, DL_CryptoKeys_GFP, DL_KeyAgreementAlgorithm_DH<Integer, COFACTOR_OPTION>, DL_KeyDerivationAlgorithm_P1363<Integer, DHAES_MODE, P1363_KDF2<SHA1> >, DL_EncryptionAlgorithm_Xor<HMAC<SHA1>, DHAES_MODE>>>
|1
DL_PublicObjectImpl<DL_EncryptorBase<DL_CryptoKeys_GFP::Element>, DL_CryptoSchemeOptions<DLIES<>, DL_CryptoKeys_GFP, DL_KeyAgreementAlgorithm_DH<Integer, COFACTOR_OPTION>, DL_KeyDerivationAlgorithm_P1363<Integer, DHAES_MODE, P1363_KDF2<SHA1> >, DL_EncryptionAlgorithm_Xor<HMAC<SHA1>, DHAES_MODE>>>
|
DL_EncryptorImpl<DL_CryptoSchemeOptions<DLIES<>, DL_CryptoKeys_GFP, DL_KeyAgreementAlgorithm_DH<Integer, COFACTOR_OPTION>, DL_KeyDerivationAlgorithm_P1363<Integer, DHAES_MODE, P1363_KDF2<SHA1> >, DL_EncryptionAlgorithm_Xor<HMAC<SHA1>, DHAES_MODE>>>
|
PK_FinalTemplate<DL_EncryptorImpl<DL_CryptoSchemeOptions<DLIES<>, DL_CryptoKeys_GFP, DL_KeyAgreementAlgorithm_DH<Integer, COFACTOR_OPTION>, DL_KeyDerivationAlgorithm_P1363<Integer, DHAES_MODE, P1363_KDF2<SHA1> >, DL_EncryptionAlgorithm_Xor<HMAC<SHA1>, DHAES_MODE>>> >
||
DL_ES<DL_CryptoKeys_GFP, DL_KeyAgreementAlgorithm_DH<Integer, COFACTOR_OPTION>, DL_KeyDerivationAlgorithm_P1363<Integer, DHAES_MODE, P1363_KDF2<SHA1> >, DL_EncryptionAlgorithm_Xor<HMAC<SHA1>, DHAES_MODE>, DLIES<>>::Encryptor
||
DLIES::Encryptor
BufferedTransformation
|
InputRejecting<BufferedTransformation>
+ Put2() -> throw InputRejected()
|
AutoSignaling<InputRejecting<BufferedTransformation> >
+ SetAutoSignalPropagation()
+ GetAutoSignalPropagation()
|
Store
+ NumberOfMessages()
+ CopyMessagesTo()
+
|
StringStore
+ Transfer2()
+ CopyRange2()
SourceTemplate<StringStore>
+ Pump2() -> Source.Transfer2
+ PumpMessages2 -> Source.TransferMessages2
|
StringSource
BUFFEREDTRANSFOMATION
virtual unsigned int Put2(const byte *inString, unsigned int length, int messageEnd, bool blocking) =0;
virtual bool IsolatedFlush(bool hardFlush, bool blocking) =0;
virtual unsigned int TransferTo2(BufferedTransformation &target, unsigned long &byteCount, const std::string &channel=NULL_CHANNEL, bool blocking=true) =0;
virtual unsigned int CopyRangeTo2(BufferedTransformation &target, unsigned long &begin, unsigned long end=ULONG_MAX, const std::string &channel=NULL_CHANNEL, bool blocking=true) const =0;
SOURCE
virtual unsigned int Pump2(unsigned long &byteCount, bool blocking=true) =0;
virtual unsigned int PumpMessages2(unsigned int &messageCount, bool blocking=true) =0;
virtual unsigned int PumpAll2(bool blocking=true);
virtual bool SourceExhausted() const =0;