unit dev_rng;

{$mode ObjFPC}{$H+}
{$CALLING SysV_ABI_CDecl}

interface

uses
 sys_conf;

procedure rng_init();

implementation

uses
 errno,
 md_arc4random;

Function rng_ioctl(dev:p_cdev;cmd:QWORD;data:Pointer;fflag:Integer):Integer;
begin
 Result:=0;

 Writeln('rng_ioctl(0x',HexStr(cmd,8),')');

 case cmd of
  $40445301: //_get_genuine_random
            begin
             arc4rand(data+4,64,0);
             PInteger(data)^:=0;
            end;
  $40445302: //Fips186Prng
            begin
             arc4rand(data+4,64,0);
             PInteger(data)^:=0;
            end;
  else
   Result:=ENOIOCTL;
 end;

end;

const
 devw_rng:t_cdevsw=(
  d_version     :D_VERSION;
  d_flags       :0;
  d_name        :'rng';
  d_ioctl       :@rng_ioctl;
 );

procedure rng_init();
begin
 make_dev(@devw_rng,0,0,0,&444,'rng',[]);
end;

end.

