home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _6becfcd6cc811fd714bfcac7331208e4 < prev    next >
Text File  |  2000-03-23  |  14KB  |  387 lines

  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE>Convert::BER - ASN.1 Basic Encoding Rules</TITLE>
  5. <LINK REL="stylesheet" HREF="../../../Active.css" TYPE="text/css">
  6. <LINK REV="made" HREF="mailto:">
  7. </HEAD>
  8.  
  9. <BODY>
  10. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  11. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  12. <STRONG><P CLASS=block> Convert::BER - ASN.1 Basic Encoding Rules</P></STRONG>
  13. </TD></TR>
  14. </TABLE>
  15.  
  16. <A NAME="__index__"></A>
  17. <!-- INDEX BEGIN -->
  18.  
  19. <UL>
  20.  
  21.     <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
  22.  
  23.     <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
  24.     <LI><A HREF="#note">NOTE</A></LI>
  25.     <LI><A HREF="#description">DESCRIPTION</A></LI>
  26.     <LI><A HREF="#methods">METHODS</A></LI>
  27.     <UL>
  28.  
  29.         <LI><A HREF="#io methods">IO METHODS</A></LI>
  30.     </UL>
  31.  
  32.     <LI><A HREF="#oplist">OPLIST</A></LI>
  33.     <LI><A HREF="#special operators">SPECIAL OPERATORS</A></LI>
  34.     <LI><A HREF="#tags">TAGS</A></LI>
  35.     <LI><A HREF="#subclassing">SUB-CLASSING</A></LI>
  36.     <UL>
  37.  
  38.         <LI><A HREF="#defining new packing operators">DEFINING NEW PACKING OPERATORS</A></LI>
  39.     </UL>
  40.  
  41.     <LI><A HREF="#limitations">LIMITATIONS</A></LI>
  42.     <LI><A HREF="#bugs">BUGS</A></LI>
  43.     <LI><A HREF="#author">AUTHOR</A></LI>
  44.     <LI><A HREF="#copyright">COPYRIGHT</A></LI>
  45. </UL>
  46. <!-- INDEX END -->
  47.  
  48. <HR>
  49. <P>
  50. <H1><A NAME="name">NAME</A></H1>
  51. <P>Convert::BER - ASN.1 Basic Encoding Rules</P>
  52. <P>
  53. <HR>
  54. <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
  55. <UL>
  56. <LI>Linux</LI>
  57. <LI>Solaris</LI>
  58. <LI>Windows</LI>
  59. </UL>
  60. <HR>
  61. <H1><A NAME="synopsis">SYNOPSIS</A></H1>
  62. <PRE>
  63.     use Convert::BER;
  64. </PRE>
  65. <PRE>
  66.  
  67.     $ber = new Convert::BER;</PRE>
  68. <PRE>
  69.  
  70.     $ber->encode(
  71.         INTEGER => 1,
  72.         SEQUENCE => [
  73.             STRING => [ qw(a b c) ]
  74.         ]
  75.     );</PRE>
  76. <PRE>
  77.  
  78.     $ber->decode(
  79.         INTEGER => \$i,
  80.         SEQUENCE => [
  81.             STRING => \@str
  82.         ]
  83.     );</PRE>
  84. <PRE>
  85.  
  86.     $ber->buffer("");</PRE>
  87. <PRE>
  88.  
  89.     $ber->encode(
  90.         SEQUENCE_OF => [ \%hash
  91.             STRING  => sub { $_[0] },
  92.             INTEGER => sub { $hash{ $_[0] } }
  93.         ]
  94.     );</PRE>
  95. <PRE>
  96.  
  97.     $ber->decode(
  98.         SEQUENCE_OF => [ \$count
  99.             STRING  => sub { push @keys, undef; \$keys[-1] },
  100.             INTEGER => sub { push @values, undef; \$values[-1] }
  101.         ]
  102.     );</PRE>
  103. <P>
  104. <HR>
  105. <H1><A NAME="note">NOTE</A></H1>
  106. <P><STRONG>This documentation is still under construction. Convert::BER is a</STRONG>
  107. <STRONG>a very flexable package that supports a lot of options. see the</STRONG>
  108. <STRONG>tests in t/ for examples</STRONG></P>
  109. <P>
  110. <HR>
  111. <H1><A NAME="description">DESCRIPTION</A></H1>
  112. <P><CODE>Convert::BER</CODE> provides an OO interface to encoding and decoding
  113. data into packets using the ASN.1 Basic Encoding Rules (BER)</P>
  114. <P>
  115. <HR>
  116. <H1><A NAME="methods">METHODS</A></H1>
  117. <DL>
  118. <DT><STRONG><A NAME="item_new">new</A></STRONG><BR>
  119. <DD>
  120. <DT><STRONG>new ( BUFFER )</STRONG><BR>
  121. <DD>
  122. <DT><STRONG>new ( opList )</STRONG><BR>
  123. <DD>
  124. <A HREF="#item_new"><CODE>new</CODE></A> creates a new <CODE>Convert::BER</CODE> object.
  125. <P></P>
  126. <DT><STRONG><A NAME="item_encode">encode ( opList )</A></STRONG><BR>
  127. <DD>
  128. Encode data in <EM>opList</EM> appending to the data in the buffer.
  129. <P></P>
  130. <DT><STRONG><A NAME="item_decode">decode ( opList )</A></STRONG><BR>
  131. <DD>
  132. Decode the data in the buffer as described by <EM>opList</EM>, starting
  133. where the last decode finished or position set by <A HREF="#item_pos"><CODE>pos</CODE></A>
  134. <P></P>
  135. <DT><STRONG><A NAME="item_buffer">buffer ( [ BUFFER ] )</A></STRONG><BR>
  136. <DD>
  137. Return the buffer contents. If <EM>BUFFER</EM> is specified the set the buffer
  138. contents and reset pos to zero.
  139. <P></P>
  140. <DT><STRONG><A NAME="item_pos">pos ( [ POS ] )</A></STRONG><BR>
  141. <DD>
  142. Without any arguments <A HREF="#item_pos"><CODE>pos</CODE></A> returns the offset where the last decode
  143. finished, or the last offset set by <A HREF="#item_pos"><CODE>pos</CODE></A>. If <EM>POS</EM> is specified
  144. then <EM>POS</EM> will be where the next decode starts.
  145. <P></P></DL>
  146. <P>
  147. <H2><A NAME="io methods">IO METHODS</A></H2>
  148. <DL>
  149. <DT><STRONG><A NAME="item_read">read ( IO )</A></STRONG><BR>
  150. <DD>
  151. <DT><STRONG><A NAME="item_write">write ( IO )</A></STRONG><BR>
  152. <DD>
  153. <DT><STRONG><A NAME="item_recv">recv ( SOCK )</A></STRONG><BR>
  154. <DD>
  155. <DT><STRONG><A NAME="item_send">send ( SOCK [, ADDR ] )</A></STRONG><BR>
  156. <DD>
  157. </DL>
  158. <P>
  159. <HR>
  160. <H1><A NAME="oplist">OPLIST</A></H1>
  161. <P>An <EM>opList</EM> is a list of <EM>operator</EM>-<EM>value</EM> pairs. An operator can
  162. be any defined below, or any defined by a sub-class of <CODE>Convert::BER</CODE>,
  163. which will probably be derived from the primitives given here.</P>
  164. <P>For the following operators if encoding the <EM>value</EM> is the value of the
  165. data to be encoded, if decoding it is a reference to where the decoded
  166. will be put.</P>
  167. <P>If <EM>value</EM> is a reference to a list then, for encode each item in the list
  168. will be encoded in turn. If decoding then as many a possible items of
  169. teh given type will be decoded an placed into the array, but there must be
  170. at least one or the whole decode will fail.</P>
  171. <P>If <EM>value</EM> is a CODE reference, then the code will be evaluated and the
  172. result used. For encode the code should return either the data to be encoded
  173. or a reference to a list of data to be encoded. For decode the code should
  174. return a reference to where the decoded data should be placed or a
  175. reference to a list. The arguments that are passed to the code are described
  176. below in the <A HREF="#item_SEQUENCE_OF"><CODE>SEQUENCE_OF</CODE></A> section.</P>
  177. <DL>
  178. <DT><STRONG><A NAME="item_BOOLEAN">BOOLEAN</A></STRONG><BR>
  179. <DD>
  180. <DT><STRONG><A NAME="item_INTEGER">INTEGER</A></STRONG><BR>
  181. <DD>
  182. <DT><STRONG><A NAME="item_STRING">STRING</A></STRONG><BR>
  183. <DD>
  184. <DT><STRONG><A NAME="item_NULL">NULL</A></STRONG><BR>
  185. <DD>
  186. <DT><STRONG><A NAME="item_OBJECT_ID">OBJECT_ID</A></STRONG><BR>
  187. <DD>
  188. <DT><STRONG><A NAME="item_ENUM">ENUM</A></STRONG><BR>
  189. <DD>
  190. </DL>
  191. <P>Other operators avaliable are</P>
  192. <DL>
  193. <DT><STRONG><A NAME="item_BIT_STRING">BIT_STRING</A></STRONG><BR>
  194. <DD>
  195. A bit string is represented as a string of <CODE>0</CODE>'s and <CODE>1</CODE>'s, these sequences
  196. can be packed using the perl <A HREF="../../../lib/Pod/perlfunc.html#item_pack"><CODE>pack</CODE></A> operator and the character <CODE>B</CODE>, but
  197. in doing so the number of bits will be rounded up to a multiple of 8
  198. <P></P>
  199. <DT><STRONG><A NAME="item_SEQUENCE">SEQUENCE</A></STRONG><BR>
  200. <DD>
  201. A SEQUENCE can be encoded ....
  202. <P></P>
  203. <DT><STRONG><A NAME="item_SET">SET</A></STRONG><BR>
  204. <DD>
  205. A set it treated in an identical way to a SEQUENCE.
  206. <P></P>
  207. <DT><STRONG><A NAME="item_SEQUENCE_OF">SEQUENCE_OF</A></STRONG><BR>
  208. <DD>
  209. </DL>
  210. <P>
  211. <HR>
  212. <H1><A NAME="special operators">SPECIAL OPERATORS</A></H1>
  213. <DL>
  214. <DT><STRONG><A NAME="item_BER">BER</A></STRONG><BR>
  215. <DD>
  216. <STRONG>Encode</STRONG>: <EM>value</EM> should be a <CODE>Convert::BER</CODE> object, which will
  217. be inserted into the buffer. If <EM>value</EM> is undefined then nothing
  218. is added.
  219. <P><STRONG>Decode</STRONG>: <EM>value</EM> should be a reference to a scalar, which will
  220. contain a <CODE>Convert::BER</CODE> object. This object will contain the
  221. remainder of the current sequence.</P>
  222. <P></P>
  223. <DT><STRONG><A NAME="item_ANY">ANY</A></STRONG><BR>
  224. <DD>
  225. Like <A HREF="#item_BER"><CODE>BER</CODE></A> except that when decoding only the next item is
  226. decoded and placed into the <CODE>Convert::BER</CODE> object returned.
  227. <P></P>
  228. <DT><STRONG><A NAME="item_OPTIONAL">OPTIONAL</A></STRONG><BR>
  229. <DD>
  230. The <EM>value</EM> to this operator must be a reference to an <EM>opList</EM>.
  231. <P><STRONG>Encode</STRONG>: The contents <EM>value</EM> are encoded into the buffer, providing
  232. no entry in the list is undefined.</P>
  233. <P><STRONG>Decode</STRONG>: The contents of <EM>value</EM> are decoded if possible, if
  234. not then decode continues at the next <EM>operator</EM>-<EM>value</EM> pair.</P>
  235. <P></P></DL>
  236. <P>
  237. <HR>
  238. <H1><A NAME="tags">TAGS</A></H1>
  239. <P>Each operator, other than the special operators, has a tag value
  240. associated with it. Some applications require these tag values
  241. to be different from the default values. <CODE>Convert::BER</CODE> supports
  242. two ways of doing this. One method is to sub-class <CODE>Convert::BER</CODE>,
  243. which is described in the next section. For small applications or those
  244. that think sub-classing is just too much then the operatorm may be
  245. passed an arrayref. The array must contain two elements, the first
  246. is the usual operator name and the second if the tag value to use, as
  247. shown below.</P>
  248. <PRE>
  249.     $ber->encode(
  250.         [ SEQUENCE => 0x34 ] => [
  251.             INTEGER => 10,
  252.             STRING  => "A"
  253.         ]
  254.     );</PRE>
  255. <P>This will encode a sequence, with a tag value of <CODE>0x34</CODE>, which will contain
  256. and integer and a string which will have thier default tag values.</P>
  257. <P>
  258. <HR>
  259. <H1><A NAME="subclassing">SUB-CLASSING</A></H1>
  260. <P>For large applications where operators with non default tags are used a lot
  261. the above maechanism can be very erroroneous, for this porpose <CODE>Convert::BER</CODE>
  262. may be sub-classed.</P>
  263. <P>To do this the sub-class must call a method <CODE>define</CODE> as a static method
  264. on the sub-class. The arguments to <CODE>define</CODE> is a list if arrayref's. Each
  265. arrayref will define one new operator. Each arrayref contains three values,
  266. the first is the name of the operator, the second is how the data is encoded
  267. and the third is the tag value. To aid with the creation of these arguments
  268. <CODE>Convert::BER</CODE> exports some variables and constant subroutines.</P>
  269. <P>For each operator defined by <CODE>Convert::BER</CODE>, or a <CODE>Convert::BER</CODE> sub-class,
  270. a scalar variable with the same name is avaliable for import,
  271. for example <CODE>$INTEGER</CODE> is avaliable from <CODE>Convert::BER</CODE>. And any operators
  272. defined by a new sub-class will be avaliable for import from that class.
  273. One of these variables may be used as the second element of each arrayref.</P>
  274. <P><CODE>Convert::BER</CODE> also exports some constant subroutines that can be used
  275. to create the tag value. The subroutines exported are.</P>
  276. <PRE>
  277.         BER_BOOLEAN
  278.         BER_INTEGER
  279.         BER_BIT_STR
  280.         BER_OCTET_STR
  281.         BER_NULL
  282.         BER_OBJECT_ID
  283.         BER_SEQUENCE
  284.         BER_SET
  285. </PRE>
  286. <PRE>
  287.  
  288.         BER_UNIVERSAL
  289.         BER_APPLICATION
  290.         BER_CONTEXT
  291.         BER_PRIVATE
  292.         BER_PRIMITIVE
  293.         BER_CONSTRUCTOR</PRE>
  294. <P>Using this information a sub-class of Convert::BER can be created as shown
  295. below.</P>
  296. <PRE>
  297.     package Net::LDAP::BER;</PRE>
  298. <PRE>
  299.     use Convert::BER qw(/^(\$|BER_)/);</PRE>
  300. <PRE>
  301.     use strict;
  302.     use vars qw($VERSION @ISA);</PRE>
  303. <PRE>
  304.     @ISA = qw(Convert::BER);
  305.     $VERSION = "1.00";</PRE>
  306. <PRE>
  307.     Net::LDAP::BER->define(</PRE>
  308. <PRE>
  309.       # Name            Type      Tag
  310.       ########################################</PRE>
  311. <PRE>
  312.       [ REQ_UNBIND     => $NULL,
  313.                           BER_APPLICATION                   | 0x02 ],
  314. </PRE>
  315. <PRE>
  316.  
  317.       [ REQ_COMPARE    => $SEQUENCE,
  318.                           BER_APPLICATION | BER_CONSTRUCTOR | 0x0E ],</PRE>
  319. <PRE>
  320.  
  321.       [ REQ_ABANDON    => $INTEGER,
  322.                           BER_APPLICATION                   | 0x10 ],
  323.     );</PRE>
  324. <P>This will create a new class <CODE>Net::LDAP::BER</CODE> which has three new operators
  325. avaliable. This class then may be used as follows</P>
  326. <PRE>
  327.     $ber = new Net::LDAP::BER;
  328. </PRE>
  329. <PRE>
  330.  
  331.     $ber->encode(
  332.         REQ_UNBIND => 0,
  333.         REQ_COMPARE => [
  334.             REQ_ABANDON => 123,
  335.         ]
  336.     );</PRE>
  337. <PRE>
  338.     $ber->decode(
  339.         REQ_UNBIND => \$var,
  340.         REQ_COMPARE => [
  341.             REQ_ABANDON => \$num,
  342.         ]
  343.     );</PRE>
  344. <P>Which will encode or decode the data using the formats and tags defined in
  345. the <CODE>Net::LDAP::BER</CODE> sub-class. It also helps to make the code more readable.</P>
  346. <P>
  347. <H2><A NAME="defining new packing operators">DEFINING NEW PACKING OPERATORS</A></H2>
  348. <P>As well as defining new operators which inherit from existing operators
  349. it is also possible to define a new operator and how data is encoded
  350. and decoded. The interface for doing this is still changing but
  351. will be documented here when it is done. to be continued ...</P>
  352. <P>
  353. <HR>
  354. <H1><A NAME="limitations">LIMITATIONS</A></H1>
  355. <P>Convert::BER cannot support tags that contain more bits than
  356. can be stored in a scalar variable, typically this is 32 bits.</P>
  357. <P>Convert::BER cannot support items that have a packed length which cannot be
  358. stored in 32 bits</P>
  359. <DL>
  360. <DT><STRONG><A NAME="item_TODO">TODO</A></STRONG><BR>
  361. <DD>
  362. CONSTRUCTED operator
  363. <P></P></DL>
  364. <P>
  365. <HR>
  366. <H1><A NAME="bugs">BUGS</A></H1>
  367. <P>None known, but there may be some</P>
  368. <P>
  369. <HR>
  370. <H1><A NAME="author">AUTHOR</A></H1>
  371. <P>Graham Barr <<EM><A HREF="mailto:gbarr@pobox.com">gbarr@pobox.com</A></EM>></P>
  372. <P>
  373. <HR>
  374. <H1><A NAME="copyright">COPYRIGHT</A></H1>
  375. <P>Copyright (c) 1995-1999 Graham Barr. All rights reserved.
  376. This program is free software; you can redistribute it and/or modify it
  377. under the same terms as Perl itself.</P>
  378. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  379. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  380. <STRONG><P CLASS=block> Convert::BER - ASN.1 Basic Encoding Rules</P></STRONG>
  381. </TD></TR>
  382. </TABLE>
  383.  
  384. </BODY>
  385.  
  386. </HTML>
  387.