Skip to content

Commit 56644a5

Browse files
defining asn1 constants and factory methods in ruby
1 parent 4efbdd8 commit 56644a5

File tree

3 files changed

+110
-197
lines changed

3 files changed

+110
-197
lines changed

ext/openssl/ossl_asn1.c

Lines changed: 1 addition & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -143,20 +143,7 @@ VALUE cASN1Data;
143143
static VALUE cASN1Primitive;
144144
static VALUE cASN1Constructive;
145145

146-
static VALUE cASN1EndOfContent;
147-
static VALUE cASN1Boolean; /* BOOLEAN */
148-
static VALUE cASN1Integer, cASN1Enumerated; /* INTEGER */
149-
static VALUE cASN1BitString; /* BIT STRING */
150-
static VALUE cASN1OctetString, cASN1UTF8String; /* STRINGs */
151-
static VALUE cASN1NumericString, cASN1PrintableString;
152-
static VALUE cASN1T61String, cASN1VideotexString;
153-
static VALUE cASN1IA5String, cASN1GraphicString;
154-
static VALUE cASN1ISO64String, cASN1GeneralString;
155-
static VALUE cASN1UniversalString, cASN1BMPString;
156-
static VALUE cASN1Null; /* NULL */
157146
static VALUE cASN1ObjectId; /* OBJECT IDENTIFIER */
158-
static VALUE cASN1UTCTime, cASN1GeneralizedTime; /* TIME */
159-
static VALUE cASN1Sequence, cASN1Set; /* CONSTRUCTIVE */
160147

161148
static VALUE sym_IMPLICIT, sym_EXPLICIT;
162149
static VALUE sym_UNIVERSAL, sym_APPLICATION, sym_CONTEXT_SPECIFIC, sym_PRIVATE;
@@ -177,49 +164,6 @@ obj_to_asn1obj(VALUE obj)
177164

178165
/********/
179166

