diff --git a/lib/7.8/modules/Crypto.pmod/RSA.pike b/lib/7.8/modules/Crypto.pmod/RSA.pike
index 369cca8277f9ca6c7103a54359f1ab44d13ea7b6..f8d69db2817f62335266dbe1412d3aa6db476537 100644
--- a/lib/7.8/modules/Crypto.pmod/RSA.pike
+++ b/lib/7.8/modules/Crypto.pmod/RSA.pike
@@ -307,7 +307,7 @@ Gmp.mpz get_prime(int bits, function(int:string) r)
 this_program generate_key(int(128..) bits, function(int:string)|void r)
 {
   if (!r)
-    r = [function(int:string)]Crypto.Random.random_string;
+    r = Crypto.Random.random_string;
   if (bits < 128)
     error( "Ridiculously small key.\n" );
 
diff --git a/lib/modules/Crypto.pmod/Random.pmod b/lib/modules/Crypto.pmod/Random.pmod
index 8a3e29b2a21784dfffb035f7d8b2981b59a11a37..63eee76f0844be18c8f3ea0baae5903d0e945cef 100644
--- a/lib/modules/Crypto.pmod/Random.pmod
+++ b/lib/modules/Crypto.pmod/Random.pmod
@@ -36,7 +36,7 @@ protected class RND
     ::reseed(data);
   }
 
-  string(8bit) random_string(int(0..) len)
+  string(8bit) random_string(int len)
   {
     // The original Fortuna design has an entropy pool reseeding the
     // generator when enough external events have been collected, but
@@ -54,25 +54,25 @@ protected class RND
 }
 
 protected RND rnd_obj = RND();
-protected function(int(0..):string(8bit)) rnd_func = rnd_obj->random_string;
+protected function(int:string(8bit)) rnd_func = rnd_obj->random_string;
 
 //! Returns a string of length @[len] with random content. The content
 //! is generated by a Fortuna random generator that is updated with
 //! output from /dev/urandom on UNIX and CryptGenRandom on NT.
-string(8bit) random_string(int(0..) len) {
+string(8bit) random_string(int len) {
   return rnd_func(len);
 }
 
 __deprecated__ string(8bit) blocking_random_string(int len)
 {
-  return rnd_func([int(0..)]len);
+  return rnd_func(len);
 }
 
 //! Returns a @[Gmp.mpz] object with a random value between @expr{0@}
 //! and @[top]. Uses @[random_string].
-Gmp.mpz random(int(0..) top) {
-  return [object(Gmp.mpz)]( Gmp.mpz(rnd_func( (int(0..))ceil( log((float)top)/
-                                                              log(2.0) ) ),
+Gmp.mpz random(int top) {
+  return [object(Gmp.mpz)]( Gmp.mpz(rnd_func( (int)ceil( log((float)top)/
+                                                         log(2.0) ) ),
 				    256) % top);
 }
 
diff --git a/src/post_modules/Nettle/nettle.cmod b/src/post_modules/Nettle/nettle.cmod
index 3f29581857f59e8bafb9bb0613e59c47d0dac1af..3932edd3338b799e64f64bd8a24bececc8198a1b 100644
--- a/src/post_modules/Nettle/nettle.cmod
+++ b/src/post_modules/Nettle/nettle.cmod
@@ -355,10 +355,12 @@ PIKECLASS Fortuna
    *! bytes of random data per call, the necessary rekey operations
    *! are here performed internally, so no such restrictions apply.
    */
-  PIKEFUN string(8bit) random_string(int(0..) len)
+  PIKEFUN string(8bit) random_string(int len)
   {
     unsigned stored = 0;
     struct string_builder s;
+
+    if(len<0) Pike_error("Length has to be positive.\n");
     init_string_builder_alloc(&s, len+16, 0);
 
     while( stored < len )