Commit Graph

40 Commits

Author SHA1 Message Date
surtur 5b1c9ba71c
fortuna: make sleep_time vars constexpr 2022-01-20 08:00:16 +01:00
surtur 4c7e95e475
fortuna: add mtx_random_data 2022-01-20 07:55:21 +01:00
surtur a3f871a644
fortuna: move code into a try block 2022-01-20 06:06:07 +01:00
surtur 4f28612f3f
fortuna: add const and casts where appropriate 2022-01-20 05:58:36 +01:00
surtur 422eb6fd8d
fortuna(SFM service): assert '_p_pools' ptrs equal 2022-01-20 01:53:38 +01:00
surtur 7db896bcc0
Fortuna: add urandom_entropy_src_service() m. func
* implement a background service for the UrandomEntropySrc that is run
  every 50ms in an endless loop in a dedicated thread "th_urandom"
* print time, progress and a simple counter (for now) to console
* protect event adder instantiation by acquiring a mutex in
  std::unique_lock
* check validity of _p_pools ptr
* hardcode entropy source id as 0
2022-01-17 09:35:17 +01:00
surtur d404681889
feat: "prepare to add proper entropy source" nits
general
* make greater use of "this"

Fortuna
* declare da_pools as a proper std::array of 32 Pool objects
* declare da_pools as const
* use std::shared_ptr _p_pools to access da_pools and share access to
  it
* reflect change of pools[] -> std::array in how the array elements
  are accessed, which is a) via _p_pools pointer and b) using ".at(i)"
  function
* pass _p_pools shared_ptr to Accumulator
* refactor member function names and variable names
* add member function attribute [[optimize_for_synchronized]]
* secure conversions with static_cast-s

Accumulator
* make use of _p_pools
* add _p_pools-related member functions
* add a static constexpr variable NUM_OF_POOLS

UrandomEntropySrc
* implement event adding logic using _p_pools
* make std::vector<char> non-static in urandom_entropy_src
* implement proper urandom entropy source event "sourcing" (from
  /dev/urandom), event adding, clear bytes array at the end
* properly convert using reinterpret_cast
* protect access to the main function with std::lock_guard
* receive EventAdderImpl as a ref
* use return value from "add_entropy()" member function and create
  sanity guard checking the return code "int ret"

EventAdder
* pass event (std::vector<char>) by const&

EventAdderImpl
* make use of _p_pools shared_ptr
* implement proper pool-rotating event-adding logic

Pool
* delete all copy constructors and assignment operator, the objects
  will not be copied or assigned to
* receive parameters by const& where possible/sensible
* handle concurrency:
  * declare std:string s as mutable
  * declare a rw std::mutex intended for writing and mutable
    std::recursive_mutex for read-only operations in const member
    functions
    ref: https://herbsutter.com/2013/05/24/gotw-6a-const-correctness-part-1-3/
    ref: https://arne-mertz.de/2017/10/mutable/
  * use std::lock_guard and std::unique_lock
* refactor "add_entropy()" member function
  * get rid of intermediate "event_str" and directly use the "event"
    std::vector<char> for all operations
  * add a lock guard to prevent multiple threads (should that route be
    taken) from modifying pool resources simultaneously
  * add all_ok bool for basic sanity checking
  * add print statements (at least for now)
* rename "get_s_length()" member function to "get_s_byte_count()" and
  repurpose it to return byte count of the stored entropy std::string s
2022-01-17 08:27:24 +01:00
surtur 7fca4481c8
generator: implement time_to_reseed() fun 2022-01-15 13:35:56 +01:00
surtur c0933d355d
fortuna: improve mtx handling, introduce accu_mtx 2022-01-14 08:52:51 +01:00
surtur e0448d6d08
fortuna,generator: better printing 2022-01-14 05:20:52 +01:00
surtur 6a2362be37
fortuna: ++(informative value of print messages) 2022-01-13 06:50:37 +01:00
surtur a0df93c9ec
clang-format: BinPack{Arguments,Parameters}: false 2022-01-13 06:04:18 +01:00
surtur 8c3aee1b07
fortuna: use a proper shared_ptr to Generator 2022-01-13 03:02:31 +01:00
surtur 643e7aabf6
fortuna: add basic joinability check 2022-01-12 03:41:24 +01:00
surtur 3553968d52
fortuna: add accumulator service,thread 2022-01-10 07:57:11 +01:00
surtur 1817b4a82e
fortuna: add print mutex, impl with unique_lock
* used for orderly printing to screen, currently only used by the two of
  the services: generator_service and seed_file_manager_service
* lock the mutex in a unique_lock only when printing to screen, unlock
  it immediately after printing is done
* use proper chrono type for sleep_time (instead of uint)
* also, generator_service is no longer a static method
2022-01-10 07:43:55 +01:00
surtur 4b216a6f6e
refactor: clang-format 2022-01-10 04:25:03 +01:00
surtur 795b9ffe54
add proper SeedFileManager implementation
a couple of fixes/necessary additions were made along the way, namely:
* add a default constructor for DoTask
* rework of the mutex/lock_guard/unique_lock logic in generator/fortuna
* add .fortuna.seed to the list of the ignored (.gitignore)
* add helper function to util for convertin bytes to blocks (16b==block)
* add a wrapper for around the SeedFileManager instance and a way to see
  if it's dead or alive (so that it can be restarted if needed)