180-
typedef struct {
181-
const char *name;
182-
VALUE *klass;
183-
} ossl_asn1_info_t;
184-
185-
static const ossl_asn1_info_t ossl_asn1_info[] = {
186-
{ "EOC", &cASN1EndOfContent, }, /* 0 */
187-
{ "BOOLEAN", &cASN1Boolean, }, /* 1 */
188-
{ "INTEGER", &cASN1Integer, }, /* 2 */
189-
{ "BIT_STRING", &cASN1BitString, }, /* 3 */
190-
{ "OCTET_STRING", &cASN1OctetString, }, /* 4 */
191-
{ "NULL", &cASN1Null, }, /* 5 */
192-
{ "OBJECT", &cASN1ObjectId, }, /* 6 */
193-
{ "OBJECT_DESCRIPTOR", NULL, }, /* 7 */
194-
{ "EXTERNAL", NULL, }, /* 8 */
195-
{ "REAL", NULL, }, /* 9 */
196-
{ "ENUMERATED", &cASN1Enumerated, }, /* 10 */
197-
{ "EMBEDDED_PDV", NULL, }, /* 11 */
198-
{ "UTF8STRING", &cASN1UTF8String, }, /* 12 */
199-
{ "RELATIVE_OID", NULL, }, /* 13 */
200-
{ "[UNIVERSAL 14]", NULL, }, /* 14 */
201-
{ "[UNIVERSAL 15]", NULL, }, /* 15 */
202-
{ "SEQUENCE", &cASN1Sequence, }, /* 16 */
203-
{ "SET", &cASN1Set, }, /* 17 */
204-
{ "NUMERICSTRING", &cASN1NumericString, }, /* 18 */
205-
{ "PRINTABLESTRING", &cASN1PrintableString, }, /* 19 */
206-
{ "T61STRING", &cASN1T61String, }, /* 20 */
207-
{ "VIDEOTEXSTRING", &cASN1VideotexString, }, /* 21 */
208-
{ "IA5STRING", &cASN1IA5String, }, /* 22 */
209-
{ "UTCTIME", &cASN1UTCTime, }, /* 23 */
210-
{ "GENERALIZEDTIME", &cASN1GeneralizedTime, }, /* 24 */
211-
{ "GRAPHICSTRING", &cASN1GraphicString, }, /* 25 */
212-
{ "ISO64STRING", &cASN1ISO64String, }, /* 26 */
213-
{ "GENERALSTRING", &cASN1GeneralString, }, /* 27 */
214-
{ "UNIVERSALSTRING", &cASN1UniversalString, }, /* 28 */
215-
{ "CHARACTER_STRING", NULL, }, /* 29 */
216-
{ "BMPSTRING", &cASN1BMPString, }, /* 30 */
217-
};
218-
219-
enum {ossl_asn1_info_size = (sizeof(ossl_asn1_info)/sizeof(ossl_asn1_info[0]))};
220-
221-
static VALUE class_tag_map;
222-
223167
/*
224168
* call-seq:
225169
* OpenSSL::ASN1::ObjectId.register(object_id, short_name, long_name)
@@ -347,40 +291,10 @@ ossl_asn1obj_eq(VALUE self, VALUE other)
347291
return rb_str_equal(oid1, oid2);
348292
}
349293

350-
#define OSSL_ASN1_IMPL_FACTORY_METHOD(klass) \
351-
static VALUE ossl_asn1_##klass(int argc, VALUE *argv, VALUE self)\
352-
{ return rb_funcallv_public(cASN1##klass, rb_intern("new"), argc, argv); }
353-
354-
OSSL_ASN1_IMPL_FACTORY_METHOD(Boolean)
355-
OSSL_ASN1_IMPL_FACTORY_METHOD(Integer)
356-
OSSL_ASN1_IMPL_FACTORY_METHOD(Enumerated)
357-
OSSL_ASN1_IMPL_FACTORY_METHOD(BitString)
358-
OSSL_ASN1_IMPL_FACTORY_METHOD(OctetString)
359-
OSSL_ASN1_IMPL_FACTORY_METHOD(UTF8String)
360-
OSSL_ASN1_IMPL_FACTORY_METHOD(NumericString)
361-
OSSL_ASN1_IMPL_FACTORY_METHOD(PrintableString)
362-
OSSL_ASN1_IMPL_FACTORY_METHOD(T61String)
363-
OSSL_ASN1_IMPL_FACTORY_METHOD(VideotexString)
364-
OSSL_ASN1_IMPL_FACTORY_METHOD(IA5String)
365-
OSSL_ASN1_IMPL_FACTORY_METHOD(GraphicString)
366-
OSSL_ASN1_IMPL_FACTORY_METHOD(ISO64String)
367-
OSSL_ASN1_IMPL_FACTORY_METHOD(GeneralString)
368-
OSSL_ASN1_IMPL_FACTORY_METHOD(UniversalString)
369-
OSSL_ASN1_IMPL_FACTORY_METHOD(BMPString)
370-
OSSL_ASN1_IMPL_FACTORY_METHOD(Null)
371-
OSSL_ASN1_IMPL_FACTORY_METHOD(ObjectId)
372-
OSSL_ASN1_IMPL_FACTORY_METHOD(UTCTime)
373-
OSSL_ASN1_IMPL_FACTORY_METHOD(GeneralizedTime)
374-
OSSL_ASN1_IMPL_FACTORY_METHOD(Sequence)
375-
OSSL_ASN1_IMPL_FACTORY_METHOD(Set)
376-
OSSL_ASN1_IMPL_FACTORY_METHOD(EndOfContent)
377-
378294
void
379295
Init_ossl_asn1(void)
380296
{
381297
#undef rb_intern
382-
VALUE ary;
383-
int i;
384298

385299
#if 0
386300
mOSSL = rb_define_module("OpenSSL");
@@ -409,55 +323,12 @@ Init_ossl_asn1(void)
409323
* classes defined in it.
410324
*/
411325
eASN1Error = rb_define_class_under(mASN1, "ASN1Error", eOSSLError);
412-
ary = rb_ary_new();
413-
414-
/*
415-
* Array storing tag names at the tag's index.
416-
*/
417-
rb_define_const(mASN1, "UNIVERSAL_TAG_NAME", ary);
418-
for(i = 0; i < ossl_asn1_info_size; i++){
419-
if(ossl_asn1_info[i].name[0] == '[') continue;
420-
rb_define_const(mASN1, ossl_asn1_info[i].name, INT2NUM(i));
421-
rb_ary_store(ary, i, rb_str_new2(ossl_asn1_info[i].name));
422-
}
423-
424326

425327
cASN1Data = rb_define_class_under(mASN1, "ASN1Data", rb_cObject);
426328
cASN1Primitive = rb_define_class_under(mASN1, "Primitive", cASN1Data);
427329

