1- -- !native
1+ local require = require (game :GetService (" ServerScriptService" ):FindFirstChild (" LoaderUtils" , true ).Parent ).bootstrapStory (script )
2+
3+ local Jest = require (" Jest" )
24local ecc = require (script .Parent )
35
4- warn (" Running EllipticCurveCryptography benchmark..." )
6+ local describe = Jest .Globals .describe
7+ local expect = Jest .Globals .expect
8+ local it = Jest .Globals .it
59
6- -- selene: allow(unused_variable)
7- local function printBytes (byteTable )
8- return table.concat (byteTable , " -" )
10+ -- helper function
11+ local function generateTestData (size )
12+ local data = table.create (size )
13+ for x = 1 , size do
14+ data [x ] = math.random (35 , 120 )
15+ end
16+ return string.char (table.unpack (data ))
917end
1018
11- -- Each machine generates their tokens
12- local serverPrivate , serverPublic = ecc .keypair (ecc .random .random ())
13- local clientPrivate , clientPublic = ecc .keypair (ecc .random .random ())
14-
15- -- print("\nserverPrivate:",printBytes(serverPrivate),"\nserverPublic:",printBytes(serverPublic))
16- -- print("\nclientPrivate:",printBytes(clientPrivate),"\nclientPublic:",printBytes(clientPublic))
19+ describe (" EllipticCurveCryptography Performance" , function ()
20+ local N , S = 500 , 100 -- N iterations, S bytes per payload
1721
18- -- They share their publics and exchange to shared secret
19- local serverSecret = ecc .exchange (serverPrivate , clientPublic )
20- local clientSecret = ecc .exchange (clientPrivate , serverPublic )
22+ it (string.format (" should efficiently process %d payloads of %d bytes" , N , S ), function ()
23+ local serverPrivate , serverPublic = ecc .keypair (DateTime .now ().UnixTimestamp )
24+ local clientPrivate , clientPublic = ecc .keypair (DateTime .now ().UnixTimestamp )
25+ local serverSecret = ecc .exchange (serverPrivate , clientPublic )
26+ local clientSecret = ecc .exchange (clientPrivate , serverPublic )
2127
22- -- print("\nsharedSecret:", printBytes(serverSecret))
28+ -- verify shared secret matches before benchmarking
29+ expect (tostring (serverSecret )).toEqual (tostring (clientSecret ))
2330
24- assert ( tostring ( serverSecret ) == tostring ( clientSecret ), " sharedSecret must be identical to both parties " )
31+ local encryptSum , decryptSum = 0 , 0
2532
26- -- warn("encrypting and signing payload(s)")
33+ for _ = 1 , N do
34+ local payload = generateTestData (S )
2735
28- local N , S = 500 , 100
29- local encryptSum , decryptSum = 0 , 0
30- local data = table.create (S )
31- for _ = 1 , N do
32- for x = 1 , S do
33- data [x ] = math.random (35 , 120 )
34- end
35- local payload = string.char (table.unpack (data ))
36+ -- measure encryption + signing
37+ local start = os.clock ()
38+ local ciphertext = ecc .encrypt (payload , clientSecret )
39+ local sig = ecc .sign (clientPrivate , payload )
40+ encryptSum += os.clock () - start
3641
37- local start = os.clock ()
38- local ciphertext = ecc .encrypt (payload , clientSecret )
39- local sig = ecc .sign (clientPrivate , payload )
40- encryptSum += os.clock () - start
42+ -- measure decryption + verification
43+ start = os.clock ()
44+ local plaintext = ecc .decrypt (ciphertext , serverSecret )
45+ ecc .verify (clientPublic , plaintext , sig )
46+ decryptSum += os.clock () - start
47+ end
4148
42- start = os.clock ()
43- local plaintext = ecc .decrypt (ciphertext , serverSecret )
44- ecc .verify (clientPublic , plaintext , sig )
49+ -- calculate metrics
50+ local encryptTotal = encryptSum * 1000 -- convert to ms
51+ local encryptAvg = (encryptSum / N ) * 1000
52+ local decryptTotal = decryptSum * 1000
53+ local decryptAvg = (decryptSum / N ) * 1000
4554
46- decryptSum += os.clock () - start
47-
48- -- print(" Bench run %d done", i)
49- end
55+ -- performance expectations
56+ -- expect(encryptAvg).toBeLessThan(1) -- expect sub-1ms average for encryption
57+ -- expect(decryptAvg).toBeLessThan(1) -- expect sub-1ms average for decryption
5058
51- print (
52- string.format (
53- " Dataset: %d payloads of %d bytes of random data.\n Results:\n Encrypt & Sign took %.2fms in total with a %.2fms avg.\n Decrypt & Verify took %.2fms in total with a %.2fms avg." ,
54- N ,
55- S ,
56- encryptSum * 1000 ,
57- (encryptSum / N ) * 1000 ,
58- decryptSum * 1000 ,
59- (decryptSum / N ) * 1000
60- )
61- )
62-
63- return true
59+ -- log performance results (optional, but useful for debugging)
60+ print (string.format (
61+ " benchmark results:\n " ..
62+ " encrypt & sign: %.2fms total, %.2fms avg\n " ..
63+ " decrypt & verify: %.2fms total, %.2fms avg" ,
64+ encryptTotal , encryptAvg , decryptTotal , decryptAvg
65+ ))
66+ end , 30000 )
67+ end )
0 commit comments