RandomRDRand.st
author Claus Gittinger <cg@exept.de>
Thu, 02 Oct 2014 17:17:58 +0200
changeset 3405 84393adea27c
child 3416 a71369580f84
permissions -rw-r--r--
initial checkin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3405
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
Object subclass:#RandomRDRand
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:'x y z c'
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:''
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	category:'Magnitude-Numbers'
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!RandomRDRand class methodsFor:'documentation'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
documentation
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
    Warning: there have been discussions about the security of the intel rdgen instruction
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
    and whether there are NSA backdoors built into it.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    Linus Torwalds refuses to use it for /dev/urandom in the linux kernel, for that very reason.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
    Be sure you know what you are doing, if you use this generator for sensitive cryptographic stuff.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
    We recommend using one of the libcrypt-based generators and use this only to get additional
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
    entropy for the seed.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
    NO WARRANTY
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
    This generator uses the rdgen random generator which is built into modern intel chips.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
    Before using, you should check via the isSupported query.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
    RandomRDGen new nextInteger
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
    [see also:]
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
        RandomGenerator - the default; uses the machine's /dev/random if available
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
        Random  - fast, but generates less quality random numbers
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
        RandomTT800 - another random generator
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
        RandomParkMiller - another random generator
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
        RandomMT19937 - another random generator
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
        RandomKISS - another random generator
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
        exept:libcrypt - a library containing more stuff based on hashes and cyphers
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
    [author:]
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
        Claus Gittinger.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
"
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
! !
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
!RandomRDRand class methodsFor:'instance creation'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
new
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    self isSupported ifFalse:[ self error:'this generator needs a cpu with rdgen instruction' ].
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    ^ self basicNew 
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
        initialize
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
new:seed
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
    "seed is actualy ignored"
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    self isSupported ifFalse:[ self error:'this generator needs a cpu with rdgen instruction' ].
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    ^ self basicNew 
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
        initialize;
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
        seed:seed
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
! !
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
!RandomRDRand class methodsFor:'queries'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
isSupported
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
    "true if this architecture supports hardware random numbers"
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    ^ OperatingSystem getCPUType = 'x86_64'
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
        and:[ (OperatingSystem getSystemInfo at:#extendedInstructions ifAbsent:#())
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
              includes:#aes ]
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
    "
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
     self isSupported
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    "
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
! !
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
!RandomRDRand methodsFor:'initialization'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
initialize
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
seed:seed
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
    "/ ignored
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
! !
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
!RandomRDRand methodsFor:'random numbers'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
nextBoolean
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    "generates the next integer in 0..FFFFFFFF"
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    ^ self nextInteger > 16r7FFFFFFF
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
nextInteger
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    "generates the next integer in 0..FFFFFFFF.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
     Notice, it may raise an illegal instruction exception on some cpu chips,
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
     even though the cpuid instruction says that it is available"
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
%{
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    unsigned int r = 0;
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    int cf;
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    do {
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
#if defined(__i386__) && defined(__GNUC__) && (__GNUC__ >= 2)
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
        // Encoding of rdrand %eax
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
        asm(".byte 0x0F, 0xC7, 0xF0; adcl $0,%1" :
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
            "=a" (r), "=r" (cf) : "0" (r), "1" (cf) : "cc");
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
#else
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
# ifdef USE_DRAND32
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
        cf = _rdrand32_step(&r);
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
# else
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
        goto unsupported;
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
# endif
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
#endif
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
    } while (cf != 0);
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    RETURN (__MKUINT(r));
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
unsupported: ;
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
%}.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    self primitiveFailed:'unsupported on this architecture'
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    "
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
     self new nextInteger
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
    "
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
! !
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
!RandomRDRand class methodsFor:'documentation'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
version
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    ^ '$Header: /cvs/stx/stx/libbasic2/RandomRDRand.st,v 1.1 2014-10-02 15:17:58 cg Exp $'
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
version_CVS
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
    ^ '$Header: /cvs/stx/stx/libbasic2/RandomRDRand.st,v 1.1 2014-10-02 15:17:58 cg Exp $'
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
! !
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133