* main.h, import.c (import_one): Optionally return the fingerprint of
[gnupg.git] / cipher / rndriscos.c
index 3aa16d5..5565e1f 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
  */
 
 #include <config.h>
 
 #ifdef USE_RNDRISCOS
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
 #include <string.h>
 #include <kernel.h>
 #include <swis.h>
 #include "util.h"
-#include "algorithms.h"
 
-static int init_device(void);
-
-#define CryptRandom_Byte 0x51980
-
-/****************
- * Used to load the CryptRandom module if it isn't already loaded
- */
-static int
-init_device(void)
-{
-    _kernel_swi_regs r;
-
-    /* Is CryptRandom already loaded? */
-    r.r[0] = 18;
-    r.r[1] = (int) "CryptRandom";
-    if (!_kernel_swi(OS_Module, &r, &r))
-        return 1;
-
-    /* Is it named CryptRand and inside GnuPG$Path? */
-    r.r[0] = 1;
-    r.r[1] = (int) "GnuPG:CryptRand";
-    if (!_kernel_swi(OS_Module, &r, &r))
-        return 1;
-
-    /* Is it named CryptRandom and inside GnuPG$Path? */
-    r.r[0] = 1;
-    r.r[1] = (int) "GnuPG:CryptRandom";
-    if (!_kernel_swi(OS_Module, &r, &r))
-        return 1;
-
-    /* Can't find CryptRandom in the default locations */
-    g10_log_fatal("Can't load module CryptRandom.\n");
-}
 
+static const char * const cryptrandom_path[] = {
+    "GnuPG:CryptRandom",
+    "GnuPG:CryptRand",
+    "System:310.Modules.CryptRandom",
+    "System:310.Modules.CryptRand",
+    "System:Modules.CryptRandom",
+    "System:Modules.CryptRand",
+    NULL
+};
 
 /****************
+ * Get the random bytes from module
  */
 int
 rndriscos_gather_random(void (*add)(const void*, size_t, int), int requester,
                        size_t length, int level)
 {
-    static int initialized = 0;
-    int n;
+    static int rndriscos_initialized = 0;
+    int n, nbytes;
     byte buffer[768];
-    _kernel_swi_regs r;
-    _kernel_oserror *e;
 
-    if (!initialized)
-        initialized = init_device();
+    if (!rndriscos_initialized)
+        rndriscos_initialized = riscos_load_module("CryptRandom",
+                                                   cryptrandom_path, 1);
 
     while (length) {
-        int nbytes = length < sizeof(buffer) ? length : sizeof(buffer);
+        nbytes = length < sizeof(buffer) ? length : sizeof(buffer);
 
-        for (n = 0; n < nbytes; n++) {
-            if (e = _kernel_swi(CryptRandom_Byte, &r, &r))
+        for (n = 0; n < nbytes; ++n)
+            if (_swix(CryptRandom_Byte, _OUT(0), &buffer[n]))
                 g10_log_fatal("CryptRandom module isn't working as expected!\n");
-            buffer[n] = (byte) r.r[0];
-        }
 
        (*add)(buffer, n, requester);
        length -= n;
     }
-    memset(buffer, 0, sizeof(buffer));
+    wipememory(buffer, sizeof(buffer)); /* burn the buffer */
 
     return 0; /* success */
 }