4 * An ASN1 type for a Sequence, implemented as an Array
\r
5 * Copyright (c) 2007 Henri Torgemane
\r
7 * See LICENSE.txt for full license information.
\r
9 package com.hurlant.util.der
\r
11 import flash.utils.ByteArray;
\r
13 public dynamic class Sequence extends Array implements IAsn1Type
\r
15 protected var type:uint;
\r
16 protected var len:uint;
\r
18 public function Sequence(type:uint = 0x30, length:uint = 0x00) {
\r
23 public function getLength():uint
\r
28 public function getType():uint
\r
33 public function toDER():ByteArray {
\r
34 var tmp:ByteArray = new ByteArray;
\r
35 for (var i:int=0;i<length;i++) {
\r
36 var e:IAsn1Type = this[i];
\r
37 if (e == null) { // XXX Arguably, I could have a der.Null class instead
\r
38 tmp.writeByte(0x05);
\r
39 tmp.writeByte(0x00);
\r
41 tmp.writeBytes(e.toDER());
\r
44 return DER.wrapDER(type, tmp);
\r
47 public function toString():String {
\r
48 var s:String = DER.indent;
\r
51 for (var i:int=0;i<length;i++) {
\r
52 if (this[i]==null) continue;
\r
53 var found:Boolean = false;
\r
54 for (var key:String in this) {
\r
55 if ( (i.toString()!=key) && this[i]==this[key]) {
\r
56 t += key+": "+this[i]+"\n";
\r
61 if (!found) t+=this[i]+"\n";
\r
63 // var t:String = join("\n");
\r
65 return DER.indent+"Sequence["+type+"]["+len+"][\n"+t+"\n"+s+"]";
\r
70 public function findAttributeValue(oid:String):IAsn1Type {
\r
71 for each (var set:* in this) {
\r
73 var child:* = set[0];
\r
74 if (child is Sequence) {
\r
75 var tmp:* = child[0];
\r
76 if (tmp is ObjectIdentifier) {
\r
77 var id:ObjectIdentifier = tmp as ObjectIdentifier;
\r
78 if (id.toString()==oid) {
\r
79 return child[1] as IAsn1Type;
\r