1998-01-16 12:13:05 +00:00
|
|
|
/************************************************
|
|
|
|
|
|
|
|
md5init.c -
|
|
|
|
|
|
|
|
$Author$
|
|
|
|
created at: Fri Aug 2 09:24:12 JST 1996
|
|
|
|
|
2001-02-14 05:52:06 +00:00
|
|
|
Copyright (C) 1995-2001 Yukihiro Matsumoto
|
1998-01-16 12:13:05 +00:00
|
|
|
|
|
|
|
************************************************/
|
|
|
|
/* This module provides an interface to the RSA Data Security,
|
2001-03-26 08:57:16 +00:00
|
|
|
Inc. MD5 Message-Digest Algorithm, described in RFC 1321. */
|
1998-01-16 12:13:05 +00:00
|
|
|
|
|
|
|
#include "ruby.h"
|
|
|
|
#include "md5.h"
|
|
|
|
|
|
|
|
static VALUE cMD5;
|
|
|
|
|
|
|
|
static VALUE
|
2001-03-26 08:57:16 +00:00
|
|
|
md5i_update(obj, str)
|
|
|
|
VALUE obj, str;
|
1998-01-16 12:13:05 +00:00
|
|
|
{
|
2001-03-26 08:57:16 +00:00
|
|
|
md5_state_t *md5;
|
1998-01-16 12:13:05 +00:00
|
|
|
|
2001-05-02 04:22:21 +00:00
|
|
|
StringValue(str);
|
2001-03-26 08:57:16 +00:00
|
|
|
Data_Get_Struct(obj, md5_state_t, md5);
|
2001-05-02 04:22:21 +00:00
|
|
|
md5_append(md5, RSTRING(str)->ptr, RSTRING(str)->len);
|
1998-01-16 12:13:05 +00:00
|
|
|
|
1999-08-13 05:37:52 +00:00
|
|
|
return obj;
|
1998-01-16 12:13:05 +00:00
|
|
|
}
|
1999-08-13 05:37:52 +00:00
|
|
|
|
1998-01-16 12:13:05 +00:00
|
|
|
static VALUE
|
2001-03-26 08:57:16 +00:00
|
|
|
md5i_digest(obj)
|
1998-01-16 12:13:05 +00:00
|
|
|
VALUE obj;
|
|
|
|
{
|
2001-03-26 08:57:16 +00:00
|
|
|
md5_state_t *md5, ctx;
|
|
|
|
md5_byte_t digest[16];
|
1998-01-16 12:13:05 +00:00
|
|
|
|
2001-03-26 08:57:16 +00:00
|
|
|
Data_Get_Struct(obj, md5_state_t, md5);
|
1998-01-16 12:13:05 +00:00
|
|
|
ctx = *md5;
|
2001-03-26 08:57:16 +00:00
|
|
|
md5_finish(&ctx, digest);
|
1998-01-16 12:13:05 +00:00
|
|
|
|
1999-01-20 04:59:39 +00:00
|
|
|
return rb_str_new(digest, 16);
|
1998-01-16 12:13:05 +00:00
|
|
|
}
|
|
|
|
|
1999-08-13 05:37:52 +00:00
|
|
|
static VALUE
|
2001-03-26 08:57:16 +00:00
|
|
|
md5i_hexdigest(obj)
|
1999-08-13 05:37:52 +00:00
|
|
|
VALUE obj;
|
|
|
|
{
|
2001-03-26 08:57:16 +00:00
|
|
|
md5_state_t *md5, ctx;
|
|
|
|
md5_byte_t digest[16];
|
1999-08-13 05:37:52 +00:00
|
|
|
char buf[33];
|
|
|
|
int i;
|
|
|
|
|
2001-03-26 08:57:16 +00:00
|
|
|
Data_Get_Struct(obj, md5_state_t, md5);
|
1999-08-13 05:37:52 +00:00
|
|
|
ctx = *md5;
|
2001-03-26 08:57:16 +00:00
|
|
|
md5_finish(&ctx, digest);
|
1999-08-13 05:37:52 +00:00
|
|
|
|
|
|
|
for (i=0; i<16; i++) {
|
|
|
|
sprintf(buf+i*2, "%02x", digest[i]);
|
|
|
|
}
|
|
|
|
return rb_str_new(buf, 32);
|
|
|
|
}
|
|
|
|
|
1998-01-16 12:13:05 +00:00
|
|
|
static VALUE
|
2001-03-26 08:57:16 +00:00
|
|
|
md5i_clone(obj)
|
1998-01-16 12:13:05 +00:00
|
|
|
VALUE obj;
|
|
|
|
{
|
2001-03-26 08:57:16 +00:00
|
|
|
md5_state_t *md5, *md5_new;
|
1998-01-16 12:13:05 +00:00
|
|
|
|
2001-03-26 08:57:16 +00:00
|
|
|
Data_Get_Struct(obj, md5_state_t, md5);
|
|
|
|
obj = Data_Make_Struct(CLASS_OF(obj), md5_state_t, 0, free, md5_new);
|
1998-01-16 12:13:05 +00:00
|
|
|
*md5_new = *md5;
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
2001-03-26 08:57:16 +00:00
|
|
|
md5i_new(argc, argv, class)
|
1999-01-20 04:59:39 +00:00
|
|
|
int argc;
|
|
|
|
VALUE* argv;
|
|
|
|
VALUE class;
|
1998-01-16 12:13:05 +00:00
|
|
|
{
|
2001-05-02 04:22:21 +00:00
|
|
|
VALUE obj, str;
|
2001-03-26 08:57:16 +00:00
|
|
|
md5_state_t *md5;
|
1998-01-16 12:13:05 +00:00
|
|
|
|
2001-03-26 08:57:16 +00:00
|
|
|
obj = Data_Make_Struct(class, md5_state_t, 0, free, md5);
|
|
|
|
md5_init(md5);
|
2001-05-02 04:22:21 +00:00
|
|
|
rb_scan_args(argc, argv, "01", &str);
|
2001-03-26 08:57:16 +00:00
|
|
|
if (argc == 1) {
|
2001-05-02 04:22:21 +00:00
|
|
|
md5i_update(obj, str);
|
1998-01-16 12:13:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
1999-08-13 05:37:52 +00:00
|
|
|
void
|
1998-01-16 12:13:05 +00:00
|
|
|
Init_md5()
|
|
|
|
{
|
1999-01-20 04:59:39 +00:00
|
|
|
cMD5 = rb_define_class("MD5", rb_cObject);
|
1998-01-16 12:13:05 +00:00
|
|
|
|
2001-03-26 08:57:16 +00:00
|
|
|
rb_define_singleton_method(cMD5, "new", md5i_new, -1);
|
|
|
|
rb_define_singleton_method(cMD5, "md5", md5i_new, -1);
|
1998-01-16 12:13:05 +00:00
|
|
|
|
2001-03-26 08:57:16 +00:00
|
|
|
rb_define_method(cMD5, "update", md5i_update, 1);
|
2001-05-16 09:05:54 +00:00
|
|
|
rb_define_method(cMD5, "<<", md5i_update, 1);
|
2001-03-26 08:57:16 +00:00
|
|
|
rb_define_method(cMD5, "digest", md5i_digest, 0);
|
|
|
|
rb_define_method(cMD5, "hexdigest", md5i_hexdigest, 0);
|
|
|
|
rb_define_method(cMD5, "clone", md5i_clone, 0);
|
1998-01-16 12:13:05 +00:00
|
|
|
}
|