ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Convert-BER-XS/XS.pm
(Generate patch)

Comparing Convert-BER-XS/XS.pm (file contents):
Revision 1.18 by root, Sat Apr 20 13:48:53 2019 UTC vs.
Revision 1.19 by root, Sat Apr 20 14:45:03 2019 UTC

73This module implements a I<very> low level BER/DER en-/decoder. 73This module implements a I<very> low level BER/DER en-/decoder.
74 74
75If is tuned for low memory and high speed, while still maintaining some 75If is tuned for low memory and high speed, while still maintaining some
76level of user-friendlyness. 76level of user-friendlyness.
77 77
78=head2 EXPORT TAGS AND CONSTANTS
79
80By default this module doesn't export any symbols, but if you don't want
81to break your keyboard, editor or eyesigh with extreemly long names, I
82recommend importing the C<:all> tag. Still, you can selectively import
83things:
84
85=over
86
87=item :all
88
89All of the below. Really. Rcommended for at least first steps, or if you
90don't care about a few kilobytes of wasted memory (and namespace).
91
92=item :const
93
94All of the stricly ASN.1-related constants defined by this module, the
95same as C<:const_asn :const_index>. Notably, this does not contain
96C<:const_ber_type> and C<:const_snmp>.
97
98A good set to get everything you need to decode and match BER data would be
99C<:decode :const>.
100
101=item C<:const_index>>
102
103The BER tuple array index constants:
104
105 BER_CLASS BER_TAG BER_CONSTRUCTED BER_DATA
106
107=item C<:const_asn>
108
109ASN class values (these are C<0>, C<1>, C<2> and C<3>, reespectively -
110exactly thw two topmost bits from the identifdier octet shifted 6 bits to
111the right):
112
113 ASN_UNIVERSAL ASN_APPLICATION ASN_CONTEXT ASN_PRIVATE
114
115ASN tag values (some of which are aliases, such as C<ASN_OID>). Their
116numerical 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
127The 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
135Constants only relevant to SNMP. These are the tag values used by SNMP in
136the C<ASN_APPLICATION> namespace and have the exact numerical value as in
137BER/RFC 2578.
138
139 SNMP_IPADDRESS SNMP_COUNTER32 SNMP_UNSIGNED32 SNMP_TIMETICKS SNMP_OPAQUE SNMP_COUNTER64
140
141=item C<:decode>
142
143C<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
149C<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
80ASN.1 is a strange language that can be used to describe protocols and 157ASN.1 is a strange language that can be used to describe protocols and
81data structures. It supports various mappings to JSON, XML, but most 158data structures. It supports various mappings to JSON, XML, but most
82importantly, to a various binary encodings such as BER, that is the topic 159importantly, 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
298our %EXPORT_TAGS = ( 375our %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
328our @EXPORT_OK = map @$_, values %EXPORT_TAGS; 407our @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)];
411use Data::Dump; ddx \%EXPORT_TAGS;
331 412
332=head1 PROFILES 413=head1 PROFILES
333 414
334While any BER data can be correctly encoded and decoded out of the box, it 415While any BER data can be correctly encoded and decoded out of the box, it
335can be inconvenient to have to manually decode some values into a "better" 416can be inconvenient to have to manually decode some values into a "better"
480=cut 561=cut
481 562
482our $DEFAULT_PROFILE = new Convert::BER::XS::Profile; 563our $DEFAULT_PROFILE = new Convert::BER::XS::Profile;
483our $SNMP_PROFILE = new Convert::BER::XS::Profile; 564our $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
4941; 5761;
495 577
496=head2 LIMITATIONS 578=head2 LIMITATIONS/NOTES
497 579
498This module can only en-/decode 64 bit signed and unsigned integers, and 580This module can only en-/decode 64 bit signed and unsigned integers, and
499only when your perl supports those. 581only when your perl supports those.
500 582
583This module does not generally care about ranges, i.e. it will happily
584de-/encode 64 bit integers into an C<ASN_INTEGER32> value, or a negative
585number into an C<SNMP_COUNTER64>.
586
501OBJECT IDENTIFIEERs cannot have unlimited length, although the limit is 587OBJECT IDENTIFIEERs cannot have unlimited length, although the limit is
502much larger than e.g. the one imposed by SNMP or other protocols. 588much larger than e.g. the one imposed by SNMP or other protocols,a nd is
589about 4kB.
503 590
504REAL values are not supported and will croak. 591REAL values are not supported and will currently croak.
505 592
506This module has undergone little to no testing so far. 593This module has undergone little to no testing so far.
507 594
508=head2 ITHREADS SUPPORT 595=head2 ITHREADS SUPPORT
509 596

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines