RandomRDRand.st
author Claus Gittinger <cg@exept.de>
Wed, 15 Feb 2017 21:43:59 +0100
changeset 4322 97661b0035ed
parent 3416 a71369580f84
child 4595 39b2f30679c0
permissions -rw-r--r--
#DOCUMENTATION by cg class: RandomRDRand added: #copyright
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4322
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
     1
"
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
     2
 COPYRIGHT (c) 2014 Claus Gittinger
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
     3
              All Rights Reserved
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
     4
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
     5
 This software is furnished under a license and may be used
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
     6
 only in accordance with the terms of that license and with the
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
     8
 be provided or otherwise made available to, or used by, any
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
     9
 other person.  No title to or ownership of the software is
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    10
 hereby transferred.
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    11
"
3405
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
4322
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    14
"{ NameSpace: Smalltalk }"
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    15
3405
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
Object subclass:#RandomRDRand
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	instanceVariableNames:'x y z c'
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	classVariableNames:''
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	poolDictionaries:''
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	category:'Magnitude-Numbers'
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!RandomRDRand class methodsFor:'documentation'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
4322
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    25
copyright
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    26
"
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    27
 COPYRIGHT (c) 2014 Claus Gittinger
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    28
              All Rights Reserved
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    29
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    30
 This software is furnished under a license and may be used
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    31
 only in accordance with the terms of that license and with the
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    32
 inclusion of the above copyright notice.   This software may not
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    33
 be provided or otherwise made available to, or used by, any
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    34
 other person.  No title to or ownership of the software is
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    35
 hereby transferred.
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    36
"
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    37
!
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
    38
3405
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
documentation
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
"
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    Warning: there have been discussions about the security of the intel rdgen instruction
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    and whether there are NSA backdoors built into it.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    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
    44
    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
    45
    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
    46
    entropy for the seed.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
    NO WARRANTY
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
    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
    51
    Before using, you should check via the isSupported query.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    RandomRDGen new nextInteger
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    [see also:]
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
        RandomGenerator - the default; uses the machine's /dev/random if available
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
        Random  - fast, but generates less quality random numbers
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
        RandomTT800 - another random generator
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
        RandomParkMiller - another random generator
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
        RandomMT19937 - another random generator
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
        RandomKISS - another random generator
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
        exept:libcrypt - a library containing more stuff based on hashes and cyphers
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    [author:]
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
        Claus Gittinger.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
"
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
!RandomRDRand class methodsFor:'instance creation'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
new
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
    self isSupported ifFalse:[ self error:'this generator needs a cpu with rdgen instruction' ].
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    ^ self basicNew 
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
        initialize
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
new:seed
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    "seed is actualy ignored"
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    self isSupported ifFalse:[ self error:'this generator needs a cpu with rdgen instruction' ].
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
    ^ self basicNew 
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
        initialize;
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
        seed:seed
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
! !
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
!RandomRDRand class methodsFor:'queries'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
isSupported
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    "true if this architecture supports hardware random numbers"
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    ^ OperatingSystem getCPUType = 'x86_64'
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
        and:[ (OperatingSystem getSystemInfo at:#extendedInstructions ifAbsent:#())
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
              includes:#aes ]
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
     self isSupported
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    "
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
! !
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
!RandomRDRand methodsFor:'initialization'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
initialize
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
seed:seed
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    "/ ignored
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
! !
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
!RandomRDRand methodsFor:'random numbers'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
nextBoolean
3416
a71369580f84 comments
Claus Gittinger <cg@exept.de>
parents: 3405
diff changeset
   112
    "generates a boolean random"
3405
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    ^ self nextInteger > 16r7FFFFFFF
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
nextInteger
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
    "generates the next integer in 0..FFFFFFFF.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
     Notice, it may raise an illegal instruction exception on some cpu chips,
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
     even though the cpuid instruction says that it is available"
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
    unsigned int r = 0;
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    int cf;
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    do {
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
#if defined(__i386__) && defined(__GNUC__) && (__GNUC__ >= 2)
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
        // Encoding of rdrand %eax
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
        asm(".byte 0x0F, 0xC7, 0xF0; adcl $0,%1" :
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
            "=a" (r), "=r" (cf) : "0" (r), "1" (cf) : "cc");
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
#else
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
# ifdef USE_DRAND32
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
        cf = _rdrand32_step(&r);
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
# else
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
        goto unsupported;
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
# endif
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
#endif
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
    } while (cf != 0);
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    RETURN (__MKUINT(r));
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
unsupported: ;
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
%}.
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
    self primitiveFailed:'unsupported on this architecture'
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
    "
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
     self new nextInteger
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    "
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
! !
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
!RandomRDRand class methodsFor:'documentation'!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
version
4322
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
   154
    ^ '$Header$'
3405
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
!
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
version_CVS
4322
97661b0035ed #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3416
diff changeset
   158
    ^ '$Header$'
3405
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
! !
84393adea27c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160