… | |
… | |
73 | This module implements a I<very> low level BER/DER en-/decoder. |
73 | This module implements a I<very> low level BER/DER en-/decoder. |
74 | |
74 | |
75 | If is tuned for low memory and high speed, while still maintaining some |
75 | If is tuned for low memory and high speed, while still maintaining some |
76 | level of user-friendlyness. |
76 | level of user-friendlyness. |
77 | |
77 | |
|
|
78 | =head2 EXPORT TAGS AND CONSTANTS |
|
|
79 | |
|
|
80 | By default this module doesn't export any symbols, but if you don't want |
|
|
81 | to break your keyboard, editor or eyesigh with extreemly long names, I |
|
|
82 | recommend importing the C<:all> tag. Still, you can selectively import |
|
|
83 | things: |
|
|
84 | |
|
|
85 | =over |
|
|
86 | |
|
|
87 | =item :all |
|
|
88 | |
|
|
89 | All of the below. Really. Rcommended for at least first steps, or if you |
|
|
90 | don't care about a few kilobytes of wasted memory (and namespace). |
|
|
91 | |
|
|
92 | =item :const |
|
|
93 | |
|
|
94 | All of the stricly ASN.1-related constants defined by this module, the |
|
|
95 | same as C<:const_asn :const_index>. Notably, this does not contain |
|
|
96 | C<:const_ber_type> and C<:const_snmp>. |
|
|
97 | |
|
|
98 | A good set to get everything you need to decode and match BER data would be |
|
|
99 | C<:decode :const>. |
|
|
100 | |
|
|
101 | =item C<:const_index>> |
|
|
102 | |
|
|
103 | The BER tuple array index constants: |
|
|
104 | |
|
|
105 | BER_CLASS BER_TAG BER_CONSTRUCTED BER_DATA |
|
|
106 | |
|
|
107 | =item C<:const_asn> |
|
|
108 | |
|
|
109 | ASN class values (these are C<0>, C<1>, C<2> and C<3>, reespectively - |
|
|
110 | exactly thw two topmost bits from the identifdier octet shifted 6 bits to |
|
|
111 | the right): |
|
|
112 | |
|
|
113 | ASN_UNIVERSAL ASN_APPLICATION ASN_CONTEXT ASN_PRIVATE |
|
|
114 | |
|
|
115 | ASN tag values (some of which are aliases, such as C<ASN_OID>). Their |
|
|
116 | numerical value corresponds exactly to the numbers used in BER/X.690. |
|
|
117 | |
|
|
118 | ASN_BOOLEAN ASN_INTEGER32 ASN_BIT_STRING ASN_OCTET_STRING ASN_NULL ASN_OBJECT_IDENTIFIER |
|
|
119 | ASN_OBJECT_DESCRIPTOR ASN_OID ASN_EXTERNAL ASN_REAL ASN_SEQUENCE ASN_ENUMERATED |
|
|
120 | ASN_EMBEDDED_PDV ASN_UTF8_STRING ASN_RELATIVE_OID ASN_SET ASN_NUMERIC_STRING |
|
|
121 | ASN_PRINTABLE_STRING ASN_TELETEX_STRING ASN_T61_STRING ASN_VIDEOTEX_STRING ASN_IA5_STRING |
|
|
122 | ASN_ASCII_STRING ASN_UTC_TIME ASN_GENERALIZED_TIME ASN_GRAPHIC_STRING ASN_VISIBLE_STRING |
|
|
123 | ASN_ISO646_STRING ASN_GENERAL_STRING ASN_UNIVERSAL_STRING ASN_CHARACTER_STRING ASN_BMP_STRING |
|
|
124 | |
|
|
125 | =item C<:const_ber_type> |
|
|
126 | |
|
|
127 | The BER type constants, explained in the PROFILES section. |
|
|
128 | |
|
|
129 | BER_TYPE_BYTES BER_TYPE_UTF8 BER_TYPE_UCS2 BER_TYPE_UCS4 BER_TYPE_INT |
|
|
130 | BER_TYPE_OID BER_TYPE_RELOID BER_TYPE_NULL BER_TYPE_BOOL BER_TYPE_REAL |
|
|
131 | BER_TYPE_IPADDRESS BER_TYPE_CROAK |
|
|
132 | |
|
|
133 | =item C<:const_snmp> |
|
|
134 | |
|
|
135 | Constants only relevant to SNMP. These are the tag values used by SNMP in |
|
|
136 | the C<ASN_APPLICATION> namespace and have the exact numerical value as in |
|
|
137 | BER/RFC 2578. |
|
|
138 | |
|
|
139 | SNMP_IPADDRESS SNMP_COUNTER32 SNMP_UNSIGNED32 SNMP_TIMETICKS SNMP_OPAQUE SNMP_COUNTER64 |
|
|
140 | |
|
|
141 | =item C<:decode> |
|
|
142 | |
|
|
143 | C<ber_decode> and the match helper functions: |
|
|
144 | |
|
|
145 | ber_decode ber_is ber_is_seq ber_is_i32 ber_is_oid |
|
|
146 | |
|
|
147 | =item C<:encode> |
|
|
148 | |
|
|
149 | C<ber_encode> and the construction helper functions: |
|
|
150 | |
|
|
151 | ber_encode ber_i32 |
|
|
152 | |
|
|
153 | =back |
|
|
154 | |
78 | =head2 ASN.1/BER/DER/... BASICS |
155 | =head2 ASN.1/BER/DER/... BASICS |
79 | |
156 | |
80 | ASN.1 is a strange language that can be used to describe protocols and |
157 | ASN.1 is a strange language that can be used to describe protocols and |
81 | data structures. It supports various mappings to JSON, XML, but most |
158 | data structures. It supports various mappings to JSON, XML, but most |
82 | importantly, to a various binary encodings such as BER, that is the topic |
159 | importantly, to a various binary encodings such as BER, that is the topic |
… | |
… | |
294 | $VERSION = 0.8; |
371 | $VERSION = 0.8; |
295 | XSLoader::load __PACKAGE__, $VERSION; |
372 | XSLoader::load __PACKAGE__, $VERSION; |
296 | } |
373 | } |
297 | |
374 | |
298 | our %EXPORT_TAGS = ( |
375 | our %EXPORT_TAGS = ( |
299 | const => [qw( |
376 | const_index => [qw( |
300 | BER_CLASS BER_TAG BER_CONSTRUCTED BER_DATA |
377 | BER_CLASS BER_TAG BER_CONSTRUCTED BER_DATA |
301 | |
378 | )], |
|
|
379 | const_asn => [qw( |
302 | ASN_BOOLEAN ASN_INTEGER32 ASN_BIT_STRING ASN_OCTET_STRING ASN_NULL ASN_OBJECT_IDENTIFIER |
380 | ASN_BOOLEAN ASN_INTEGER32 ASN_BIT_STRING ASN_OCTET_STRING ASN_NULL ASN_OBJECT_IDENTIFIER |
303 | ASN_OBJECT_DESCRIPTOR ASN_OID ASN_EXTERNAL ASN_REAL ASN_SEQUENCE ASN_ENUMERATED |
381 | ASN_OBJECT_DESCRIPTOR ASN_OID ASN_EXTERNAL ASN_REAL ASN_SEQUENCE ASN_ENUMERATED |
304 | ASN_EMBEDDED_PDV ASN_UTF8_STRING ASN_RELATIVE_OID ASN_SET ASN_NUMERIC_STRING |
382 | ASN_EMBEDDED_PDV ASN_UTF8_STRING ASN_RELATIVE_OID ASN_SET ASN_NUMERIC_STRING |
305 | ASN_PRINTABLE_STRING ASN_TELETEX_STRING ASN_T61_STRING ASN_VIDEOTEX_STRING ASN_IA5_STRING |
383 | ASN_PRINTABLE_STRING ASN_TELETEX_STRING ASN_T61_STRING ASN_VIDEOTEX_STRING ASN_IA5_STRING |
306 | ASN_ASCII_STRING ASN_UTC_TIME ASN_GENERALIZED_TIME ASN_GRAPHIC_STRING ASN_VISIBLE_STRING |
384 | ASN_ASCII_STRING ASN_UTC_TIME ASN_GENERALIZED_TIME ASN_GRAPHIC_STRING ASN_VISIBLE_STRING |
307 | ASN_ISO646_STRING ASN_GENERAL_STRING ASN_UNIVERSAL_STRING ASN_CHARACTER_STRING ASN_BMP_STRING |
385 | ASN_ISO646_STRING ASN_GENERAL_STRING ASN_UNIVERSAL_STRING ASN_CHARACTER_STRING ASN_BMP_STRING |
308 | |
386 | |
309 | ASN_UNIVERSAL ASN_APPLICATION ASN_CONTEXT ASN_PRIVATE |
387 | ASN_UNIVERSAL ASN_APPLICATION ASN_CONTEXT ASN_PRIVATE |
310 | |
388 | )], |
|
|
389 | const_ber_type => [qw( |
311 | BER_TYPE_BYTES BER_TYPE_UTF8 BER_TYPE_UCS2 BER_TYPE_UCS4 BER_TYPE_INT |
390 | BER_TYPE_BYTES BER_TYPE_UTF8 BER_TYPE_UCS2 BER_TYPE_UCS4 BER_TYPE_INT |
312 | BER_TYPE_OID BER_TYPE_RELOID BER_TYPE_NULL BER_TYPE_BOOL BER_TYPE_REAL |
391 | BER_TYPE_OID BER_TYPE_RELOID BER_TYPE_NULL BER_TYPE_BOOL BER_TYPE_REAL |
313 | BER_TYPE_IPADDRESS BER_TYPE_CROAK |
392 | BER_TYPE_IPADDRESS BER_TYPE_CROAK |
314 | )], |
393 | )], |
315 | const_snmp => [qw( |
394 | const_snmp => [qw( |
316 | SNMP_IPADDRESS SNMP_COUNTER32 SNMP_UNSIGNED32 SNMP_TIMETICKS SNMP_OPAQUE SNMP_COUNTER64 |
395 | SNMP_IPADDRESS SNMP_COUNTER32 SNMP_UNSIGNED32 SNMP_TIMETICKS SNMP_OPAQUE SNMP_COUNTER64 |
317 | )], |
396 | )], |
318 | encode => [qw( |
397 | decode => [qw( |
319 | ber_decode |
398 | ber_decode |
320 | ber_is ber_is_seq ber_is_i32 ber_is_oid |
399 | ber_is ber_is_seq ber_is_i32 ber_is_oid |
321 | )], |
400 | )], |
322 | decode => [qw( |
401 | encode => [qw( |
323 | ber_encode |
402 | ber_encode |
324 | ber_i32 |
403 | ber_i32 |
325 | )], |
404 | )], |
326 | ); |
405 | ); |
327 | |
406 | |
328 | our @EXPORT_OK = map @$_, values %EXPORT_TAGS; |
407 | our @EXPORT_OK = map @$_, values %EXPORT_TAGS; |
329 | |
408 | |
330 | $EXPORT_TAGS{all} = \@EXPORT_OK; |
409 | $EXPORT_TAGS{all} = \@EXPORT_OK; |
|
|
410 | $EXPORT_TAGS{const} = [map @{ $EXPORT_TAGS{$_} }, qw(const_index const_asn)]; |
|
|
411 | use Data::Dump; ddx \%EXPORT_TAGS; |
331 | |
412 | |
332 | =head1 PROFILES |
413 | =head1 PROFILES |
333 | |
414 | |
334 | While any BER data can be correctly encoded and decoded out of the box, it |
415 | While any BER data can be correctly encoded and decoded out of the box, it |
335 | can be inconvenient to have to manually decode some values into a "better" |
416 | can be inconvenient to have to manually decode some values into a "better" |
… | |
… | |
480 | =cut |
561 | =cut |
481 | |
562 | |
482 | our $DEFAULT_PROFILE = new Convert::BER::XS::Profile; |
563 | our $DEFAULT_PROFILE = new Convert::BER::XS::Profile; |
483 | our $SNMP_PROFILE = new Convert::BER::XS::Profile; |
564 | our $SNMP_PROFILE = new Convert::BER::XS::Profile; |
484 | |
565 | |
|
|
566 | # additional SNMP application types |
485 | $SNMP_PROFILE->set (ASN_APPLICATION, SNMP_IPADDRESS , BER_TYPE_IPADDRESS); |
567 | $SNMP_PROFILE->set (ASN_APPLICATION, SNMP_IPADDRESS , BER_TYPE_IPADDRESS); |
486 | $SNMP_PROFILE->set (ASN_APPLICATION, SNMP_COUNTER32 , BER_TYPE_INT); |
568 | $SNMP_PROFILE->set (ASN_APPLICATION, SNMP_COUNTER32 , BER_TYPE_INT); |
487 | $SNMP_PROFILE->set (ASN_APPLICATION, SNMP_UNSIGNED32, BER_TYPE_INT); |
569 | $SNMP_PROFILE->set (ASN_APPLICATION, SNMP_UNSIGNED32, BER_TYPE_INT); |
488 | $SNMP_PROFILE->set (ASN_APPLICATION, SNMP_TIMETICKS , BER_TYPE_INT); |
570 | $SNMP_PROFILE->set (ASN_APPLICATION, SNMP_TIMETICKS , BER_TYPE_INT); |
489 | $SNMP_PROFILE->set (ASN_APPLICATION, SNMP_OPAQUE , BER_TYPE_IPADDRESS); |
571 | $SNMP_PROFILE->set (ASN_APPLICATION, SNMP_OPAQUE , BER_TYPE_IPADDRESS); |
… | |
… | |
491 | |
573 | |
492 | $DEFAULT_PROFILE->_set_default; |
574 | $DEFAULT_PROFILE->_set_default; |
493 | |
575 | |
494 | 1; |
576 | 1; |
495 | |
577 | |
496 | =head2 LIMITATIONS |
578 | =head2 LIMITATIONS/NOTES |
497 | |
579 | |
498 | This module can only en-/decode 64 bit signed and unsigned integers, and |
580 | This module can only en-/decode 64 bit signed and unsigned integers, and |
499 | only when your perl supports those. |
581 | only when your perl supports those. |
500 | |
582 | |
|
|
583 | This module does not generally care about ranges, i.e. it will happily |
|
|
584 | de-/encode 64 bit integers into an C<ASN_INTEGER32> value, or a negative |
|
|
585 | number into an C<SNMP_COUNTER64>. |
|
|
586 | |
501 | OBJECT IDENTIFIEERs cannot have unlimited length, although the limit is |
587 | OBJECT IDENTIFIEERs cannot have unlimited length, although the limit is |
502 | much larger than e.g. the one imposed by SNMP or other protocols. |
588 | much larger than e.g. the one imposed by SNMP or other protocols,a nd is |
|
|
589 | about 4kB. |
503 | |
590 | |
504 | REAL values are not supported and will croak. |
591 | REAL values are not supported and will currently croak. |
505 | |
592 | |
506 | This module has undergone little to no testing so far. |
593 | This module has undergone little to no testing so far. |
507 | |
594 | |
508 | =head2 ITHREADS SUPPORT |
595 | =head2 ITHREADS SUPPORT |
509 | |
596 | |