BachelorWork/appendixes/BC_ZK/README.md
2021-05-28 00:53:37 +02:00

6.7 KiB

INFORMATIONS

Organization: Technical University of Kosice (TUKE),

Department: Department of Electronics and Multimedia Telecommunications (DEMT/KEMT),

Faculties: Faculty of Electrical Engineering and Informatics (FEI),

Feld of study: Informatics,

Study program: Computer Networks,

School year: 3., Bachelor study, 2020/2021,

Author: Marek Rohac -- MR,

Compiler: Winlibs GCC -- MinGW-W64 x86_64-posix-seh, built by Brecht Sanders, v. 10.2.0, -- works also with v.11.1.0

Version: 1.3, 20.05.2021.

COMPILING

VIA MAKEFILE

For compiling all source codes i prepare makefile, so just use command:

 make all

That will create .exe files. For more details see makefile.

SELECTIVE COMPILING

winAPIprng:

 gcc winAPIprng.c -o winAPIprng -Wall -Wextra -Werror -g -std=c11 -lbcrypt

amdSPRNG:

 gcc ./amdINC/secrng.c amdSPRNG.c -Wall  -Wextra -Werror -g -I./amdINC -mrdrnd -mrdseed -o amdSPRNG -std=c11

opessl_rng:

gcc -o openssl_rng openssl_rng.c -Wall -Wextra -g  -I./openssl/include -L./openssl/lib -llibcrypto

REMOVAL

For removing all executables and files which was generated by executions these programs use command:

 make clean 

That remove all file with .exe , .bin and .txt suffixes

USAGE

NO INPUT PARAMATERS IN EACH CASE

WINDOWS API PRNG - winAPIprng.c

    39 #define RNG_PER_CYKLE_BITS 268435456  //per API call output size
    41 #define RNG_CYCLES 1024 //total count of calls

In macro RNG_PER_CYKLE_BITS define how much output in bits you want from one call of API and in RNG_CYCLES number of api calls.

Program generate output according APIs and save values to .bin files with name by current API.

If you want to generate with specific API, just comment all other functions im main().

MEASURMENT

For measurment of API i use function cpucyclesS() and cpucyclesE(). They returns numbers of cycles of current API. Speed or time of execution we then can calculate via formula:

Total_cpycycles_of_API * (1/Processor_ghz_during_execution_API) * 10^-9 = Time_of_executions s

On modern processors its hard to determine how much GHz was used during executions(power plans,turbo modes,...). Therefore i also implemented timer of execution, but keep in mind, it counts also with storing of random data. Results are store in Results.txt file.

NOTE FOR MEASURMENT

If you want better precision of Total execution time, don't save random data (comment function store_Data()). Also for absolutely same conditions for every api, you should wait certain time before calling next api. Reason is to give system time to retrieve respectively gain more data into entropy pool from system entropy sources. (1 hours to full regen). Also random data have much better quality after giving a time to regen entropy.

TIME OF EXECUTIONS

Time of executions of program strongly depend on your procesor and output size. If you don't want spend to much time lover RNG_OUTPUT_BITS (do it correctly).

WIN API for measurment is used via macros. Experimental time results on my computer (see SPEC),if you run all api in program with storing random data:

1,875GB output size -->   CryptGenRandom  --> EXECUTED in 1.752000  s
                          BCryptGenRandom --> EXECUTED in 21.232000 s
                          RtlGenRandom    --> EXECUTED in 23.052000 s
                          rand_s          --> EXECUTED in 45.193655 s

SPEED OF EXECUTION IS ALSO INFLUENCED BY WRITING SPEED OF YOUR STORAGE DEVICE (In case store_Data() is enable)

NOTE FOR OUTPUT SIZE

To count output size in GB use formula:

--> RNG_OUTPUT_BITS/RNG_PER_CYKLE_BITS/8/1000/1000 = output_size_in_GB

For faster execution downsize macros

AMD SECURE PRNG - amdSPRNG.c

Program use 4 AMD APIs (defined in secrng.h, realized in secrng.c) to generate random bytes:

    is_RDRAND_supported();
    is_RDSEED_supported();
    get_rdseed_bytes_arr(unsigned char *rng_arr, unsigned int N, unsigned int retry_count)
    get_rdrand_bytes_arr(unsigned char *rng_arr, unsigned int N, unsigned int retry_count)

Version of AMD libraries: 3.0 -- March, 2021

DESCRIPTION

In source code, amdSPRNG.c, macros

29    #define CYCLES 1000 // calls count
31    #define N 625000 //per API call output size 
36    #define NT 10 //retry times

N define how much random bytes you want per one generating of certain API. CYCLES defined how much times you want to repeat generating process of that API.

Program then generate output according APIs and save values to .bin files with name by current RD name.

IN CASE OF PRINTING FAILURE TO STDOUT, RAISE NT macro. Maximum of retry attempts is set in secrng.c, under MAX_RETRY_COUNT on 51 line. (equal 20, default 10).

For informations about file output size check NOTE FOR OUTPUT SIZE

MEASURMENT

Look on MEASURMENT in WINDOWS API PRNG. Results are store in RDResults.txt file. For better precision comment checking confition and storing data. NOTICE: NO REGEN TIME NEEDED FOR REGAINING ENTROPY CAUSE OF USING TRNG.

TIME OF EXECUTIONS

Look on TIME OF EXECUTION in WINDOWS API PRNG. Same principle. Note that these will take longer time to execute program. It depend on NT times, your processor and writing speed of storage device.

Experimental time results (same hardware & software like above):

0,625GB output size -->  RDSEED --> EXECUTED in 319.976000 s
                         RDRAND --> EXECUTED in 71.733000  s

NOTE FOR OUTPUT SIZE

To count output size in GB use formula:

--> N*CYCLES/1024/1024/1024 = output_size_in_GB

OPENSSL RNG APIs 64-bit libraries used

We implement 2 API --> RAND_bytes and RAND_priv_bytes. To right function don't remove libcrypto dll.

Metods implemented in winAPIprng are use there also.

Time of executions is litle bit longer than win api.

Results are available in Ossl_rng.txt

!!ALWAYS CHECK OUTPUT IN TERMINAL!!

REFERENCIES

AMD RNG API Libraries + examples

--> https://developer.amd.com/amd-aocl/rng-library/

WIN API Documentations:

Deprecated

CryptGenRandom()    --> https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptgenrandom
RtlGenRandom()      --> https://docs.microsoft.com/en-us/windows/win32/api/ntsecapi/nf-ntsecapi-rtlgenrandom

Currently supported:

BCryptGenRandom()   --> https://docs.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgenrandom
rand_s()            --> https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/rand-s?view=msvc-160

MEASURMENT FUNCTIONS:

--> https://github.com/newhopecrypto/newhope/tree/master/ref

WINLIBS GCC

--> http://winlibs.com/

OPENSSL LIBRARIES --> https://curl.se/windows/

(See specification--> OpenSSL )