001 /** 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one or more 004 * contributor license agreements. See the NOTICE file distributed with 005 * this work for additional information regarding copyright ownership. 006 * The ASF licenses this file to You under the Apache License, Version 2.0 007 * (the "License"); you may not use this file except in compliance with 008 * the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019 package org.apache.geronimo.util.asn1; 020 021 import java.io.FilterOutputStream; 022 import java.io.IOException; 023 import java.io.OutputStream; 024 025 public class DEROutputStream 026 extends FilterOutputStream implements DERTags 027 { 028 public DEROutputStream( 029 OutputStream os) 030 { 031 super(os); 032 } 033 034 private void writeLength( 035 int length) 036 throws IOException 037 { 038 if (length > 127) 039 { 040 int size = 1; 041 int val = length; 042 043 while ((val >>>= 8) != 0) 044 { 045 size++; 046 } 047 048 write((byte)(size | 0x80)); 049 050 for (int i = (size - 1) * 8; i >= 0; i -= 8) 051 { 052 write((byte)(length >> i)); 053 } 054 } 055 else 056 { 057 write((byte)length); 058 } 059 } 060 061 void writeEncoded( 062 int tag, 063 byte[] bytes) 064 throws IOException 065 { 066 write(tag); 067 writeLength(bytes.length); 068 write(bytes); 069 } 070 071 protected void writeNull() 072 throws IOException 073 { 074 write(NULL); 075 write(0x00); 076 } 077 078 public void writeObject( 079 Object obj) 080 throws IOException 081 { 082 if (obj == null) 083 { 084 writeNull(); 085 } 086 else if (obj instanceof DERObject) 087 { 088 ((DERObject)obj).encode(this); 089 } 090 else if (obj instanceof DEREncodable) 091 { 092 ((DEREncodable)obj).getDERObject().encode(this); 093 } 094 else 095 { 096 throw new IOException("object not DEREncodable"); 097 } 098 } 099 }