* the timeout for saving of the seed file has been decreased to a more
  reasonable value than 10 minutes (I wouldn't want to lose potentially
  up to 10 minutes worth of entropy)
2022-01-09 11:58:38 +01:00
surtur 6e62e47d7b
chore(fortuna): std::mutex -> std::unique_lock 2022-01-06 00:50:28 +01:00
surtur 3d65cde727
fortuna: properly reindent file 2022-01-04 06:57:36 +01:00
surtur 06db22bfa4
fortuna: add seed_file_manager_service() [wip] 2022-01-04 06:44:30 +01:00
surtur c6695f4be3
generator service: refactor var names,types 2022-01-03 08:53:54 +01:00
surtur 3e4fb10414
fortuna: add generator service 2022-01-03 07:49:53 +01:00
surtur b5601acfbd
refactor: non-semantic cleanup 2021-12-29 03:55:01 +01:00
surtur 7eaaef2fdb
fortuna: handle reseeds+clear pools for seed
* actually clear out entropy of the pools before a reseed
* correctly prepare the seed for the reseed
* add a couple of helper methods to Pool that assist with getting
  length, retrieving and clearing of the collected entropy
* catch exceptions in main(), handle them gracefully
2021-12-13 05:11:17 +01:00
surtur 65c476dbd6
add Util class + perform general refactor
* rm duplicate do_sha() code, consolidate in Util
* make reseed() public so that it can be called from outside
* rm reseed() from do_crypto() where it has no place
2021-12-13 05:10:07 +01:00
surtur b55ca33e24
chore(fortuna): add random_data() checks, batch 1 2021-12-12 06:14:58 +01:00
surtur 2fbf5464a0
fortuna: erase -> clear 2021-12-11 01:20:34 +01:00
surtur 8b4cd4b6e8
fortuna(random_data): time-tracking precision++
using floats does wonders
2021-12-08 23:17:37 +01:00
surtur 0e3caebb6d
chore(fortuna): formatting
[skip ci]
2021-12-08 03:31:47 +01:00
surtur f02952d72a
fortuna(random_data): add basic time tracking 2021-12-07 15:55:29 +01:00
surtur 9f799c83a9
fortuna: add incr_reseed_ctr 2021-12-07 15:46:01 +01:00
surtur a1cbbb209e
handle PRNG state in R_state + accumulator basis
* handle the PRNG state with R_state nested class
* add a private property R holding PRNG state to Fortuna
* add R_state properties as defined in Cryptography Engineering:
  * a generator instance
  * a reseed counter
  * 32 pools that the collected entropy is to be distributed over

* add initial definition of the Pool object and its initialization

* attempt to initialize PRNG in Fortuna constructor. wrap the
  initialization call in a try-catch block like a cultured person
* erase the string used to print data from random_data() after it's been
  used
2021-12-04 00:40:39 +01:00
surtur 0c2a1c6744
finalise generator
commit a64b52e5a4
Author: surtur <a_mirre@utb.cz>
Date:   Sun Nov 21 23:39:30 2021 +0100

    finalise generator

    this commit adds a (nearly) complete implementation of the generator.

    * wrap calls to generator in a fortuna class method random_data
      * calls generator's method generate_random_data, that internally calls
        generate_blocks
    * use a proper 256bit key in G_state
    * add reseed method implementation
    * call a reseed in initialize_generator
    * do_sha returns proper digest now
    * add proper do_crypto implementation
      * call generate_blocks internally
      * handle re-keying
    * optimise header includes

    TODO: there are still many commented (enabled on demand) debugging statements
    -> TO BE REMOVED
2021-11-30 14:09:39 +01:00
surtur bcd33c2f33
chore: direct braced string initialization 2021-11-20 22:31:55 +01:00
surtur 444660bf89
feat(generator): add constructor/destructor
* initialize_generator() is now a private method
* call initialize_generator() inside the constructor of the Generator
* move full struct declaration to generator.h
* have a private field named G of type G_state
* remove explicit instantiation of Generator from fortuna constructor -
  Generator is a private field of fortuna
* remove direct initialize_generator() call from fortuna constructor
* remove get_state() calls as G_state G is now a private field
* refactor get_state() to simply return the *private field G_state G*
* refactor do_crypto() - I know, this should have been split to a
  separate commit - remove function parameters and useless assignments
  inside its body to reflect that once it accesses k and ctr (of the
  G_state G), it won't be necessary for them to be passed as parameters,
  since *G_state G is now a private field*...
2021-11-20 22:31:54 +01:00
surtur bd421295c4
feat: use fmt instead of iostreams
switch to fmt - "A modern formatting library" - for fun and profit,
currently in header-only configuration.

ref: https://github.com/fmtlib/fmt

closes #5
closes #4
2021-11-18 22:05:05 +01:00
surtur c82d3912f5
generator: add CTR-mode Serpent to random_data()
operate on a fixed string with randomly generated key and iv block on
each run.

this is neither finished nor correct implementation, it currently also
calls the Decryption routine to prove that it's working properly with
the input given ("Oh, I am fortune's fool!" seemed fitting for fortuna).
2021-11-15 23:37:04 +01:00
surtur 3f411f687e
chore: header-guard encompass files properly 2021-11-15 22:13:00 +01:00
surtur ea11801789
add fortuna class 2021-11-10 23:58:42 +01:00