Skip to content

Commit dcf34c1

Browse files
committed
use a mock rng in tests
1 parent b30b265 commit dcf34c1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+323
-219
lines changed

libp2p/builders.nim

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import
2727
protocols/connectivity/[autonat/server, relay/relay, relay/client, relay/rtransport],
2828
connmanager, upgrademngrs/muxedupgrade, observedaddrmanager,
2929
nameresolving/nameresolver,
30-
errors, utility
30+
errors, utility, utils/random/securerng
3131

3232
export
3333
switch, peerid, peerinfo, connection, multiaddress, crypto, errors
@@ -44,7 +44,7 @@ type
4444
secureManagers: seq[SecureProtocol]
4545
muxers: seq[MuxerProvider]
4646
transports: seq[TransportProvider]
47-
rng: ref HmacDrbgContext
47+
rng: Rng
4848
maxConnections: int
4949
maxIn: int
5050
sendSignedPeerRecord: bool
@@ -149,7 +149,7 @@ proc withTransport*(b: SwitchBuilder, prov: TransportProvider): SwitchBuilder {.
149149
proc withTcpTransport*(b: SwitchBuilder, flags: set[ServerFlags] = {}): SwitchBuilder {.public.} =
150150
b.withTransport(proc(upgr: Upgrade): Transport = TcpTransport.new(flags, upgr))
151151

152-
proc withRng*(b: SwitchBuilder, rng: ref HmacDrbgContext): SwitchBuilder {.public.} =
152+
proc withRng*(b: SwitchBuilder, rng: Rng): SwitchBuilder {.public.} =
153153
b.rng = rng
154154
b
155155

@@ -215,7 +215,7 @@ proc build*(b: SwitchBuilder): Switch
215215
if b.rng == nil: # newRng could fail
216216
raise newException(Defect, "Cannot initialize RNG")
217217

218-
let pkRes = PrivateKey.random(b.rng[])
218+
let pkRes = PrivateKey.random(b.rng)
219219
let
220220
seckey = b.privKey.get(otherwise = pkRes.expect("Expected default Private Key"))
221221

@@ -253,7 +253,7 @@ proc build*(b: SwitchBuilder): Switch
253253
b.secureManagers &= SecureProtocol.Noise
254254

255255
if isNil(b.rng):
256-
b.rng = newRng()
256+
b.rng = SecureRng.new()
257257

258258
let peerStore = block:
259259
b.peerStoreCapacity.withValue(capacity):
@@ -297,7 +297,7 @@ proc newStandardSwitch*(
297297
SecureProtocol.Noise,
298298
],
299299
transportFlags: set[ServerFlags] = {},
300-
rng = newRng(),
300+
rng: Rng = SecureRng.new(),
301301
inTimeout: Duration = 5.minutes,
302302
outTimeout: Duration = 5.minutes,
303303
maxConnections = MaxConnections,

libp2p/crypto/crypto.nim

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ proc shuffle*[T](
188188
swap(x[i], x[y])
189189

190190
proc random*(T: typedesc[PrivateKey], scheme: PKScheme,
191-
rng: var HmacDrbgContext,
191+
rng: Rng,
192192
bits = RsaDefaultKeySize): CryptoResult[PrivateKey] =
193193
## Generate random private key for scheme ``scheme``.
194194
##
@@ -220,7 +220,7 @@ proc random*(T: typedesc[PrivateKey], scheme: PKScheme,
220220
else:
221221
err(SchemeError)
222222

223-
proc random*(T: typedesc[PrivateKey], rng: var HmacDrbgContext,
223+
proc random*(T: typedesc[PrivateKey], rng: Rng,
224224
bits = RsaDefaultKeySize): CryptoResult[PrivateKey] =
225225
## Generate random private key using default public-key cryptography scheme.
226226
##
@@ -244,7 +244,7 @@ proc random*(T: typedesc[PrivateKey], rng: var HmacDrbgContext,
244244
err(SchemeError)
245245

246246
proc random*(T: typedesc[KeyPair], scheme: PKScheme,
247-
rng: var HmacDrbgContext,
247+
rng: Rng,
248248
bits = RsaDefaultKeySize): CryptoResult[KeyPair] =
249249
## Generate random key pair for scheme ``scheme``.
250250
##
@@ -284,7 +284,7 @@ proc random*(T: typedesc[KeyPair], scheme: PKScheme,
284284
else:
285285
err(SchemeError)
286286

287-
proc random*(T: typedesc[KeyPair], rng: var HmacDrbgContext,
287+
proc random*(T: typedesc[KeyPair], rng: Rng,
288288
bits = RsaDefaultKeySize): CryptoResult[KeyPair] =
289289
## Generate random private pair of keys using default public-key cryptography
290290
## scheme.

libp2p/crypto/curve25519.nim

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import bearssl/[ec, rand]
2121
import stew/results
2222
from stew/assign2 import assign
23+
24+
import ../utils/random/rng
25+
2326
export results
2427

2528
const
@@ -79,11 +82,10 @@ proc mulgen(_: type[Curve25519], dst: var Curve25519Key, point: Curve25519Key) =
7982
proc public*(private: Curve25519Key): Curve25519Key =
8083
Curve25519.mulgen(result, private)
8184

82-
proc random*(_: type[Curve25519Key], rng: var HmacDrbgContext): Curve25519Key =
85+
proc random*(_: type[Curve25519Key], rng: Rng): Curve25519Key =
8386
var res: Curve25519Key
8487
let defaultBrEc = ecGetDefault()
85-
let len = ecKeygen(
86-
addr rng.vtable, defaultBrEc, nil, addr res[0], EC_curve25519)
88+
let len = ecKeygen(addr rng.vtable, defaultBrEc, nil, addr res[0], EC_curve25519)
8789
# Per bearssl documentation, the keygen only fails if the curve is
8890
# unrecognised -
8991
doAssert len == Curve25519KeySize, "Could not generate curve"

libp2p/crypto/ecnist.nim

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import minasn1
2323
export minasn1.Asn1Error
2424
import stew/[results, ctops]
2525

26+
import ../utils/random/rng
2627
import ../utility
2728

2829
export results
@@ -233,7 +234,7 @@ proc clear*[T: EcPKI|EcKeyPair](pki: var T) =
233234
234235
proc random*(
235236
T: typedesc[EcPrivateKey], kind: EcCurveKind,
236-
rng: var HmacDrbgContext): EcResult[EcPrivateKey] =
237+
rng: Rng): EcResult[EcPrivateKey] =
237238
## Generate new random EC private key using BearSSL's HMAC-SHA256-DRBG
238239
## algorithm.
239240
##
@@ -267,7 +268,7 @@ proc getPublicKey*(seckey: EcPrivateKey): EcResult[EcPublicKey] =
267268

268269
proc random*(
269270
T: typedesc[EcKeyPair], kind: EcCurveKind,
270-
rng: var HmacDrbgContext): EcResult[T] =
271+
rng: Rng): EcResult[T] =
271272
## Generate new random EC private and public keypair using BearSSL's
272273
## HMAC-SHA256-DRBG algorithm.
273274
##
@@ -999,7 +1000,7 @@ type ECDHEScheme* = EcCurveKind
9991000

10001001
proc ephemeral*(
10011002
scheme: ECDHEScheme,
1002-
rng: var HmacDrbgContext): EcResult[EcKeyPair] =
1003+
rng: Rng): EcResult[EcKeyPair] =
10031004
## Generate ephemeral keys used to perform ECDHE.
10041005
var keypair: EcKeyPair
10051006
if scheme == Secp256r1:
@@ -1011,7 +1012,7 @@ proc ephemeral*(
10111012
ok(keypair)
10121013

10131014
proc ephemeral*(
1014-
scheme: string, rng: var HmacDrbgContext): EcResult[EcKeyPair] =
1015+
scheme: string, rng: Rng): EcResult[EcKeyPair] =
10151016
## Generate ephemeral keys used to perform ECDHE using string encoding.
10161017
##
10171018
## Currently supported encoding strings are P-256, P-384, P-521, if encoding

libp2p/crypto/ed25519/ed25519.nim

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ import nimcrypto/utils as ncrutils
2121
import stew/[results, ctops]
2222

2323
import ../../utility
24+
import ../../utils/random/rng
2425

25-
export results
26+
export results, rng
2627

2728
# This workaround needed because of some bugs in Nim Static[T].
2829
export hash, sha2, rand
@@ -1648,14 +1649,14 @@ proc checkScalar*(scalar: openArray[byte]): uint32 =
16481649
c = -1
16491650
result = NEQ(z, 0'u32) and LT0(c)
16501651

1651-
proc random*(t: typedesc[EdPrivateKey], rng: var HmacDrbgContext): EdPrivateKey =
1652+
proc random*(t: typedesc[EdPrivateKey], rng: Rng): EdPrivateKey =
16521653
## Generate new random ED25519 private key using the given random number generator
16531654
var
16541655
point: GeP3
16551656
pk: array[EdPublicKeySize, byte]
16561657
res: EdPrivateKey
16571658

1658-
hmacDrbgGenerate(rng, res.data.toOpenArray(0, 31))
1659+
rng.generate(res.data.toOpenArray(0, 31))
16591660

16601661
var hh = sha512.digest(res.data.toOpenArray(0, 31))
16611662
hh.data[0] = hh.data[0] and 0xF8'u8
@@ -1667,14 +1668,14 @@ proc random*(t: typedesc[EdPrivateKey], rng: var HmacDrbgContext): EdPrivateKey
16671668

16681669
res
16691670

1670-
proc random*(t: typedesc[EdKeyPair], rng: var HmacDrbgContext): EdKeyPair =
1671+
proc random*(t: typedesc[EdKeyPair], rng: Rng): EdKeyPair =
16711672
## Generate new random ED25519 private and public keypair using OS specific
16721673
## CSPRNG.
16731674
var
16741675
point: GeP3
16751676
res: EdKeyPair
16761677

1677-
hmacDrbgGenerate(rng, res.seckey.data.toOpenArray(0, 31))
1678+
rng.generate(res.seckey.data.toOpenArray(0, 31))
16781679

16791680
var hh = sha512.digest(res.seckey.data.toOpenArray(0, 31))
16801681
hh.data[0] = hh.data[0] and 0xF8'u8

libp2p/crypto/rsa.nim

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import minasn1
2020
import stew/[results, ctops]
2121
# We use `ncrutils` for constant-time hexadecimal encoding/decoding procedures.
2222
import nimcrypto/utils as ncrutils
23+
import ../utils/random/rng
2324

2425
export Asn1Error, results
2526

@@ -115,7 +116,7 @@ template trimZeroes(b: seq[byte], pt, ptlen: untyped) =
115116
pt = cast[ptr byte](cast[uint](pt) + 1)
116117
ptlen -= 1
117118

118-
proc random*[T: RsaKP](t: typedesc[T], rng: var HmacDrbgContext,
119+
proc random*[T: RsaKP](t: typedesc[T], rng: Rng,
119120
bits = DefaultKeySize,
120121
pubexp = DefaultPublicExponent): RsaResult[T] =
121122
## Generate new random RSA private key using BearSSL's HMAC-SHA256-DRBG

libp2p/crypto/secp.nim

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import
1515
stew/[byteutils, results],
1616
nimcrypto/[hash, sha2]
1717

18+
import ../utils/random/rng
19+
1820
export sha2, results, rand
1921

2022
const
@@ -32,18 +34,16 @@ type
3234
SkSignature* = distinct secp256k1.SkSignature
3335
SkKeyPair* = distinct secp256k1.SkKeyPair
3436

35-
proc random*(t: typedesc[SkPrivateKey], rng: var HmacDrbgContext): SkPrivateKey =
37+
proc random*(t: typedesc[SkPrivateKey], rng: rng.Rng): SkPrivateKey =
3638
#TODO is there a better way?
37-
var rngPtr = addr rng
3839
proc callRng(data: var openArray[byte]) =
39-
hmacDrbgGenerate(rngPtr[], data)
40+
rng.generate(data)
4041

4142
SkPrivateKey(SkSecretKey.random(callRng))
4243

43-
proc random*(t: typedesc[SkKeyPair], rng: var HmacDrbgContext): SkKeyPair =
44-
let rngPtr = addr rng
44+
proc random*(t: typedesc[SkKeyPair], rng: rng.Rng): SkKeyPair =
4545
proc callRng(data: var openArray[byte]) =
46-
hmacDrbgGenerate(rngPtr[], data)
46+
rng.generate(data)
4747

4848
SkKeyPair(secp256k1.SkKeyPair.random(callRng))
4949

libp2p/peerid.nim

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import
2020
utility,
2121
./crypto/crypto, ./multicodec, ./multihash, ./vbuffer,
2222
./protobuf/minprotobuf
23+
import utils/random/securerng
2324

2425
export results, utility
2526

@@ -178,9 +179,9 @@ func init*(t: typedesc[PeerId], seckey: PrivateKey): Result[PeerId, cstring] =
178179
## Create new peer id from private key ``seckey``.
179180
PeerId.init(? seckey.getPublicKey().orError(cstring("invalid private key")))
180181

181-
proc random*(t: typedesc[PeerId], rng = newRng()): Result[PeerId, cstring] =
182+
proc random*(t: typedesc[PeerId], rng: Rng = SecureRng.new()): Result[PeerId, cstring] =
182183
## Create new peer id with random public key.
183-
let randomKey = PrivateKey.random(Secp256k1, rng[])[]
184+
let randomKey = PrivateKey.random(Secp256k1, rng)[]
184185
PeerId.init(randomKey).orError(cstring("failed to generate random key"))
185186

186187
func match*(pid: PeerId, pubkey: PublicKey): bool =

libp2p/protocols/connectivity/autonat/service.nim

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import ../../../wire
1616
import client
1717
from core import NetworkReachability, AutonatUnreachableError
1818
import ../../../utils/heartbeat
19+
import ../../../utils/random/rng
1920
import ../../../crypto/crypto
2021

2122
export core.NetworkReachability
@@ -35,7 +36,7 @@ type
3536
answers: Deque[NetworkReachability]
3637
autonatClient: AutonatClient
3738
statusAndConfidenceHandler: StatusAndConfidenceHandler
38-
rng: ref HmacDrbgContext
39+
rng: Rng
3940
scheduleInterval: Opt[Duration]
4041
askNewConnectedPeers: bool
4142
numPeersToAsk: int
@@ -49,7 +50,7 @@ type
4950
proc new*(
5051
T: typedesc[AutonatService],
5152
autonatClient: AutonatClient,
52-
rng: ref HmacDrbgContext,
53+
rng: Rng,
5354
scheduleInterval: Opt[Duration] = Opt.none(Duration),
5455
askNewConnectedPeers = true,
5556
numPeersToAsk: int = 5,

libp2p/protocols/secure/noise.nim

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import ../../peerinfo
2121
import ../../protobuf/minprotobuf
2222
import ../../utility
2323
import ../../errors
24+
import ../../utils/random/rng
2425

2526
import secure,
2627
../../crypto/[crypto, chacha20poly1305, curve25519, hkdf]
@@ -78,7 +79,7 @@ type
7879
rs: Curve25519Key
7980

8081
Noise* = ref object of Secure
81-
rng: ref HmacDrbgContext
82+
rng: Rng
8283
localPrivateKey: PrivateKey
8384
localPublicKey: seq[byte]
8485
noiseKeys: KeyPair
@@ -106,7 +107,7 @@ func shortLog*(conn: NoiseConnection): auto =
106107

107108
chronicles.formatIt(NoiseConnection): shortLog(it)
108109

109-
proc genKeyPair(rng: var HmacDrbgContext): KeyPair =
110+
proc genKeyPair(rng: Rng): KeyPair =
110111
result.privateKey = Curve25519Key.random(rng)
111112
result.publicKey = result.privateKey.public()
112113

@@ -235,7 +236,7 @@ template write_e: untyped =
235236
trace "noise write e"
236237
# Sets e (which must be empty) to GENERATE_KEYPAIR().
237238
# Appends e.public_key to the buffer. Calls MixHash(e.public_key).
238-
hs.e = genKeyPair(p.rng[])
239+
hs.e = genKeyPair(p.rng)
239240
msg.add hs.e.publicKey
240241
hs.ss.mixHash(hs.e.publicKey)
241242

@@ -645,7 +646,7 @@ method init*(p: Noise) {.gcsafe.} =
645646

646647
proc new*(
647648
T: typedesc[Noise],
648-
rng: ref HmacDrbgContext,
649+
rng: Rng,
649650
privateKey: PrivateKey,
650651
outgoing: bool = true,
651652
commonPrologue: seq[byte] = @[]): T =
@@ -658,7 +659,7 @@ proc new*(
658659
outgoing: outgoing,
659660
localPrivateKey: privateKey,
660661
localPublicKey: pkBytes,
661-
noiseKeys: genKeyPair(rng[]),
662+
noiseKeys: genKeyPair(rng),
662663
commonPrologue: commonPrologue,
663664
)
664665

libp2p/services/autorelayservice.nim

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111

1212
import chronos, chronicles, times, tables, sequtils
1313
import ../switch,
14-
../protocols/connectivity/relay/[client, utils]
14+
../protocols/connectivity/relay/[client, utils],
15+
../utils/random/rng
1516

1617
logScope:
1718
topics = "libp2p autorelay"
@@ -30,7 +31,7 @@ type
3031
peerAvailable: AsyncEvent
3132
onReservation: OnReservationHandler
3233
addressMapper: AddressMapper
33-
rng: ref HmacDrbgContext
34+
rng: Rng
3435

3536
proc isRunning*(self: AutoRelayService): bool =
3637
return self.running
@@ -139,7 +140,7 @@ proc new*(T: typedesc[AutoRelayService],
139140
numRelays: int,
140141
client: RelayClient,
141142
onReservation: OnReservationHandler,
142-
rng: ref HmacDrbgContext): T =
143+
rng: Rng): T =
143144
T(numRelays: numRelays,
144145
client: client,
145146
onReservation: onReservation,

libp2p/transports/tortransport.nim

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ import transport,
2121
../builders,
2222
../stream/[lpstream, connection, chronosstream],
2323
../multiaddress,
24-
../upgrademngrs/upgrade
24+
../upgrademngrs/upgrade,
25+
../utils/random/rng
2526

2627
const
2728
IPTcp = mapAnd(IP, mapEq("tcp"))
@@ -252,7 +253,7 @@ type
252253
proc new*(
253254
T: typedesc[TorSwitch],
254255
torServer: TransportAddress,
255-
rng: ref HmacDrbgContext,
256+
rng: Rng,
256257
addresses: seq[MultiAddress] = @[],
257258
flags: set[ServerFlags] = {}): TorSwitch
258259
{.raises: [LPError], public.} =

0 commit comments

Comments
 (0)