diff --git a/Olive.Random.BSDRandom.pas b/Olive.Random.BSDRandom.pas
new file mode 100644
index 0000000..d8f1251
--- /dev/null
+++ b/Olive.Random.BSDRandom.pas
@@ -0,0 +1,107 @@
+{********************************************************}
+{ }
+{ Olive BBS }
+{ }
+{ Copyleft (ↄ) 2020 Olive BBS }
+{ }
+{ This file is part of Olive BBS }
+{ }
+{ Olive BBS is free software: you can redistribute it }
+{ and/or modify it under the terms of the GNU General }
+{ Public License as published by the Free Software }
+{ Foundation, either version 3 of the License, or }
+{ (at your option) any later version. }
+{ }
+{ Olive BBS is distributed in the hope that it will }
+{ be useful, but WITHOUT ANY WARRANTY; without even }
+{ the implied warranty of MERCHANTABILITY or FITNESS }
+{ FOR A PARTICULAR PURPOSE. See the GNU General }
+{ Public License for more details. }
+{ }
+{ You should have received a copy of the GNU General }
+{ Public License along with Olive BBS. If not, see }
+{ . }
+{ }
+{********************************************************}
+{ ___ ___ ___ }
+{ ( ).-. ( ) ( ) }
+{ .--. | |( __)___ ___ .--. | |.-. | |.-. .--. }
+{ / \| |(''"( )( / \| / \| / \ / _ \ }
+{ | .-. | | | | | | | | .-. | .-. | .-. |. .' `. ; }
+{ | | | | | | | | | | | | | | | | | | | || ' | | }
+{ | | | | | | | | | | | |/ | | | | | | |_\_`.(___) }
+{ | | | | | | | | | | | ' _.| | | | | | ( ). '. }
+{ | ' | | | | | ' ' ; | .'.-| ' | | ' | || | `\ | }
+{ ' `-' | | | | \ `' /' `-' ' `-' ;' `-' ; ; '._,' ' }
+{ `.__.(___(___) '_.' `.__.' `.__. `.__. '.___.' }
+{ }
+{********************************************************}
+
+{$mode objfpc}{$H+}
+Unit Olive.Random.BSDRandom;
+
+interface
+
+uses
+ CTypes,
+ Objects,
+ Classes,
+ SysUtils,
+ Olive.Random.RandomInterface,
+ Olive.Random.URandom;
+
+type
+ PCChar = ^CChar;
+ PBSDRandom = ^BSDRandom;
+ BSDRandom = class (RandomTrait, RandomInterface)
+ private
+ function GetSystemBytes(var RandomByteBuffer : TBytes; NBytes : SizeUint) : CInt;
+ public
+ function GetBytes(NBytes : SizeUInt) : TBytes;
+ function GetString(NBytes : SizeUInt) : AnsiString;
+ end;
+
+procedure arc4random_buf(var Buffer; NBytes : csize_t);
+ cdecl;external 'c' name 'arc4random_buf';
+
+implementation
+
+function BSDRandom.GetSystemBytes(var RandomByteBuffer : TBytes; NBytes : SizeUint) : CInt;
+var
+ CharBuffer : array of pcuint8;
+begin
+ SetLength(CharBuffer, NBytes);
+ arc4random_buf(CharBuffer[0], NBytes);
+ if Length(CharBuffer) <> NBytes then
+ begin
+ RandomByteBuffer[0] := 0;
+ Result := -1;
+ end else
+ begin
+ Move(CharBuffer[Low(CharBuffer)], RandomByteBuffer[0], NBytes);
+ Result := High(RandomByteBuffer);
+ end;
+end;
+
+function BSDRandom.GetBytes(NBytes : SizeUInt) : TBytes;
+var
+ RandomBuffer : AnsiString;
+begin
+ SetLength(RandomBuffer, NBytes);
+ SetLength(Result, NBytes);
+ RandomBuffer := GetString(NBytes);
+ Move(RandomBuffer[1], Result[0], NBytes);
+end;
+
+function BSDRandom.GetString(NBytes : SizeUInt) : AnsiString;
+var
+ RandomBuffer : TBytes;
+ B : SizeInt;
+begin
+ SetLength(RandomBuffer, (NBytes*2));
+ SetLength(Result, NBytes);
+ B := GetSystemBytes(RandomBuffer, (NBytes*2));
+ Move(RandomBuffer[0], Result[1], NBytes);
+end;
+
+end.
diff --git a/Olive.Random.Generic.pas b/Olive.Random.Generic.pas
new file mode 100644
index 0000000..80273b6
--- /dev/null
+++ b/Olive.Random.Generic.pas
@@ -0,0 +1,81 @@
+{********************************************************}
+{ }
+{ Olive BBS }
+{ }
+{ Copyleft (ↄ) 2020 Olive BBS }
+{ }
+{ This file is part of Olive BBS }
+{ }
+{ Olive BBS is free software: you can redistribute it }
+{ and/or modify it under the terms of the GNU General }
+{ Public License as published by the Free Software }
+{ Foundation, either version 3 of the License, or }
+{ (at your option) any later version. }
+{ }
+{ Olive BBS is distributed in the hope that it will }
+{ be useful, but WITHOUT ANY WARRANTY; without even }
+{ the implied warranty of MERCHANTABILITY or FITNESS }
+{ FOR A PARTICULAR PURPOSE. See the GNU General }
+{ Public License for more details. }
+{ }
+{ You should have received a copy of the GNU General }
+{ Public License along with Olive BBS. If not, see }
+{ . }
+{ }
+{********************************************************}
+{ ___ ___ ___ }
+{ ( ).-. ( ) ( ) }
+{ .--. | |( __)___ ___ .--. | |.-. | |.-. .--. }
+{ / \| |(''"( )( / \| / \| / \ / _ \ }
+{ | .-. | | | | | | | | .-. | .-. | .-. |. .' `. ; }
+{ | | | | | | | | | | | | | | | | | | | || ' | | }
+{ | | | | | | | | | | | |/ | | | | | | |_\_`.(___) }
+{ | | | | | | | | | | | ' _.| | | | | | ( ). '. }
+{ | ' | | | | | ' ' ; | .'.-| ' | | ' | || | `\ | }
+{ ' `-' | | | | \ `' /' `-' ' `-' ;' `-' ; ; '._,' ' }
+{ `.__.(___(___) '_.' `.__.' `.__. `.__. '.___.' }
+{ }
+{********************************************************}
+
+{$mode objfpc}{$H+}
+Unit Olive.Random.Generic;
+
+interface
+
+uses
+ Objects,
+ Classes,
+ SysUtils,
+ Olive.Random.RandomInterface;
+
+type
+ PRandomGeneric = ^RandomGeneric;
+ RandomGeneric = class (RandomTrait, RandomInterface)
+ public
+ function GetBytes(NBytes : SizeUInt) : TBytes;
+ function GetString(NBytes : SizeUInt) : AnsiString;
+ end;
+
+implementation
+
+
+function RandomGeneric.GetBytes(NBytes : SizeUInt) : TBytes;
+var
+ RandomBuffer : AnsiString;
+begin
+ SetLength(Result, NBytes);
+ RandomBuffer := GetString(NBytes);
+ Move(RandomBuffer[1], Result[0], NBytes);
+end;
+
+function RandomGeneric.GetString(NBytes : SizeUInt) : AnsiString;
+var
+ ByteBuffer : TBytes;
+begin
+ SetLength(Result, NBytes);
+ SetLength(ByteBuffer, (NBytes*2));
+ ByteBuffer := MTRandomBytes((NBytes*2));
+ Move(ByteBuffer[0], Result[1], NBytes);
+end;
+
+end.
diff --git a/Renegade.Random.LinuxRandom.pas b/Olive.Random.LinuxRandom.pas
similarity index 52%
rename from Renegade.Random.LinuxRandom.pas
rename to Olive.Random.LinuxRandom.pas
index 949afea..5e9c5a3 100644
--- a/Renegade.Random.LinuxRandom.pas
+++ b/Olive.Random.LinuxRandom.pas
@@ -1,40 +1,44 @@
-{*******************************************************}
-{ }
-{ Renegade BBS }
-{ }
-{ Copyright (c) 1990-2013 The Renegade Dev Team }
-{ Copyleft (ↄ) 2016 Renegade BBS }
-{ }
-{ This file is part of Renegade BBS }
-{ }
-{ Renegade is free software: you can redistribute it }
-{ and/or modify it under the terms of the GNU General }
-{ Public License as published by the Free Software }
-{ Foundation, either version 3 of the License, or }
-{ (at your option) any later version. }
-{ }
-{ Renegade is distributed in the hope that it will be }
-{ useful, but WITHOUT ANY WARRANTY; without even the }
-{ implied warranty of MERCHANTABILITY or FITNESS FOR }
-{ A PARTICULAR PURPOSE. See the GNU General Public }
-{ License for more details. }
-{ }
-{ You should have received a copy of the GNU General }
-{ Public License along with Renegade. If not, see }
-{ . }
-{ }
-{*******************************************************}
-{ _______ __ }
-{ | _ .-----.-----.-----.-----.---.-.--| .-----. }
-{ |. l | -__| | -__| _ | _ | _ | -__| }
-{ |. _ |_____|__|__|_____|___ |___._|_____|_____| }
-{ |: | | |_____| }
-{ |::.|:. | }
-{ `--- ---' }
-{*******************************************************}
+{********************************************************}
+{ }
+{ Olive BBS }
+{ }
+{ Copyleft (ↄ) 2020 Olive BBS }
+{ }
+{ This file is part of Olive BBS }
+{ }
+{ Olive BBS is free software: you can redistribute it }
+{ and/or modify it under the terms of the GNU General }
+{ Public License as published by the Free Software }
+{ Foundation, either version 3 of the License, or }
+{ (at your option) any later version. }
+{ }
+{ Olive BBS is distributed in the hope that it will }
+{ be useful, but WITHOUT ANY WARRANTY; without even }
+{ the implied warranty of MERCHANTABILITY or FITNESS }
+{ FOR A PARTICULAR PURPOSE. See the GNU General }
+{ Public License for more details. }
+{ }
+{ You should have received a copy of the GNU General }
+{ Public License along with Olive BBS. If not, see }
+{ . }
+{ }
+{********************************************************}
+{ ___ ___ ___ }
+{ ( ).-. ( ) ( ) }
+{ .--. | |( __)___ ___ .--. | |.-. | |.-. .--. }
+{ / \| |(''"( )( / \| / \| / \ / _ \ }
+{ | .-. | | | | | | | | .-. | .-. | .-. |. .' `. ; }
+{ | | | | | | | | | | | | | | | | | | | || ' | | }
+{ | | | | | | | | | | | |/ | | | | | | |_\_`.(___) }
+{ | | | | | | | | | | | ' _.| | | | | | ( ). '. }
+{ | ' | | | | | ' ' ; | .'.-| ' | | ' | || | `\ | }
+{ ' `-' | | | | \ `' /' `-' ' `-' ;' `-' ; ; '._,' ' }
+{ `.__.(___(___) '_.' `.__.' `.__. `.__. '.___.' }
+{ }
+{********************************************************}
{$mode objfpc}{$H+}
-Unit Renegade.Random.LinuxRandom;
+Unit Olive.Random.LinuxRandom;
interface
@@ -43,7 +47,7 @@ uses
Objects,
Classes,
SysUtils,
- Renegade.Random.RandomInterface;
+ Olive.Random.RandomInterface;
const
{$IF DEFINED(CPU64)} SYS_getrandom = 318;
diff --git a/Olive.Random.RandomInterface.pas b/Olive.Random.RandomInterface.pas
new file mode 100644
index 0000000..af2464f
--- /dev/null
+++ b/Olive.Random.RandomInterface.pas
@@ -0,0 +1,90 @@
+{********************************************************}
+{ }
+{ Olive BBS }
+{ }
+{ Copyleft (ↄ) 2020 Olive BBS }
+{ }
+{ This file is part of Olive BBS }
+{ }
+{ Olive BBS is free software: you can redistribute it }
+{ and/or modify it under the terms of the GNU General }
+{ Public License as published by the Free Software }
+{ Foundation, either version 3 of the License, or }
+{ (at your option) any later version. }
+{ }
+{ Olive BBS is distributed in the hope that it will }
+{ be useful, but WITHOUT ANY WARRANTY; without even }
+{ the implied warranty of MERCHANTABILITY or FITNESS }
+{ FOR A PARTICULAR PURPOSE. See the GNU General }
+{ Public License for more details. }
+{ }
+{ You should have received a copy of the GNU General }
+{ Public License along with Olive BBS. If not, see }
+{ . }
+{ }
+{********************************************************}
+{ ___ ___ ___ }
+{ ( ).-. ( ) ( ) }
+{ .--. | |( __)___ ___ .--. | |.-. | |.-. .--. }
+{ / \| |(''"( )( / \| / \| / \ / _ \ }
+{ | .-. | | | | | | | | .-. | .-. | .-. |. .' `. ; }
+{ | | | | | | | | | | | | | | | | | | | || ' | | }
+{ | | | | | | | | | | | |/ | | | | | | |_\_`.(___) }
+{ | | | | | | | | | | | ' _.| | | | | | ( ). '. }
+{ | ' | | | | | ' ' ; | .'.-| ' | | ' | || | `\ | }
+{ ' `-' | | | | \ `' /' `-' ' `-' ;' `-' ; ; '._,' ' }
+{ `.__.(___(___) '_.' `.__.' `.__. `.__. '.___.' }
+{ }
+{********************************************************}
+
+{$mode objfpc}{$H+}
+{$interfaces corba}
+{$codepage UTF8}
+Unit Olive.Random.RandomInterface;
+
+interface
+
+uses
+ Classes,
+ SysUtils;
+
+type
+ RandomInterface = interface
+ ['{0750E585-C1D2-4C1F-A8A4-4EDC41847396}']
+ function GetBytes(NBytes : SizeUInt) : TBytes;
+ function GetString(NBytes : SizeUInt) : AnsiString;
+ end;
+
+ RandomTrait = class (TObject)
+ public
+ constructor Create;
+ destructor Destroy; override;
+ function MTRandomBytes(NBytes : SizeUInt) : TBytes; virtual;
+ end;
+
+implementation
+
+constructor RandomTrait.Create;
+begin
+ inherited Create;
+end;
+
+destructor RandomTrait.Destroy;
+begin
+ inherited Destroy;
+end;
+
+function RandomTrait.MTRandomBytes(NBytes : SizeUInt) : TBytes;
+var
+ i : SizeUint;
+begin
+ Randomize;
+ SetLength(Result, (NBytes*2));
+ for i := 0 to (NBytes*2) do
+ begin
+ Result[i] := Random(MaxInt) mod 256;
+ end;
+ SetLength(Result, NBytes);
+end;
+
+end.
diff --git a/Renegade.Random.URandom.pas b/Olive.Random.URandom.pas
similarity index 51%
rename from Renegade.Random.URandom.pas
rename to Olive.Random.URandom.pas
index bc55c17..c6db58b 100644
--- a/Renegade.Random.URandom.pas
+++ b/Olive.Random.URandom.pas
@@ -1,40 +1,44 @@
-{*******************************************************}
-{ }
-{ Renegade BBS }
-{ }
-{ Copyright (c) 1990-2013 The Renegade Dev Team }
-{ Copyleft (ↄ) 2016 Renegade BBS }
-{ }
-{ This file is part of Renegade BBS }
-{ }
-{ Renegade is free software: you can redistribute it }
-{ and/or modify it under the terms of the GNU General }
-{ Public License as published by the Free Software }
-{ Foundation, either version 3 of the License, or }
-{ (at your option) any later version. }
-{ }
-{ Renegade is distributed in the hope that it will be }
-{ useful, but WITHOUT ANY WARRANTY; without even the }
-{ implied warranty of MERCHANTABILITY or FITNESS FOR }
-{ A PARTICULAR PURPOSE. See the GNU General Public }
-{ License for more details. }
-{ }
-{ You should have received a copy of the GNU General }
-{ Public License along with Renegade. If not, see }
-{ . }
-{ }
-{*******************************************************}
-{ _______ __ }
-{ | _ .-----.-----.-----.-----.---.-.--| .-----. }
-{ |. l | -__| | -__| _ | _ | _ | -__| }
-{ |. _ |_____|__|__|_____|___ |___._|_____|_____| }
-{ |: | | |_____| }
-{ |::.|:. | }
-{ `--- ---' }
-{*******************************************************}
+{********************************************************}
+{ }
+{ Olive BBS }
+{ }
+{ Copyleft (ↄ) 2020 Olive BBS }
+{ }
+{ This file is part of Olive BBS }
+{ }
+{ Olive BBS is free software: you can redistribute it }
+{ and/or modify it under the terms of the GNU General }
+{ Public License as published by the Free Software }
+{ Foundation, either version 3 of the License, or }
+{ (at your option) any later version. }
+{ }
+{ Olive BBS is distributed in the hope that it will }
+{ be useful, but WITHOUT ANY WARRANTY; without even }
+{ the implied warranty of MERCHANTABILITY or FITNESS }
+{ FOR A PARTICULAR PURPOSE. See the GNU General }
+{ Public License for more details. }
+{ }
+{ You should have received a copy of the GNU General }
+{ Public License along with Olive BBS. If not, see }
+{ . }
+{ }
+{********************************************************}
+{ ___ ___ ___ }
+{ ( ).-. ( ) ( ) }
+{ .--. | |( __)___ ___ .--. | |.-. | |.-. .--. }
+{ / \| |(''"( )( / \| / \| / \ / _ \ }
+{ | .-. | | | | | | | | .-. | .-. | .-. |. .' `. ; }
+{ | | | | | | | | | | | | | | | | | | | || ' | | }
+{ | | | | | | | | | | | |/ | | | | | | |_\_`.(___) }
+{ | | | | | | | | | | | ' _.| | | | | | ( ). '. }
+{ | ' | | | | | ' ' ; | .'.-| ' | | ' | || | `\ | }
+{ ' `-' | | | | \ `' /' `-' ' `-' ;' `-' ; ; '._,' ' }
+{ `.__.(___(___) '_.' `.__.' `.__. `.__. '.___.' }
+{ }
+{********************************************************}
{$mode objfpc}{$H+}
-Unit Renegade.Random.URandom;
+Unit Olive.Random.URandom;
interface
@@ -43,7 +47,7 @@ uses
Objects,
Classes,
SysUtils,
- Renegade.Random.RandomInterface;
+ Olive.Random.RandomInterface;
const
{$IF DEFINED(CPU64)} SYS_getrandom = 318;
diff --git a/Olive.Random.WinRandom.pas b/Olive.Random.WinRandom.pas
new file mode 100644
index 0000000..6919167
--- /dev/null
+++ b/Olive.Random.WinRandom.pas
@@ -0,0 +1,123 @@
+{********************************************************}
+{ }
+{ Olive BBS }
+{ }
+{ Copyleft (ↄ) 2020 Olive BBS }
+{ }
+{ This file is part of Olive BBS }
+{ }
+{ Olive BBS is free software: you can redistribute it }
+{ and/or modify it under the terms of the GNU General }
+{ Public License as published by the Free Software }
+{ Foundation, either version 3 of the License, or }
+{ (at your option) any later version. }
+{ }
+{ Olive BBS is distributed in the hope that it will }
+{ be useful, but WITHOUT ANY WARRANTY; without even }
+{ the implied warranty of MERCHANTABILITY or FITNESS }
+{ FOR A PARTICULAR PURPOSE. See the GNU General }
+{ Public License for more details. }
+{ }
+{ You should have received a copy of the GNU General }
+{ Public License along with Olive BBS. If not, see }
+{ . }
+{ }
+{********************************************************}
+{ ___ ___ ___ }
+{ ( ).-. ( ) ( ) }
+{ .--. | |( __)___ ___ .--. | |.-. | |.-. .--. }
+{ / \| |(''"( )( / \| / \| / \ / _ \ }
+{ | .-. | | | | | | | | .-. | .-. | .-. |. .' `. ; }
+{ | | | | | | | | | | | | | | | | | | | || ' | | }
+{ | | | | | | | | | | | |/ | | | | | | |_\_`.(___) }
+{ | | | | | | | | | | | ' _.| | | | | | ( ). '. }
+{ | ' | | | | | ' ' ; | .'.-| ' | | ' | || | `\ | }
+{ ' `-' | | | | \ `' /' `-' ' `-' ;' `-' ; ; '._,' ' }
+{ `.__.(___(___) '_.' `.__.' `.__. `.__. '.___.' }
+{ }
+{********************************************************}
+
+{$mode objfpc}{$H+}
+Unit Olive.Random.WinRandom;
+
+interface
+
+uses
+ Objects,
+ Classes,
+ SysUtils,
+ Windows,
+ Olive.Random.RandomInterface;
+
+const
+ CRYPT_VERIFYCONTEXT = $F0000000;
+ CRYPT_MACHINE_KEYSET = 32;
+ PROV_RSA_FULL = 1;
+ CRYPT_NEWKEYSET = 8;
+
+
+type
+ HCRYPTPROV = ULONG_PTR;
+ PWinRandom = ^WinRandom;
+ WinRandom = class (RandomTrait, RandomInterface)
+ public
+ function GetBytes(NBytes : SizeUInt) : TBytes;
+ function GetString(NBytes : SizeUInt) : AnsiString;
+ end;
+
+ function CryptAcquireContextW(var phProv: HCRYPTPROV; pszContainer: LPCTSTR;
+ pszProvider: LPCTSTR; dwProvType: DWORD; dwFlags: DWORD): BOOL;stdcall; external 'advapi32' name 'CryptAcquireContextW';
+ function CryptGenRandom(hProv: HCRYPTPROV; dwLen: DWORD;
+ var pbBuffer: BYTE): BOOL; stdcall; external 'advapi32' name 'CryptGenRandom';
+
+implementation
+
+
+function WinRandom.GetBytes(NBytes : SizeUInt) : TBytes;
+var
+ RandomBuffer : AnsiString;
+begin
+ SetLength(Result, NBytes);
+ SetLength(RandomBuffer, NBytes);
+ RandomBuffer := GetString(NBytes);
+ Move(RandomBuffer[1], Result[0], NBytes);
+end;
+
+function WinRandom.GetString(NBytes : SizeUInt) : AnsiString;
+var
+ RandomBuffer : ^BYTE;
+ hCryptProv : ^ULONG_PTR;
+ WinCrypt : Boolean;
+ ReturnString : AnsiString;
+ i, Bytes : SizeInt;
+ ReturnBytes : TBytes;
+begin
+ GetMem(RandomBuffer, (NBytes * 2));
+ CryptAcquireContextW(hCryptProv^, nil, nil, PROV_RSA_FULL,
+ CRYPT_NEWKEYSET or CRYPT_MACHINE_KEYSET or CRYPT_VERIFYCONTEXT );
+ WinCrypt := CryptGenRandom(hCryptProv^, (NBytes * 2), RandomBuffer^);
+ SetLength(ReturnString, (NBytes*2));
+ if WinCrypt then
+ begin
+ for i := 1 to (NBytes*2) do
+ begin
+ ReturnString[i] := Chr(RandomBuffer[i]);
+ end;
+ end else
+ begin
+ SetLength(ReturnBytes, (NBytes*2));
+ ReturnBytes := MTRandomBytes((NBytes*2));
+ end;
+ SetLength(Result, NBytes);
+ FreeMem(RandomBuffer, (NBytes * 2));
+ if WinCrypt then
+ begin
+ Move(ReturnString[1], Result[1], NBytes);
+ end else
+ begin
+ Move(ReturnBytes[0], Result[1], NBytes);
+ end;
+
+end;
+
+end.
diff --git a/Olive.Random.pas b/Olive.Random.pas
new file mode 100644
index 0000000..d56805f
--- /dev/null
+++ b/Olive.Random.pas
@@ -0,0 +1,120 @@
+{********************************************************}
+{ }
+{ Olive BBS }
+{ }
+{ Copyleft (ↄ) 2020 Olive BBS }
+{ }
+{ This file is part of Olive BBS }
+{ }
+{ Olive BBS is free software: you can redistribute it }
+{ and/or modify it under the terms of the GNU General }
+{ Public License as published by the Free Software }
+{ Foundation, either version 3 of the License, or }
+{ (at your option) any later version. }
+{ }
+{ Olive BBS is distributed in the hope that it will }
+{ be useful, but WITHOUT ANY WARRANTY; without even }
+{ the implied warranty of MERCHANTABILITY or FITNESS }
+{ FOR A PARTICULAR PURPOSE. See the GNU General }
+{ Public License for more details. }
+{ }
+{ You should have received a copy of the GNU General }
+{ Public License along with Olive BBS. If not, see }
+{ . }
+{ }
+{********************************************************}
+{ ___ ___ ___ }
+{ ( ).-. ( ) ( ) }
+{ .--. | |( __)___ ___ .--. | |.-. | |.-. .--. }
+{ / \| |(''"( )( / \| / \| / \ / _ \ }
+{ | .-. | | | | | | | | .-. | .-. | .-. |. .' `. ; }
+{ | | | | | | | | | | | | | | | | | | | || ' | | }
+{ | | | | | | | | | | | |/ | | | | | | |_\_`.(___) }
+{ | | | | | | | | | | | ' _.| | | | | | ( ). '. }
+{ | ' | | | | | ' ' ; | .'.-| ' | | ' | || | `\ | }
+{ ' `-' | | | | \ `' /' `-' ' `-' ;' `-' ; ; '._,' ' }
+{ `.__.(___(___) '_.' `.__.' `.__. `.__. '.___.' }
+{ }
+{********************************************************}
+
+{$mode objfpc}{$H+}
+{$interfaces corba}
+Unit Olive.Random;
+
+interface
+
+uses
+ Objects,
+ Classes,
+ SysUtils,
+ Olive.Random.RandomInterface,
+{$IF DEFINED(LINUX)}
+ Olive.Random.LinuxRandom
+{$ELSEIF DEFINED(WINDOWS)}
+ Olive.Random.WinRandom
+{$ELSEIF DEFINED(BSD)}
+ Olive.Random.BSDRandom
+{$ELSE}
+ Olive.Random.Generic;
+{$ENDIF}
+ ;
+
+type
+ PRandom = ^TRandom;
+ TRandom = class (RandomTrait, RandomInterface)
+ private
+ FRandomGenerator : RandomInterface;
+ procedure SetRandomGenerator(GeneratorClass : RandomInterface);
+ public
+ constructor Init;
+ destructor Destroy; override;
+ procedure SetDefaultGenerator;
+ function GetBytes(NBytes : SizeUInt) : TBytes;
+ function GetString(NBytes : SizeUInt) : AnsiString;
+ property RandomGenerator : RandomInterface read FRandomGenerator write SetRandomGenerator;
+ end;
+
+implementation
+
+
+constructor TRandom.Init;
+begin
+ SetDefaultGenerator;
+end;
+
+destructor TRandom.Destroy;
+begin
+ inherited Destroy;
+end;
+
+procedure TRandom.SetRandomGenerator(GeneratorClass : RandomInterface);
+begin
+ FRandomGenerator := GeneratorClass;
+end;
+
+procedure TRandom.SetDefaultGenerator;
+begin
+ {$IF DEFINED(LINUX)}
+ FRandomGenerator := LinuxRandom.Create;
+ {$ELSEIF DEFINED(WINDOWS)}
+ FRandomGenerator := WinRandom.Create;
+ {$ELSEIF DEFINED(BSD)}
+ FRandomGenerator := BSDRandom.Create;
+ {$ELSE}
+ FRandomGenerator := RandomGeneric.Create;
+ {$ENDIF}
+end;
+
+function TRandom.GetBytes(NBytes : SizeUInt) : TBytes;
+begin
+ SetLength(Result, NBytes);
+ Result := FRandomGenerator.GetBytes(NBytes);
+end;
+function TRandom.GetString(NBytes : SizeUInt) : AnsiString;
+begin
+ SetLength(Result, NBytes);
+ Result := FRandomGenerator.GetString(NBytes);
+
+end;
+
+end.
diff --git a/Renegade.Random.BSDRandom.pas b/Renegade.Random.BSDRandom.pas
deleted file mode 100644
index 376ebf8..0000000
--- a/Renegade.Random.BSDRandom.pas
+++ /dev/null
@@ -1,104 +0,0 @@
-{*******************************************************}
-{ }
-{ Renegade BBS }
-{ }
-{ Copyright (c) 1990-2013 The Renegade Dev Team }
-{ Copyleft (ↄ) 2016 Renegade BBS }
-{ }
-{ This file is part of Renegade BBS }
-{ }
-{ Renegade is free software: you can redistribute it }
-{ and/or modify it under the terms of the GNU General }
-{ Public License as published by the Free Software }
-{ Foundation, either version 3 of the License, or }
-{ (at your option) any later version. }
-{ }
-{ Renegade is distributed in the hope that it will be }
-{ useful, but WITHOUT ANY WARRANTY; without even the }
-{ implied warranty of MERCHANTABILITY or FITNESS FOR }
-{ A PARTICULAR PURPOSE. See the GNU General Public }
-{ License for more details. }
-{ }
-{ You should have received a copy of the GNU General }
-{ Public License along with Renegade. If not, see }
-{ . }
-{ }
-{*******************************************************}
-{ _______ __ }
-{ | _ .-----.-----.-----.-----.---.-.--| .-----. }
-{ |. l | -__| | -__| _ | _ | _ | -__| }
-{ |. _ |_____|__|__|_____|___ |___._|_____|_____| }
-{ |: | | |_____| }
-{ |::.|:. | }
-{ `--- ---' }
-{*******************************************************}
-
-{ ???: Todo - use arc4random_buf }
-{$mode objfpc}{$H+}
-Unit Renegade.Random.BSDRandom;
-
-interface
-
-uses
- CTypes,
- Objects,
- Classes,
- SysUtils,
- Renegade.Random.RandomInterface,
- Renegade.Random.URandom;
-
-type
- PCChar = ^CChar;
- PBSDRandom = ^BSDRandom;
- BSDRandom = class (RandomTrait, RandomInterface)
- private
- function GetSystemBytes(var RandomByteBuffer : TBytes; NBytes : SizeUint) : CInt;
- public
- function GetBytes(NBytes : SizeUInt) : TBytes;
- function GetString(NBytes : SizeUInt) : AnsiString;
- end;
-
-procedure arc4random_buf(var Buffer; NBytes : csize_t);
- cdecl;external 'c' name 'arc4random_buf';
-
-implementation
-
-function BSDRandom.GetSystemBytes(var RandomByteBuffer : TBytes; NBytes : SizeUint) : CInt;
-var
- CharBuffer : array of pcuint8;
-begin
- SetLength(CharBuffer, NBytes);
- arc4random_buf(CharBuffer[0], NBytes);
- if Length(CharBuffer) <> NBytes then
- begin
- RandomByteBuffer[0] := 0;
- Result := -1;
- end else
- begin
- Move(CharBuffer[Low(CharBuffer)], RandomByteBuffer[0], NBytes);
- Result := High(RandomByteBuffer);
- end;
-end;
-
-function BSDRandom.GetBytes(NBytes : SizeUInt) : TBytes;
-var
- RandomBuffer : AnsiString;
-begin
- SetLength(RandomBuffer, NBytes);
- SetLength(Result, NBytes);
- RandomBuffer := GetString(NBytes);
- Move(RandomBuffer[1], Result[0], NBytes);
-end;
-
-function BSDRandom.GetString(NBytes : SizeUInt) : AnsiString;
-var
- RandomBuffer : TBytes;
- B : SizeInt;
-begin
- SetLength(RandomBuffer, (NBytes*2));
- SetLength(Result, NBytes);
- B := GetSystemBytes(RandomBuffer, (NBytes*2));
- Move(RandomBuffer[0], Result[1], NBytes);
-end;
-
-end.
diff --git a/Renegade.Random.Generic.pas b/Renegade.Random.Generic.pas
deleted file mode 100644
index 668d792..0000000
--- a/Renegade.Random.Generic.pas
+++ /dev/null
@@ -1,77 +0,0 @@
-{*******************************************************}
-{ }
-{ Renegade BBS }
-{ }
-{ Copyright (c) 1990-2013 The Renegade Dev Team }
-{ Copyleft (ↄ) 2016 Renegade BBS }
-{ }
-{ This file is part of Renegade BBS }
-{ }
-{ Renegade is free software: you can redistribute it }
-{ and/or modify it under the terms of the GNU General }
-{ Public License as published by the Free Software }
-{ Foundation, either version 3 of the License, or }
-{ (at your option) any later version. }
-{ }
-{ Renegade is distributed in the hope that it will be }
-{ useful, but WITHOUT ANY WARRANTY; without even the }
-{ implied warranty of MERCHANTABILITY or FITNESS FOR }
-{ A PARTICULAR PURPOSE. See the GNU General Public }
-{ License for more details. }
-{ }
-{ You should have received a copy of the GNU General }
-{ Public License along with Renegade. If not, see }
-{ . }
-{ }
-{*******************************************************}
-{ _______ __ }
-{ | _ .-----.-----.-----.-----.---.-.--| .-----. }
-{ |. l | -__| | -__| _ | _ | _ | -__| }
-{ |. _ |_____|__|__|_____|___ |___._|_____|_____| }
-{ |: | | |_____| }
-{ |::.|:. | }
-{ `--- ---' }
-{*******************************************************}
-
-{$mode objfpc}{$H+}
-Unit Renegade.Random.Generic;
-
-interface
-
-uses
- Objects,
- Classes,
- SysUtils,
- Renegade.Random.RandomInterface;
-
-type
- PRandomGeneric = ^RandomGeneric;
- RandomGeneric = class (RandomTrait, RandomInterface)
- public
- function GetBytes(NBytes : SizeUInt) : TBytes;
- function GetString(NBytes : SizeUInt) : AnsiString;
- end;
-
-implementation
-
-
-function RandomGeneric.GetBytes(NBytes : SizeUInt) : TBytes;
-var
- RandomBuffer : AnsiString;
-begin
- SetLength(Result, NBytes);
- RandomBuffer := GetString(NBytes);
- Move(RandomBuffer[1], Result[0], NBytes);
-end;
-
-function RandomGeneric.GetString(NBytes : SizeUInt) : AnsiString;
-var
- ByteBuffer : TBytes;
-begin
- SetLength(Result, NBytes);
- SetLength(ByteBuffer, (NBytes*2));
- ByteBuffer := MTRandomBytes((NBytes*2));
- Move(ByteBuffer[0], Result[1], NBytes);
-end;
-
-end.
diff --git a/Renegade.Random.RandomInterface.pas b/Renegade.Random.RandomInterface.pas
deleted file mode 100644
index a9d8a12..0000000
--- a/Renegade.Random.RandomInterface.pas
+++ /dev/null
@@ -1,86 +0,0 @@
-{*******************************************************}
-{ }
-{ Renegade BBS }
-{ }
-{ Copyright (c) 1990-2013 The Renegade Dev Team }
-{ Copyleft (ↄ) 2016 Renegade BBS }
-{ }
-{ This file is part of Renegade BBS }
-{ }
-{ Renegade is free software: you can redistribute it }
-{ and/or modify it under the terms of the GNU General }
-{ Public License as published by the Free Software }
-{ Foundation, either version 3 of the License, or }
-{ (at your option) any later version. }
-{ }
-{ Renegade is distributed in the hope that it will be }
-{ useful, but WITHOUT ANY WARRANTY; without even the }
-{ implied warranty of MERCHANTABILITY or FITNESS FOR }
-{ A PARTICULAR PURPOSE. See the GNU General Public }
-{ License for more details. }
-{ }
-{ You should have received a copy of the GNU General }
-{ Public License along with Renegade. If not, see }
-{ . }
-{ }
-{*******************************************************}
-{ _______ __ }
-{ | _ .-----.-----.-----.-----.---.-.--| .-----. }
-{ |. l | -__| | -__| _ | _ | _ | -__| }
-{ |. _ |_____|__|__|_____|___ |___._|_____|_____| }
-{ |: | | |_____| }
-{ |::.|:. | }
-{ `--- ---' }
-{*******************************************************}
-
-{$mode objfpc}{$H+}
-{$interfaces corba}
-{$codepage UTF8}
-Unit Renegade.Random.RandomInterface;
-
-interface
-
-uses
- Classes,
- SysUtils;
-
-type
- RandomInterface = interface
- ['{0750E585-C1D2-4C1F-A8A4-4EDC41847396}']
- function GetBytes(NBytes : SizeUInt) : TBytes;
- function GetString(NBytes : SizeUInt) : AnsiString;
- end;
-
- RandomTrait = class (TObject)
- public
- constructor Create;
- destructor Destroy; override;
- function MTRandomBytes(NBytes : SizeUInt) : TBytes; virtual;
- end;
-
-implementation
-
-constructor RandomTrait.Create;
-begin
- inherited Create;
-end;
-
-destructor RandomTrait.Destroy;
-begin
- inherited Destroy;
-end;
-
-function RandomTrait.MTRandomBytes(NBytes : SizeUInt) : TBytes;
-var
- i : SizeUint;
-begin
- Randomize;
- SetLength(Result, (NBytes*2));
- for i := 0 to (NBytes*2) do
- begin
- Result[i] := Random(MaxInt) mod 256;
- end;
- SetLength(Result, NBytes);
-end;
-
-end.
diff --git a/Renegade.Random.WinRandom.pas b/Renegade.Random.WinRandom.pas
deleted file mode 100644
index 54528b7..0000000
--- a/Renegade.Random.WinRandom.pas
+++ /dev/null
@@ -1,119 +0,0 @@
-{*******************************************************}
-{ }
-{ Renegade BBS }
-{ }
-{ Copyright (c) 1990-2013 The Renegade Dev Team }
-{ Copyleft (ↄ) 2016 Renegade BBS }
-{ }
-{ This file is part of Renegade BBS }
-{ }
-{ Renegade is free software: you can redistribute it }
-{ and/or modify it under the terms of the GNU General }
-{ Public License as published by the Free Software }
-{ Foundation, either version 3 of the License, or }
-{ (at your option) any later version. }
-{ }
-{ Renegade is distributed in the hope that it will be }
-{ useful, but WITHOUT ANY WARRANTY; without even the }
-{ implied warranty of MERCHANTABILITY or FITNESS FOR }
-{ A PARTICULAR PURPOSE. See the GNU General Public }
-{ License for more details. }
-{ }
-{ You should have received a copy of the GNU General }
-{ Public License along with Renegade. If not, see }
-{ . }
-{ }
-{*******************************************************}
-{ _______ __ }
-{ | _ .-----.-----.-----.-----.---.-.--| .-----. }
-{ |. l | -__| | -__| _ | _ | _ | -__| }
-{ |. _ |_____|__|__|_____|___ |___._|_____|_____| }
-{ |: | | |_____| }
-{ |::.|:. | }
-{ `--- ---' }
-{*******************************************************}
-
-{$mode objfpc}{$H+}
-Unit Renegade.Random.WinRandom;
-
-interface
-
-uses
- Objects,
- Classes,
- SysUtils,
- Windows,
- Renegade.Random.RandomInterface;
-
-const
- CRYPT_VERIFYCONTEXT = $F0000000;
- CRYPT_MACHINE_KEYSET = 32;
- PROV_RSA_FULL = 1;
- CRYPT_NEWKEYSET = 8;
-
-
-type
- HCRYPTPROV = ULONG_PTR;
- PWinRandom = ^WinRandom;
- WinRandom = class (RandomTrait, RandomInterface)
- public
- function GetBytes(NBytes : SizeUInt) : TBytes;
- function GetString(NBytes : SizeUInt) : AnsiString;
- end;
-
- function CryptAcquireContextW(var phProv: HCRYPTPROV; pszContainer: LPCTSTR;
- pszProvider: LPCTSTR; dwProvType: DWORD; dwFlags: DWORD): BOOL;stdcall; external 'advapi32' name 'CryptAcquireContextW';
- function CryptGenRandom(hProv: HCRYPTPROV; dwLen: DWORD;
- var pbBuffer: BYTE): BOOL; stdcall; external 'advapi32' name 'CryptGenRandom';
-
-implementation
-
-
-function WinRandom.GetBytes(NBytes : SizeUInt) : TBytes;
-var
- RandomBuffer : AnsiString;
-begin
- SetLength(Result, NBytes);
- SetLength(RandomBuffer, NBytes);
- RandomBuffer := GetString(NBytes);
- Move(RandomBuffer[1], Result[0], NBytes);
-end;
-
-function WinRandom.GetString(NBytes : SizeUInt) : AnsiString;
-var
- RandomBuffer : ^BYTE;
- hCryptProv : ^ULONG_PTR;
- WinCrypt : Boolean;
- ReturnString : AnsiString;
- i, Bytes : SizeInt;
- ReturnBytes : TBytes;
-begin
- GetMem(RandomBuffer, (NBytes * 2));
- CryptAcquireContextW(hCryptProv^, nil, nil, PROV_RSA_FULL,
- CRYPT_NEWKEYSET or CRYPT_MACHINE_KEYSET or CRYPT_VERIFYCONTEXT );
- WinCrypt := CryptGenRandom(hCryptProv^, (NBytes * 2), RandomBuffer^);
- SetLength(ReturnString, (NBytes*2));
- if WinCrypt then
- begin
- for i := 1 to (NBytes*2) do
- begin
- ReturnString[i] := Chr(RandomBuffer[i]);
- end;
- end else
- begin
- SetLength(ReturnBytes, (NBytes*2));
- ReturnBytes := MTRandomBytes((NBytes*2));
- end;
- SetLength(Result, NBytes);
- FreeMem(RandomBuffer, (NBytes * 2));
- if WinCrypt then
- begin
- Move(ReturnString[1], Result[1], NBytes);
- end else
- begin
- Move(ReturnBytes[0], Result[1], NBytes);
- end;
-
-end;
-
-end.
diff --git a/Renegade.Random.pas b/Renegade.Random.pas
deleted file mode 100644
index 74f19b2..0000000
--- a/Renegade.Random.pas
+++ /dev/null
@@ -1,116 +0,0 @@
-{*******************************************************}
-{ }
-{ Renegade BBS }
-{ }
-{ Copyright (c) 1990-2013 The Renegade Dev Team }
-{ Copyleft (ↄ) 2016 Renegade BBS }
-{ }
-{ This file is part of Renegade BBS }
-{ }
-{ Renegade is free software: you can redistribute it }
-{ and/or modify it under the terms of the GNU General }
-{ Public License as published by the Free Software }
-{ Foundation, either version 3 of the License, or }
-{ (at your option) any later version. }
-{ }
-{ Renegade is distributed in the hope that it will be }
-{ useful, but WITHOUT ANY WARRANTY; without even the }
-{ implied warranty of MERCHANTABILITY or FITNESS FOR }
-{ A PARTICULAR PURPOSE. See the GNU General Public }
-{ License for more details. }
-{ }
-{ You should have received a copy of the GNU General }
-{ Public License along with Renegade. If not, see }
-{ . }
-{ }
-{*******************************************************}
-{ _______ __ }
-{ | _ .-----.-----.-----.-----.---.-.--| .-----. }
-{ |. l | -__| | -__| _ | _ | _ | -__| }
-{ |. _ |_____|__|__|_____|___ |___._|_____|_____| }
-{ |: | | |_____| }
-{ |::.|:. | }
-{ `--- ---' }
-{*******************************************************}
-
-{$mode objfpc}{$H+}
-{$interfaces corba}
-Unit Renegade.Random;
-
-interface
-
-uses
- Objects,
- Classes,
- SysUtils,
- Renegade.Random.RandomInterface,
-{$IF DEFINED(LINUX)}
- Renegade.Random.LinuxRandom
-{$ELSEIF DEFINED(WINDOWS)}
- Renegade.Random.WinRandom
-{$ELSEIF DEFINED(BSD)}
- Renegade.Random.BSDRandom
-{$ELSE}
- Renegade.Random.Generic;
-{$ENDIF}
- ;
-
-type
- PRandom = ^TRandom;
- TRandom = class (RandomTrait, RandomInterface)
- private
- FRandomGenerator : RandomInterface;
- procedure SetRandomGenerator(GeneratorClass : RandomInterface);
- public
- constructor Init;
- destructor Destroy; override;
- procedure SetDefaultGenerator;
- function GetBytes(NBytes : SizeUInt) : TBytes;
- function GetString(NBytes : SizeUInt) : AnsiString;
- property RandomGenerator : RandomInterface read FRandomGenerator write SetRandomGenerator;
- end;
-
-implementation
-
-
-constructor TRandom.Init;
-begin
- SetDefaultGenerator;
-end;
-
-destructor TRandom.Destroy;
-begin
- inherited Destroy;
-end;
-
-procedure TRandom.SetRandomGenerator(GeneratorClass : RandomInterface);
-begin
- FRandomGenerator := GeneratorClass;
-end;
-
-procedure TRandom.SetDefaultGenerator;
-begin
- {$IF DEFINED(LINUX)}
- FRandomGenerator := LinuxRandom.Create;
- {$ELSEIF DEFINED(WINDOWS)}
- FRandomGenerator := WinRandom.Create;
- {$ELSEIF DEFINED(BSD)}
- FRandomGenerator := BSDRandom.Create;
- {$ELSE}
- FRandomGenerator := RandomGeneric.Create;
- {$ENDIF}
-end;
-
-function TRandom.GetBytes(NBytes : SizeUInt) : TBytes;
-begin
- SetLength(Result, NBytes);
- Result := FRandomGenerator.GetBytes(NBytes);
-end;
-function TRandom.GetString(NBytes : SizeUInt) : AnsiString;
-begin
- SetLength(Result, NBytes);
- Result := FRandomGenerator.GetString(NBytes);
-
-end;
-
-end.