summaryrefslogtreecommitdiffabout
path: root/pwmanager/pwmanager/randomizer.cpp
Unidiff
Diffstat (limited to 'pwmanager/pwmanager/randomizer.cpp') (more/less context) (show whitespace changes)
-rw-r--r--pwmanager/pwmanager/randomizer.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/pwmanager/pwmanager/randomizer.cpp b/pwmanager/pwmanager/randomizer.cpp
new file mode 100644
index 0000000..e623f51
--- a/dev/null
+++ b/pwmanager/pwmanager/randomizer.cpp
@@ -0,0 +1,124 @@
1/***************************************************************************
2 * *
3 * copyright (C) 2003, 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. *
9 * *
10 ***************************************************************************/
11
12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 1.0.1 of pwmanager
15 * and was modified to run on embedded devices that run microkde
16 *
17 * $Id$
18 **************************************************************************/
19
20#include "randomizer.h"
21#include "pwmexception.h"
22
23#include <stdlib.h>
24#include <time.h>
25
26
27Randomizer * Randomizer::rndObj (0);
28
29Randomizer::Randomizer()
30{
31 // probe for random devices
32 rndDev = fopen("/dev/urandom", "r");
33 if (rndDev)
34 return;
35 rndDev = fopen("/dev/random", "r");
36 if (rndDev)
37 return;
38 // fall back to rand_r()
39 seed = time(0);
40}
41
42Randomizer::~Randomizer()
43{
44 if (rndDev) {
45 if (fclose(rndDev)) {
46 printWarn("failed closing the random-device!");
47 }
48 }
49}
50
51char Randomizer::genRndChar()
52{
53 if (rndDev) {
54 /* we have a rand-device-node */
55 return (getc(rndDev));
56 } else {
57 /* we don't have a random-device-node.
58 * so fall back to rand_r()
59 */
60 return (rand_r(&seed) % 0xFF);
61 }
62}
63
64int Randomizer::genRndInt()
65{
66 if(rndDev) {
67 int ret;
68 if (sizeof(int) == 4) {
69 (reinterpret_cast<char *>(&ret))[0] = getc(rndDev);
70 (reinterpret_cast<char *>(&ret))[1] = getc(rndDev);
71 (reinterpret_cast<char *>(&ret))[2] = getc(rndDev);
72 (reinterpret_cast<char *>(&ret))[3] = getc(rndDev);
73 } else if (sizeof(int) == 8) {
74 (reinterpret_cast<char *>(&ret))[0] = getc(rndDev);
75 (reinterpret_cast<char *>(&ret))[1] = getc(rndDev);
76 (reinterpret_cast<char *>(&ret))[2] = getc(rndDev);
77 (reinterpret_cast<char *>(&ret))[3] = getc(rndDev);
78 (reinterpret_cast<char *>(&ret))[4] = getc(rndDev);
79 (reinterpret_cast<char *>(&ret))[5] = getc(rndDev);
80 (reinterpret_cast<char *>(&ret))[6] = getc(rndDev);
81 (reinterpret_cast<char *>(&ret))[7] = getc(rndDev);
82 } else {
83 printWarn(string(__FILE__) + ":" + tostr(__LINE__)
84 + ": sizeof(int) != 4 && sizeof(int) != 8");
85 rndDev = 0;
86 seed = time(0);
87 return genRndInt();
88 }
89 return ret;
90 } else {
91 return rand_r(&seed);
92 }
93}
94
95unsigned int Randomizer::genRndUInt()
96{
97 if(rndDev) {
98 unsigned int ret;
99 if (sizeof(unsigned int) == 4) {
100 (reinterpret_cast<char *>(&ret))[0] = getc(rndDev);
101 (reinterpret_cast<char *>(&ret))[1] = getc(rndDev);
102 (reinterpret_cast<char *>(&ret))[2] = getc(rndDev);
103 (reinterpret_cast<char *>(&ret))[3] = getc(rndDev);
104 } else if (sizeof(unsigned int) == 8) {
105 (reinterpret_cast<char *>(&ret))[0] = getc(rndDev);
106 (reinterpret_cast<char *>(&ret))[1] = getc(rndDev);
107 (reinterpret_cast<char *>(&ret))[2] = getc(rndDev);
108 (reinterpret_cast<char *>(&ret))[3] = getc(rndDev);
109 (reinterpret_cast<char *>(&ret))[4] = getc(rndDev);
110 (reinterpret_cast<char *>(&ret))[5] = getc(rndDev);
111 (reinterpret_cast<char *>(&ret))[6] = getc(rndDev);
112 (reinterpret_cast<char *>(&ret))[7] = getc(rndDev);
113 } else {
114 printWarn(string(__FILE__) + ":" + tostr(__LINE__)
115 + ": sizeof(unsigned int) != 4 && sizeof(unsigned int) != 8");
116 rndDev = 0;
117 seed = time(0);
118 return genRndUInt();
119 }
120 return ret;
121 } else {
122 return static_cast<unsigned int>(rand_r(&seed));
123 }
124}