Ruby  2.5.0dev(2017-10-22revision60238)
ossl_x509revoked.c
Go to the documentation of this file.
1 /*
2  * 'OpenSSL for Ruby' project
3  * Copyright (C) 2001-2002 Michal Rokos <m.rokos@sh.cvut.cz>
4  * All rights reserved.
5  */
6 /*
7  * This program is licensed under the same licence as Ruby.
8  * (See the file 'LICENCE'.)
9  */
10 #include "ossl.h"
11 
12 #define NewX509Rev(klass) \
13  TypedData_Wrap_Struct((klass), &ossl_x509rev_type, 0)
14 #define SetX509Rev(obj, rev) do { \
15  if (!(rev)) { \
16  ossl_raise(rb_eRuntimeError, "REV wasn't initialized!"); \
17  } \
18  RTYPEDDATA_DATA(obj) = (rev); \
19 } while (0)
20 #define GetX509Rev(obj, rev) do { \
21  TypedData_Get_Struct((obj), X509_REVOKED, &ossl_x509rev_type, (rev)); \
22  if (!(rev)) { \
23  ossl_raise(rb_eRuntimeError, "REV wasn't initialized!"); \
24  } \
25 } while (0)
26 
27 /*
28  * Classes
29  */
32 
33 static void
34 ossl_x509rev_free(void *ptr)
35 {
36  X509_REVOKED_free(ptr);
37 }
38 
39 static const rb_data_type_t ossl_x509rev_type = {
40  "OpenSSL/X509/REV",
41  {
42  0, ossl_x509rev_free,
43  },
45 };
46 
47 /*
48  * PUBLIC
49  */
50 VALUE
51 ossl_x509revoked_new(X509_REVOKED *rev)
52 {
53  X509_REVOKED *new;
54  VALUE obj;
55 
56  obj = NewX509Rev(cX509Rev);
57  if (!rev) {
58  new = X509_REVOKED_new();
59  } else {
60  new = X509_REVOKED_dup(rev);
61  }
62  if (!new) {
64  }
65  SetX509Rev(obj, new);
66 
67  return obj;
68 }
69 
70 X509_REVOKED *
72 {
73  X509_REVOKED *rev, *new;
74 
75  GetX509Rev(obj, rev);
76  if (!(new = X509_REVOKED_dup(rev))) {
78  }
79 
80  return new;
81 }
82 
83 /*
84  * PRIVATE
85  */
86 static VALUE
87 ossl_x509revoked_alloc(VALUE klass)
88 {
89  X509_REVOKED *rev;
90  VALUE obj;
91 
92  obj = NewX509Rev(klass);
93  if (!(rev = X509_REVOKED_new())) {
95  }
96  SetX509Rev(obj, rev);
97 
98  return obj;
99 }
100 
101 static VALUE
102 ossl_x509revoked_initialize(int argc, VALUE *argv, VALUE self)
103 {
104  /* EMPTY */
105  return self;
106 }
107 
108 static VALUE
109 ossl_x509revoked_initialize_copy(VALUE self, VALUE other)
110 {
111  X509_REVOKED *rev, *rev_other, *rev_new;
112 
113  rb_check_frozen(self);
114  GetX509Rev(self, rev);
115  GetX509Rev(other, rev_other);
116 
117  rev_new = X509_REVOKED_dup(rev_other);
118  if (!rev_new)
119  ossl_raise(eX509RevError, "X509_REVOKED_dup");
120 
121  SetX509Rev(self, rev_new);
122  X509_REVOKED_free(rev);
123 
124  return self;
125 }
126 
127 static VALUE
128 ossl_x509revoked_get_serial(VALUE self)
129 {
130  X509_REVOKED *rev;
131 
132  GetX509Rev(self, rev);
133 
135 }
136 
137 static VALUE
138 ossl_x509revoked_set_serial(VALUE self, VALUE num)
139 {
140  X509_REVOKED *rev;
141  ASN1_INTEGER *asn1int;
142 
143  GetX509Rev(self, rev);
144  asn1int = num_to_asn1integer(num, NULL);
145  if (!X509_REVOKED_set_serialNumber(rev, asn1int)) {
146  ASN1_INTEGER_free(asn1int);
147  ossl_raise(eX509RevError, "X509_REVOKED_set_serialNumber");
148  }
149  ASN1_INTEGER_free(asn1int);
150 
151  return num;
152 }
153 
154 static VALUE
155 ossl_x509revoked_get_time(VALUE self)
156 {
157  X509_REVOKED *rev;
158  const ASN1_TIME *time;
159 
160  GetX509Rev(self, rev);
162  if (!time)
163  return Qnil;
164 
165  return asn1time_to_time(time);
166 }
167 
168 static VALUE
169 ossl_x509revoked_set_time(VALUE self, VALUE time)
170 {
171  X509_REVOKED *rev;
172  ASN1_TIME *asn1time;
173 
174  GetX509Rev(self, rev);
175  asn1time = ossl_x509_time_adjust(NULL, time);
176  if (!X509_REVOKED_set_revocationDate(rev, asn1time)) {
177  ASN1_TIME_free(asn1time);
178  ossl_raise(eX509RevError, "X509_REVOKED_set_revocationDate");
179  }
180  ASN1_TIME_free(asn1time);
181 
182  return time;
183 }
184 /*
185  * Gets X509v3 extensions as array of X509Ext objects
186  */
187 static VALUE
188 ossl_x509revoked_get_extensions(VALUE self)
189 {
190  X509_REVOKED *rev;
191  int count, i;
192  X509_EXTENSION *ext;
193  VALUE ary;
194 
195  GetX509Rev(self, rev);
196  count = X509_REVOKED_get_ext_count(rev);
197  if (count < 0) {
198  OSSL_Debug("count < 0???");
199  return rb_ary_new();
200  }
201  ary = rb_ary_new2(count);
202  for (i=0; i<count; i++) {
203  ext = X509_REVOKED_get_ext(rev, i);
204  rb_ary_push(ary, ossl_x509ext_new(ext));
205  }
206 
207  return ary;
208 }
209 
210 /*
211  * Sets X509_EXTENSIONs
212  */
213 static VALUE
214 ossl_x509revoked_set_extensions(VALUE self, VALUE ary)
215 {
216  X509_REVOKED *rev;
217  X509_EXTENSION *ext;
218  long i;
219  VALUE item;
220 
221  Check_Type(ary, T_ARRAY);
222  for (i=0; i<RARRAY_LEN(ary); i++) {
224  }
225  GetX509Rev(self, rev);
226  while ((ext = X509_REVOKED_delete_ext(rev, 0)))
227  X509_EXTENSION_free(ext);
228  for (i=0; i<RARRAY_LEN(ary); i++) {
229  item = RARRAY_AREF(ary, i);
230  ext = GetX509ExtPtr(item);
231  if(!X509_REVOKED_add_ext(rev, ext, -1)) {
233  }
234  }
235 
236  return ary;
237 }
238 
239 static VALUE
240 ossl_x509revoked_add_extension(VALUE self, VALUE ext)
241 {
242  X509_REVOKED *rev;
243 
244  GetX509Rev(self, rev);
245  if (!X509_REVOKED_add_ext(rev, GetX509ExtPtr(ext), -1)) {
247  }
248 
249  return ext;
250 }
251 
252 /*
253  * INIT
254  */
255 void
257 {
258 #if 0
259  mOSSL = rb_define_module("OpenSSL");
262 #endif
263 
265 
267 
268  rb_define_alloc_func(cX509Rev, ossl_x509revoked_alloc);
269  rb_define_method(cX509Rev, "initialize", ossl_x509revoked_initialize, -1);
270  rb_define_method(cX509Rev, "initialize_copy", ossl_x509revoked_initialize_copy, 1);
271 
272  rb_define_method(cX509Rev, "serial", ossl_x509revoked_get_serial, 0);
273  rb_define_method(cX509Rev, "serial=", ossl_x509revoked_set_serial, 1);
274  rb_define_method(cX509Rev, "time", ossl_x509revoked_get_time, 0);
275  rb_define_method(cX509Rev, "time=", ossl_x509revoked_set_time, 1);
276  rb_define_method(cX509Rev, "extensions", ossl_x509revoked_get_extensions, 0);
277  rb_define_method(cX509Rev, "extensions=", ossl_x509revoked_set_extensions, 1);
278  rb_define_method(cX509Rev, "add_extension", ossl_x509revoked_add_extension, 1);
279 }
VALUE mOSSL
Definition: ossl.c:231
#define SetX509Rev(obj, rev)
#define RARRAY_LEN(a)
Definition: ruby.h:1019
#define RUBY_TYPED_FREE_IMMEDIATELY
Definition: ruby.h:1138
int count
Definition: encoding.c:56
VALUE rb_ary_push(VALUE ary, VALUE item)
Definition: array.c:924
ASN1_TIME * ossl_x509_time_adjust(ASN1_TIME *s, VALUE time)
Definition: ossl_x509.c:19
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
Definition: class.c:693
#define Check_Type(v, t)
Definition: ruby.h:562
VALUE ossl_x509revoked_new(X509_REVOKED *rev)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
VALUE cX509Ext
Definition: ossl_x509ext.c:43
#define T_ARRAY
Definition: ruby.h:498
X509_REVOKED * DupX509RevokedPtr(VALUE obj)
VALUE asn1integer_to_num(const ASN1_INTEGER *ai)
Definition: ossl_asn1.c:101
#define rb_ary_new2
Definition: intern.h:90
#define GetX509Rev(obj, rev)
#define X509_REVOKED_get0_serialNumber(x)
RUBY_EXTERN VALUE rb_cObject
Definition: ruby.h:1893
VALUE rb_ary_new(void)
Definition: array.c:499
VALUE eOSSLError
Definition: ossl.c:236
int argc
Definition: ruby.c:187
VALUE ossl_x509ext_new(X509_EXTENSION *)
Definition: ossl_x509ext.c:65
#define X509_REVOKED_get0_revocationDate(x)
#define NewX509Rev(klass)
#define X509_REVOKED_dup(rev)
#define Qnil
Definition: ruby.h:438
VALUE rb_eStandardError
Definition: error.c:799
VALUE eX509RevError
unsigned long VALUE
Definition: ruby.h:85
VALUE mX509
Definition: ossl_x509.c:12
#define OSSL_Debug
Definition: ossl.h:144
VALUE rb_define_module_under(VALUE outer, const char *name)
Definition: class.c:790
X509_EXTENSION * GetX509ExtPtr(VALUE)
Definition: ossl_x509ext.c:85
#define RARRAY_AREF(a, i)
Definition: ruby.h:1033
VALUE asn1time_to_time(const ASN1_TIME *time)
Definition: ossl_asn1.c:20
#define OSSL_Check_Kind(obj, klass)
Definition: ossl.h:52
void ossl_raise(VALUE exc, const char *fmt,...)
Definition: ossl.c:293
void Init_ossl_x509revoked(void)
VALUE cX509Rev
#define rb_check_frozen(obj)
Definition: intern.h:271
VALUE rb_define_module(const char *name)
Definition: class.c:768
#define NULL
Definition: _sdbm.c:102
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
Definition: class.c:1515
char ** argv
Definition: ruby.c:188
ASN1_INTEGER * num_to_asn1integer(VALUE obj, ASN1_INTEGER *ai)
Definition: ossl_asn1.c:124