2
* $Id: ossl_ns_spki.c 11708 2007-02-12 23:01:19Z shyouhei $
3
* 'OpenSSL for Ruby' project
4
* Copyright (C) 2001-2002 Michal Rokos <m.rokos@sh.cvut.cz>
8
* This program is licenced under the same licence as Ruby.
9
* (See the file 'LICENCE'.)
13
#define WrapSPKI(klass, obj, spki) do { \
15
ossl_raise(rb_eRuntimeError, "SPKI wasn't initialized!"); \
17
obj = Data_Wrap_Struct(klass, 0, NETSCAPE_SPKI_free, spki); \
19
#define GetSPKI(obj, spki) do { \
20
Data_Get_Struct(obj, NETSCAPE_SPKI, spki); \
22
ossl_raise(rb_eRuntimeError, "SPKI wasn't initialized!"); \
41
ossl_spki_alloc(VALUE klass)
46
if (!(spki = NETSCAPE_SPKI_new())) {
47
ossl_raise(eSPKIError, NULL);
49
WrapSPKI(klass, obj, spki);
55
ossl_spki_initialize(int argc, VALUE *argv, VALUE self)
61
if (rb_scan_args(argc, argv, "01", &buffer) == 0) {
65
if (!(spki = NETSCAPE_SPKI_b64_decode(RSTRING(buffer)->ptr, -1))) {
66
p = RSTRING(buffer)->ptr;
67
if (!(spki = d2i_NETSCAPE_SPKI(NULL, &p, RSTRING(buffer)->len))) {
68
ossl_raise(eSPKIError, NULL);
71
NETSCAPE_SPKI_free(DATA_PTR(self));
72
DATA_PTR(self) = spki;
79
ossl_spki_to_der(VALUE self)
87
if ((len = i2d_NETSCAPE_SPKI(spki, NULL)) <= 0)
88
ossl_raise(eX509CertError, NULL);
89
str = rb_str_new(0, len);
90
p = RSTRING(str)->ptr;
91
if (i2d_NETSCAPE_SPKI(spki, &p) <= 0)
92
ossl_raise(eX509CertError, NULL);
93
ossl_str_adjust(str, p);
99
ossl_spki_to_pem(VALUE self)
106
if (!(data = NETSCAPE_SPKI_b64_encode(spki))) {
107
ossl_raise(eSPKIError, NULL);
109
str = ossl_buf2str(data, strlen(data));
115
ossl_spki_print(VALUE self)
123
if (!(out = BIO_new(BIO_s_mem()))) {
124
ossl_raise(eSPKIError, NULL);
126
if (!NETSCAPE_SPKI_print(out, spki)) {
128
ossl_raise(eSPKIError, NULL);
130
BIO_get_mem_ptr(out, &buf);
131
str = rb_str_new(buf->data, buf->length);
138
ossl_spki_get_public_key(VALUE self)
144
if (!(pkey = NETSCAPE_SPKI_get_pubkey(spki))) { /* adds an reference */
145
ossl_raise(eSPKIError, NULL);
148
return ossl_pkey_new(pkey); /* NO DUP - OK */
152
ossl_spki_set_public_key(VALUE self, VALUE key)
157
if (!NETSCAPE_SPKI_set_pubkey(spki, GetPKeyPtr(key))) { /* NO NEED TO DUP */
158
ossl_raise(eSPKIError, NULL);
165
ossl_spki_get_challenge(VALUE self)
170
if (spki->spkac->challenge->length <= 0) {
171
OSSL_Debug("Challenge.length <= 0?");
172
return rb_str_new(0, 0);
175
return rb_str_new(spki->spkac->challenge->data,
176
spki->spkac->challenge->length);
180
ossl_spki_set_challenge(VALUE self, VALUE str)
186
if (!ASN1_STRING_set(spki->spkac->challenge, RSTRING(str)->ptr,
187
RSTRING(str)->len)) {
188
ossl_raise(eSPKIError, NULL);
195
ossl_spki_sign(VALUE self, VALUE key, VALUE digest)
201
pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
202
md = GetDigestPtr(digest);
204
if (!NETSCAPE_SPKI_sign(spki, pkey, md)) {
205
ossl_raise(eSPKIError, NULL);
212
* Checks that cert signature is made with PRIVversion of this PUBLIC 'key'
215
ossl_spki_verify(VALUE self, VALUE key)
220
switch (NETSCAPE_SPKI_verify(spki, GetPKeyPtr(key))) { /* NO NEED TO DUP */
226
ossl_raise(eSPKIError, NULL);
228
return Qnil; /* dummy */
237
mNetscape = rb_define_module_under(mOSSL, "Netscape");
239
eSPKIError = rb_define_class_under(mNetscape, "SPKIError", eOSSLError);
241
cSPKI = rb_define_class_under(mNetscape, "SPKI", rb_cObject);
243
rb_define_alloc_func(cSPKI, ossl_spki_alloc);
244
rb_define_method(cSPKI, "initialize", ossl_spki_initialize, -1);
246
rb_define_method(cSPKI, "to_der", ossl_spki_to_der, 0);
247
rb_define_method(cSPKI, "to_pem", ossl_spki_to_pem, 0);
248
rb_define_alias(cSPKI, "to_s", "to_pem");
249
rb_define_method(cSPKI, "to_text", ossl_spki_print, 0);
250
rb_define_method(cSPKI, "public_key", ossl_spki_get_public_key, 0);
251
rb_define_method(cSPKI, "public_key=", ossl_spki_set_public_key, 1);
252
rb_define_method(cSPKI, "sign", ossl_spki_sign, 2);
253
rb_define_method(cSPKI, "verify", ossl_spki_verify, 1);
254
rb_define_method(cSPKI, "challenge", ossl_spki_get_challenge, 0);
255
rb_define_method(cSPKI, "challenge=", ossl_spki_set_challenge, 1);