diff options
author | Michal Rokos <m.rokos@sh.cvut.cz> | 2001-11-16 11:20:13 +0000 |
---|---|---|
committer | Michal Rokos <m.rokos@sh.cvut.cz> | 2001-11-16 11:20:13 +0000 |
commit | 8903e757c052d3a99aada758bb628ec135360e60 (patch) | |
tree | 5f0e99803c1fc5c6909fd7d325d0f279265b97cf /ossl_rand.c | |
download | ruby-openssl-history-8903e757c052d3a99aada758bb628ec135360e60.tar.gz |
Initial revision
Diffstat (limited to 'ossl_rand.c')
-rw-r--r-- | ossl_rand.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/ossl_rand.c b/ossl_rand.c new file mode 100644 index 0000000..ed78111 --- /dev/null +++ b/ossl_rand.c @@ -0,0 +1,96 @@ +/* + * $Id$ + * 'OpenSSL for Ruby' project + * Copyright (C) 2001 Michal Rokos <m.rokos@sh.cvut.cz> + * All rights reserved. + */ +/* + * This program is licenced under the same licence as Ruby. + * (See the file 'LICENCE'.) + */ +#include "ossl.h" + +/* + * Classes + */ +VALUE cRandom; +VALUE eRandomError; + +/* + * Struct + */ + +/* + * public + */ + +/* + * private + */ +static VALUE ossl_rand_seed(VALUE self, VALUE str) +{ + Check_SafeStr(str); + RAND_seed(RSTRING(str)->ptr, RSTRING(str)->len); + return str; +} + +static VALUE ossl_rand_load_file(VALUE self, VALUE filename) +{ + Check_SafeStr(filename); + if(!RAND_load_file(RSTRING(filename)->ptr, -1)) { + rb_raise(rb_eIOError, "%s", ossl_error()); + } + + return Qtrue; +} + +static VALUE ossl_rand_write_file(VALUE self, VALUE filename) +{ + Check_SafeStr(filename); + if (RAND_write_file(RSTRING(filename)->ptr) == -1) { + rb_raise(rb_eIOError, "%s", ossl_error()); + } + + return Qtrue; +} + +static VALUE ossl_rand_bytes(VALUE self, VALUE len) +{ + unsigned char *buffer = NULL; + VALUE str; + + Check_Type(len, T_FIXNUM); + + if (!(buffer = OPENSSL_malloc(FIX2INT(len)+1))) { + rb_raise(eRandomError, "%s", ossl_error()); + } + + if (!RAND_bytes(buffer, FIX2INT(len))) { + rb_raise(eRandomError, "%s", ossl_error()); + } + + str = rb_str_new(buffer, FIX2INT(len)); + OPENSSL_free(buffer); + + return str; +} + +/* + * RAND init + */ +void Init_ossl_rand(VALUE mOSSL) +{ + rb_define_method(mOSSL, "seed", ossl_rand_seed, 1); + rb_define_method(mOSSL, "load_random_file", ossl_rand_load_file, 1); + rb_define_method(mOSSL, "write_random_file", ossl_rand_write_file, 1); + + eRandomError = rb_define_class_under(mOSSL, "RandomError", rb_eStandardError); + + cRandom = rb_define_class_under(mOSSL, "Random", rb_cObject); + rb_define_method(cRandom, "seed", ossl_rand_seed, 1); + rb_define_method(cRandom, "load_random_file", ossl_rand_load_file, 1); + rb_define_method(cRandom, "write_random_file", ossl_rand_write_file, 1); + rb_define_method(cRandom, "random_bytes", ossl_rand_bytes, 1); + +} + |