428330
cASN1Constructive = rb_define_class_under(mASN1,"Constructive", cASN1Data);
429-
#define OSSL_ASN1_DEFINE_CLASS(name, super) \
430-
do{\
431-
cASN1##name = rb_define_class_under(mASN1, #name, cASN1##super);\
432-
rb_define_module_function(mASN1, #name, ossl_asn1_##name, -1);\
433-
}while(0)
434-
435-
OSSL_ASN1_DEFINE_CLASS(Boolean, Primitive);
436-
OSSL_ASN1_DEFINE_CLASS(Integer, Primitive);
437-
OSSL_ASN1_DEFINE_CLASS(Enumerated, Primitive);
438-
OSSL_ASN1_DEFINE_CLASS(BitString, Primitive);
439-
OSSL_ASN1_DEFINE_CLASS(OctetString, Primitive);
440-
OSSL_ASN1_DEFINE_CLASS(UTF8String, Primitive);
441-
OSSL_ASN1_DEFINE_CLASS(NumericString, Primitive);
442-
OSSL_ASN1_DEFINE_CLASS(PrintableString, Primitive);
443-
OSSL_ASN1_DEFINE_CLASS(T61String, Primitive);
444-
OSSL_ASN1_DEFINE_CLASS(VideotexString, Primitive);
445-
OSSL_ASN1_DEFINE_CLASS(IA5String, Primitive);
446-
OSSL_ASN1_DEFINE_CLASS(GraphicString, Primitive);
447-
OSSL_ASN1_DEFINE_CLASS(ISO64String, Primitive);
448-
OSSL_ASN1_DEFINE_CLASS(GeneralString, Primitive);
449-
OSSL_ASN1_DEFINE_CLASS(UniversalString, Primitive);
450-
OSSL_ASN1_DEFINE_CLASS(BMPString, Primitive);
451-
OSSL_ASN1_DEFINE_CLASS(Null, Primitive);
452-
OSSL_ASN1_DEFINE_CLASS(ObjectId, Primitive);
453-
OSSL_ASN1_DEFINE_CLASS(UTCTime, Primitive);
454-
OSSL_ASN1_DEFINE_CLASS(GeneralizedTime, Primitive);
455-
456-
OSSL_ASN1_DEFINE_CLASS(Sequence, Constructive);
457-
OSSL_ASN1_DEFINE_CLASS(Set, Constructive);
458-
459-
OSSL_ASN1_DEFINE_CLASS(EndOfContent, Data);
460-
331+
cASN1ObjectId = rb_define_class_under(mASN1,"ObjectId", cASN1Primitive);
461332

462333
#if 0
463334
cASN1ObjectId = rb_define_class_under(mASN1, "ObjectId", cASN1Primitive); /* let rdoc know */
@@ -469,30 +340,4 @@ do{\
469340
rb_define_alias(cASN1ObjectId, "short_name", "sn");
470341
rb_define_alias(cASN1ObjectId, "long_name", "ln");
471342
rb_define_method(cASN1ObjectId, "==", ossl_asn1obj_eq, 1);
472-
473-
class_tag_map = rb_hash_new();
474-
rb_hash_aset(class_tag_map, cASN1EndOfContent, INT2NUM(V_ASN1_EOC));
475-
rb_hash_aset(class_tag_map, cASN1Boolean, INT2NUM(V_ASN1_BOOLEAN));
476-
rb_hash_aset(class_tag_map, cASN1Integer, INT2NUM(V_ASN1_INTEGER));
477-
rb_hash_aset(class_tag_map, cASN1BitString, INT2NUM(V_ASN1_BIT_STRING));
478-
rb_hash_aset(class_tag_map, cASN1OctetString, INT2NUM(V_ASN1_OCTET_STRING));
479-
rb_hash_aset(class_tag_map, cASN1Null, INT2NUM(V_ASN1_NULL));
480-
rb_hash_aset(class_tag_map, cASN1ObjectId, INT2NUM(V_ASN1_OBJECT));
481-
rb_hash_aset(class_tag_map, cASN1Enumerated, INT2NUM(V_ASN1_ENUMERATED));
482-
rb_hash_aset(class_tag_map, cASN1UTF8String, INT2NUM(V_ASN1_UTF8STRING));
483-
rb_hash_aset(class_tag_map, cASN1Sequence, INT2NUM(V_ASN1_SEQUENCE));
484-
rb_hash_aset(class_tag_map, cASN1Set, INT2NUM(V_ASN1_SET));
485-
rb_hash_aset(class_tag_map, cASN1NumericString, INT2NUM(V_ASN1_NUMERICSTRING));
486-
rb_hash_aset(class_tag_map, cASN1PrintableString, INT2NUM(V_ASN1_PRINTABLESTRING));
487-
rb_hash_aset(class_tag_map, cASN1T61String, INT2NUM(V_ASN1_T61STRING));
488-
rb_hash_aset(class_tag_map, cASN1VideotexString, INT2NUM(V_ASN1_VIDEOTEXSTRING));
489-
rb_hash_aset(class_tag_map, cASN1IA5String, INT2NUM(V_ASN1_IA5STRING));
490-
rb_hash_aset(class_tag_map, cASN1UTCTime, INT2NUM(V_ASN1_UTCTIME));
491-
rb_hash_aset(class_tag_map, cASN1GeneralizedTime, INT2NUM(V_ASN1_GENERALIZEDTIME));
492-
rb_hash_aset(class_tag_map, cASN1GraphicString, INT2NUM(V_ASN1_GRAPHICSTRING));
493-
rb_hash_aset(class_tag_map, cASN1ISO64String, INT2NUM(V_ASN1_ISO64STRING));
494-
rb_hash_aset(class_tag_map, cASN1GeneralString, INT2NUM(V_ASN1_GENERALSTRING));
495-
rb_hash_aset(class_tag_map, cASN1UniversalString, INT2NUM(V_ASN1_UNIVERSALSTRING));
496-
rb_hash_aset(class_tag_map, cASN1BMPString, INT2NUM(V_ASN1_BMPSTRING));
497-
rb_define_const(mASN1, "CLASS_TAG_MAP", class_tag_map);
498343
}

lib/openssl.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
(See the file 'COPYING'.)
1111
=end
1212

13+
require_relative 'openssl/asn1'
14+
1315
require 'openssl.so'
1416

15-
require_relative 'openssl/asn1'
1617
require_relative 'openssl/bn'
1718
require_relative 'openssl/cipher'
1819
require_relative 'openssl/digest'

0 commit comments

Comments
 (0)