4 * An ASN1 type for an ObjectIdentifier
\r
5 * We store the oid in an Array.
\r
6 * Copyright (c) 2007 Henri Torgemane
\r
8 * See LICENSE.txt for full license information.
\r
10 package com.hurlant.util.der
\r
12 import flash.utils.ByteArray;
\r
14 public class ObjectIdentifier implements IAsn1Type
\r
16 private var type:uint;
\r
17 private var len:uint;
\r
18 private var oid:Array;
\r
20 public function ObjectIdentifier(type:uint, length:uint, b:*) {
\r
23 if (b is ByteArray) {
\r
24 parse(b as ByteArray);
\r
25 } else if (b is String) {
\r
26 generate(b as String);
\r
28 throw new Error("Invalid call to new ObjectIdentifier");
\r
32 private function generate(s:String):void {
\r
36 private function parse(b:ByteArray):void {
\r
38 // first byte = 40*value1 + value2
\r
39 var o:uint = b.readUnsignedByte();
\r
44 while (b.bytesAvailable>0) {
\r
45 o = b.readUnsignedByte();
\r
46 var last:Boolean = (o&0x80)==0;
\r
57 public function getLength():uint
\r
62 public function getType():uint
\r
67 public function toDER():ByteArray {
\r
69 tmp[0] = oid[0]*40 + oid[1];
\r
70 for (var i:int=2;i<oid.length;i++) {
\r
71 var v:int = parseInt(oid[i]);
\r
74 } else if (v<128*128) {
\r
75 tmp.push( (v>>7)|0x80 );
\r
77 } else if (v<128*128*128) {
\r
78 tmp.push( (v>>14)|0x80 );
\r
79 tmp.push( (v>>7)&0x7f | 0x80 );
\r
81 } else if (v<128*128*128*128) {
\r
82 tmp.push( (v>>21)|0x80 );
\r
83 tmp.push( (v>>14) & 0x7f | 0x80 );
\r
84 tmp.push( (v>>7) & 0x7f | 0x80 );
\r
85 tmp.push( v & 0x7f );
\r
87 throw new Error("OID element bigger than we thought. :(");
\r
94 tmp.unshift(len); // assume length is small enough to fit here.
\r
96 var b:ByteArray = new ByteArray;
\r
97 for (i=0;i<tmp.length;i++) {
\r
103 public function toString():String {
\r
104 return DER.indent+oid.join(".");
\r
107 public function dump():String {
\r
108 return "OID["+type+"]["+len+"]["+toString()+"]";
\r