Ruby  3.1.0dev(2021-09-10revisionb76ad15ed0da636161de0243c547ee1e6fc95681)
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 static VALUE
253 ossl_x509revoked_to_der(VALUE self)
254 {
255  X509_REVOKED *rev;
256  VALUE str;
257  int len;
258  unsigned char *p;
259 
260  GetX509Rev(self, rev);
261  len = i2d_X509_REVOKED(rev, NULL);
262  if (len <= 0)
263  ossl_raise(eX509RevError, "i2d_X509_REVOKED");
264  str = rb_str_new(NULL, len);
265  p = (unsigned char *)RSTRING_PTR(str);
266  if (i2d_X509_REVOKED(rev, &p) <= 0)
267  ossl_raise(eX509RevError, "i2d_X509_REVOKED");
268  ossl_str_adjust(str, p);
269  return str;
270 }
271 
272 /*
273  * INIT
274  */
275 void
277 {
278 #if 0
279  mOSSL = rb_define_module("OpenSSL");
282 #endif
283 
285 
287 
288  rb_define_alloc_func(cX509Rev, ossl_x509revoked_alloc);
289  rb_define_method(cX509Rev, "initialize", ossl_x509revoked_initialize, -1);
290  rb_define_method(cX509Rev, "initialize_copy", ossl_x509revoked_initialize_copy, 1);
291 
292  rb_define_method(cX509Rev, "serial", ossl_x509revoked_get_serial, 0);
293  rb_define_method(cX509Rev, "serial=", ossl_x509revoked_set_serial, 1);
294  rb_define_method(cX509Rev, "time", ossl_x509revoked_get_time, 0);
295  rb_define_method(cX509Rev, "time=", ossl_x509revoked_set_time, 1);
296  rb_define_method(cX509Rev, "extensions", ossl_x509revoked_get_extensions, 0);
297  rb_define_method(cX509Rev, "extensions=", ossl_x509revoked_set_extensions, 1);
298  rb_define_method(cX509Rev, "add_extension", ossl_x509revoked_add_extension, 1);
299  rb_define_method(cX509Rev, "to_der", ossl_x509revoked_to_der, 0);
300 }
SetX509Rev
#define SetX509Rev(obj, rev)
Definition: ossl_x509revoked.c:14
DupX509RevokedPtr
X509_REVOKED * DupX509RevokedPtr(VALUE obj)
Definition: ossl_x509revoked.c:71
rb_define_module_under
VALUE rb_define_module_under(VALUE outer, const char *name)
Definition: class.c:914
GetX509ExtPtr
X509_EXTENSION * GetX509ExtPtr(VALUE)
Definition: ossl_x509ext.c:85
ossl_x509_time_adjust
ASN1_TIME * ossl_x509_time_adjust(ASN1_TIME *s, VALUE time)
Definition: ossl_x509.c:19
asn1time_to_time
VALUE asn1time_to_time(const ASN1_TIME *time)
Definition: ossl_asn1.c:20
OSSL_Check_Kind
#define OSSL_Check_Kind(obj, klass)
Definition: ossl.h:58
rb_define_module
VALUE rb_define_module(const char *name)
Definition: class.c:887
mX509
VALUE mX509
Definition: ossl_x509.c:12
NewX509Rev
#define NewX509Rev(klass)
Definition: ossl_x509revoked.c:12
ossl.h
argv
char ** argv
Definition: ruby.c:243
ptr
struct RIMemo * ptr
Definition: debug.c:87
ossl_str_adjust
#define ossl_str_adjust(str, p)
Definition: ossl.h:88
X509_REVOKED_get0_serialNumber
#define X509_REVOKED_get0_serialNumber(x)
Definition: openssl_missing.h:55
X509_REVOKED_get0_revocationDate
#define X509_REVOKED_get0_revocationDate(x)
Definition: openssl_missing.h:59
rb_str_new
#define rb_str_new(str, len)
Definition: string.h:213
RUBY_TYPED_FREE_IMMEDIATELY
@ RUBY_TYPED_FREE_IMMEDIATELY
Definition: rtypeddata.h:62
eX509RevError
VALUE eX509RevError
Definition: ossl_x509revoked.c:31
cX509Ext
VALUE cX509Ext
Definition: ossl_x509ext.c:43
Init_ossl_x509revoked
void Init_ossl_x509revoked(void)
Definition: ossl_x509revoked.c:276
cX509Rev
VALUE cX509Rev
Definition: ossl_x509revoked.c:30
mOSSL
VALUE mOSSL
Definition: ossl.c:237
rb_define_alloc_func
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
rb_cObject
VALUE rb_cObject
Object class.
Definition: object.c:50
len
uint8_t len
Definition: escape.c:17
rb_ary_push
VALUE rb_ary_push(VALUE ary, VALUE item)
Definition: array.c:1312
Qnil
#define Qnil
Definition: special_consts.h:51
ossl_raise
void ossl_raise(VALUE exc, const char *fmt,...)
Definition: ossl.c:299
NULL
#define NULL
Definition: regenc.h:69
rb_ary_new2
#define rb_ary_new2
Definition: array.h:72
asn1integer_to_num
VALUE asn1integer_to_num(const ASN1_INTEGER *ai)
Definition: ossl_asn1.c:101
VALUE
unsigned long VALUE
Definition: value.h:38
GetX509Rev
#define GetX509Rev(obj, rev)
Definition: ossl_x509revoked.c:20
RSTRING_PTR
#define RSTRING_PTR(string)
Definition: fbuffer.h:19
ossl_x509ext_new
VALUE ossl_x509ext_new(X509_EXTENSION *)
Definition: ossl_x509ext.c:65
str
char str[HTML_ESCAPE_MAX_LEN+1]
Definition: escape.c:18
OSSL_Debug
#define OSSL_Debug(...)
Definition: ossl.h:139
num_to_asn1integer
ASN1_INTEGER * num_to_asn1integer(VALUE obj, ASN1_INTEGER *ai)
Definition: ossl_asn1.c:124
rb_check_frozen
#define rb_check_frozen
Definition: error.h:72
argc
int argc
Definition: ruby.c:242
T_ARRAY
#define T_ARRAY
Definition: value_type.h:56
rb_data_type_struct
Definition: rtypeddata.h:70
RARRAY_AREF
#define RARRAY_AREF(a, i)
Definition: missing.h:201
count
int count
Definition: nkf.c:5055
eOSSLError
VALUE eOSSLError
Definition: ossl.c:242
rb_define_class_under
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
Definition: class.c:809
rb_define_method
#define rb_define_method(klass, mid, func, arity)
Defines klass#mid.
Definition: cxxanyargs.hpp:655
RARRAY_LEN
#define RARRAY_LEN
Definition: rarray.h:52
rb_ary_new
VALUE rb_ary_new(void)
Definition: array.c:754
rb_eStandardError
VALUE rb_eStandardError
Definition: error.c:1090
ossl_x509revoked_new
VALUE ossl_x509revoked_new(X509_REVOKED *rev)
Definition: ossl_x509revoked.c:51