Ruby  1.9.3p547(2014-05-14revision45962)
ossl_ns_spki.c
Go to the documentation of this file.
1 /*
2  * $Id: ossl_ns_spki.c 31166 2011-03-24 07:29:21Z naruse $
3  * 'OpenSSL for Ruby' project
4  * Copyright (C) 2001-2002 Michal Rokos <m.rokos@sh.cvut.cz>
5  * All rights reserved.
6  */
7 /*
8  * This program is licenced under the same licence as Ruby.
9  * (See the file 'LICENCE'.)
10  */
11 #include "ossl.h"
12 
13 #define WrapSPKI(klass, obj, spki) do { \
14  if (!(spki)) { \
15  ossl_raise(rb_eRuntimeError, "SPKI wasn't initialized!"); \
16  } \
17  (obj) = Data_Wrap_Struct((klass), 0, NETSCAPE_SPKI_free, (spki)); \
18 } while (0)
19 #define GetSPKI(obj, spki) do { \
20  Data_Get_Struct((obj), NETSCAPE_SPKI, (spki)); \
21  if (!(spki)) { \
22  ossl_raise(rb_eRuntimeError, "SPKI wasn't initialized!"); \
23  } \
24 } while (0)
25 
26 /*
27  * Classes
28  */
32 
33 /*
34  * Public functions
35  */
36 
37 /*
38  * Private functions
39  */
40 static VALUE
42 {
43  NETSCAPE_SPKI *spki;
44  VALUE obj;
45 
46  if (!(spki = NETSCAPE_SPKI_new())) {
48  }
49  WrapSPKI(klass, obj, spki);
50 
51  return obj;
52 }
53 
54 static VALUE
56 {
57  NETSCAPE_SPKI *spki;
58  VALUE buffer;
59  const unsigned char *p;
60 
61  if (rb_scan_args(argc, argv, "01", &buffer) == 0) {
62  return self;
63  }
64  StringValue(buffer);
65  if (!(spki = NETSCAPE_SPKI_b64_decode(RSTRING_PTR(buffer), -1))) {
66  p = (unsigned char *)RSTRING_PTR(buffer);
67  if (!(spki = d2i_NETSCAPE_SPKI(NULL, &p, RSTRING_LEN(buffer)))) {
69  }
70  }
71  NETSCAPE_SPKI_free(DATA_PTR(self));
72  DATA_PTR(self) = spki;
73  ERR_clear_error();
74 
75  return self;
76 }
77 
78 static VALUE
80 {
81  NETSCAPE_SPKI *spki;
82  VALUE str;
83  long len;
84  unsigned char *p;
85 
86  GetSPKI(self, spki);
87  if ((len = i2d_NETSCAPE_SPKI(spki, NULL)) <= 0)
89  str = rb_str_new(0, len);
90  p = (unsigned char *)RSTRING_PTR(str);
91  if (i2d_NETSCAPE_SPKI(spki, &p) <= 0)
93  ossl_str_adjust(str, p);
94 
95  return str;
96 }
97 
98 static VALUE
100 {
101  NETSCAPE_SPKI *spki;
102  char *data;
103  VALUE str;
104 
105  GetSPKI(self, spki);
106  if (!(data = NETSCAPE_SPKI_b64_encode(spki))) {
108  }
109  str = ossl_buf2str(data, rb_long2int(strlen(data)));
110 
111  return str;
112 }
113 
114 static VALUE
116 {
117  NETSCAPE_SPKI *spki;
118  BIO *out;
119  BUF_MEM *buf;
120  VALUE str;
121 
122  GetSPKI(self, spki);
123  if (!(out = BIO_new(BIO_s_mem()))) {
125  }
126  if (!NETSCAPE_SPKI_print(out, spki)) {
127  BIO_free(out);
129  }
130  BIO_get_mem_ptr(out, &buf);
131  str = rb_str_new(buf->data, buf->length);
132  BIO_free(out);
133 
134  return str;
135 }
136 
137 static VALUE
139 {
140  NETSCAPE_SPKI *spki;
141  EVP_PKEY *pkey;
142 
143  GetSPKI(self, spki);
144  if (!(pkey = NETSCAPE_SPKI_get_pubkey(spki))) { /* adds an reference */
146  }
147 
148  return ossl_pkey_new(pkey); /* NO DUP - OK */
149 }
150 
151 static VALUE
153 {
154  NETSCAPE_SPKI *spki;
155 
156  GetSPKI(self, spki);
157  if (!NETSCAPE_SPKI_set_pubkey(spki, GetPKeyPtr(key))) { /* NO NEED TO DUP */
159  }
160 
161  return key;
162 }
163 
164 static VALUE
166 {
167  NETSCAPE_SPKI *spki;
168 
169  GetSPKI(self, spki);
170  if (spki->spkac->challenge->length <= 0) {
171  OSSL_Debug("Challenge.length <= 0?");
172  return rb_str_new(0, 0);
173  }
174 
175  return rb_str_new((const char *)spki->spkac->challenge->data,
176  spki->spkac->challenge->length);
177 }
178 
179 static VALUE
181 {
182  NETSCAPE_SPKI *spki;
183 
184  StringValue(str);
185  GetSPKI(self, spki);
186  if (!ASN1_STRING_set(spki->spkac->challenge, RSTRING_PTR(str),
187  RSTRING_LENINT(str))) {
189  }
190 
191  return str;
192 }
193 
194 static VALUE
196 {
197  NETSCAPE_SPKI *spki;
198  EVP_PKEY *pkey;
199  const EVP_MD *md;
200 
201  pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
202  md = GetDigestPtr(digest);
203  GetSPKI(self, spki);
204  if (!NETSCAPE_SPKI_sign(spki, pkey, md)) {
206  }
207 
208  return self;
209 }
210 
211 /*
212  * Checks that cert signature is made with PRIVversion of this PUBLIC 'key'
213  */
214 static VALUE
216 {
217  NETSCAPE_SPKI *spki;
218 
219  GetSPKI(self, spki);
220  switch (NETSCAPE_SPKI_verify(spki, GetPKeyPtr(key))) { /* NO NEED TO DUP */
221  case 0:
222  return Qfalse;
223  case 1:
224  return Qtrue;
225  default:
227  }
228  return Qnil; /* dummy */
229 }
230 
231 /*
232  * NETSCAPE_SPKI init
233  */
234 void
236 {
237  mNetscape = rb_define_module_under(mOSSL, "Netscape");
238 
240 
242 
244  rb_define_method(cSPKI, "initialize", ossl_spki_initialize, -1);
245 
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);
251  rb_define_method(cSPKI, "public_key=", ossl_spki_set_public_key, 1);
253  rb_define_method(cSPKI, "verify", ossl_spki_verify, 1);
256 }
257 
#define RSTRING_LEN(string)
Definition: generator.h:45
VALUE mOSSL
Definition: ossl.c:250
size_t strlen(const char *)
#define WrapSPKI(klass, obj, spki)
Definition: ossl_ns_spki.c:13
VALUE eSPKIError
Definition: ossl_ns_spki.c:31
#define Qtrue
Definition: ruby.h:366
EVP_PKEY * GetPrivPKeyPtr(VALUE obj)
Definition: ossl_pkey.c:146
#define ossl_str_adjust(str, p)
Definition: ossl.h:132
static VALUE ossl_spki_print(VALUE self)
Definition: ossl_ns_spki.c:115
static VALUE ossl_spki_set_public_key(VALUE self, VALUE key)
Definition: ossl_ns_spki.c:152
#define rb_long2int(n)
Definition: ruby.h:308
#define RSTRING_PTR(string)
Definition: generator.h:42
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
Definition: class.c:515
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
#define DATA_PTR(dta)
Definition: ruby.h:795
static VALUE ossl_spki_get_challenge(VALUE self)
Definition: ossl_ns_spki.c:165
VALUE ossl_pkey_new(EVP_PKEY *pkey)
Definition: ossl_pkey.c:40
Win32OLEIDispatch * p
Definition: win32ole.c:778
static VALUE ossl_spki_to_der(VALUE self)
Definition: ossl_ns_spki.c:79
VALUE eX509CertError
Definition: ossl_x509cert.c:34
RUBY_EXTERN VALUE rb_cObject
Definition: ruby.h:1246
static VALUE ossl_spki_get_public_key(VALUE self)
Definition: ossl_ns_spki.c:138
const EVP_MD * GetDigestPtr(VALUE obj)
Definition: ossl_digest.c:36
VALUE eOSSLError
Definition: ossl.c:255
int argc
Definition: ruby.c:120
#define Qfalse
Definition: ruby.h:365
void rb_define_alias(VALUE klass, const char *name1, const char *name2)
Defines an alias of a method.
Definition: class.c:1385
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
Definition: class.c:1416
unsigned char buf[MIME_BUF_SIZE]
Definition: nkf.c:3913
#define Qnil
Definition: ruby.h:367
unsigned long VALUE
Definition: ruby.h:88
register unsigned int len
Definition: name2ctype.h:22210
#define OSSL_Debug
Definition: ossl.h:205
VALUE rb_define_module_under(VALUE outer, const char *name)
Definition: class.c:607
static VALUE ossl_spki_set_challenge(VALUE self, VALUE str)
Definition: ossl_ns_spki.c:180
static VALUE ossl_spki_alloc(VALUE klass)
Definition: ossl_ns_spki.c:41
static VALUE ossl_spki_sign(VALUE self, VALUE key, VALUE digest)
Definition: ossl_ns_spki.c:195
uint8_t key[16]
Definition: random.c:1284
VALUE ossl_buf2str(char *buf, int len)
Definition: ossl.c:134
VALUE mNetscape
Definition: ossl_ns_spki.c:29
static VALUE ossl_spki_to_pem(VALUE self)
Definition: ossl_ns_spki.c:99
void ossl_raise(VALUE exc, const char *fmt,...)
Definition: ossl.c:324
EVP_PKEY * GetPKeyPtr(VALUE obj)
Definition: ossl_pkey.c:136
void Init_ossl_ns_spki()
Definition: ossl_ns_spki.c:235
static VALUE ossl_spki_verify(VALUE self, VALUE key)
Definition: ossl_ns_spki.c:215
#define RSTRING_LENINT(str)
Definition: ruby.h:684
static VALUE ossl_spki_initialize(int argc, VALUE *argv, VALUE self)
Definition: ossl_ns_spki.c:55
#define NULL
Definition: _sdbm.c:107
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
Definition: class.c:1210
#define GetSPKI(obj, spki)
Definition: ossl_ns_spki.c:19
VALUE cSPKI
Definition: ossl_ns_spki.c:30
char ** argv
Definition: ruby.c:121
#define StringValue(v)
Definition: ruby.h:466
VALUE rb_str_new(const char *, long)
Definition: string.c:410