14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.asn1; 24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException; 44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.util.Enumeration; 54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/** 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * Note: this class is for processing DER/DL encoded sequences only. 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */ 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromclass LazyEncodedSequence 104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Sequence 114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{ 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private byte[] encoded; 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom LazyEncodedSequence( 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom byte[] encoded) 164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws IOException 174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.encoded = encoded; 194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private void parse() 224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Enumeration en = new LazyConstructionEnumeration(encoded); 244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom while (en.hasMoreElements()) 264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom seq.addElement(en.nextElement()); 284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom encoded = null; 314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public synchronized ASN1Encodable getObjectAt(int index) 344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (encoded != null) 364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom parse(); 384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return super.getObjectAt(index); 414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public synchronized Enumeration getObjects() 444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (encoded == null) 464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return super.getObjects(); 484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new LazyConstructionEnumeration(encoded); 514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public synchronized int size() 544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (encoded != null) 564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom parse(); 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return super.size(); 614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive toDERObject() 644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (encoded != null) 664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom parse(); 684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return super.toDERObject(); 714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive toDLObject() 744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (encoded != null) 764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom parse(); 784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return super.toDLObject(); 814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int encodedLength() 844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws IOException 854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (encoded != null) 874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return 1 + StreamUtil.calculateBodyLength(encoded.length) + encoded.length; 894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else 914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return super.toDLObject().encodedLength(); 934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom void encode( 974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1OutputStream out) 984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws IOException 994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (encoded != null) 1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom out.writeEncoded(BERTags.SEQUENCE | BERTags.CONSTRUCTED, encoded); 1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else 1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom super.toDLObject().encode(out); 1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom} 110