mirror of
https://github.com/oxen-io/session-android.git
synced 2023-12-14 02:53:01 +01:00
134 lines
2.7 KiB
Java
134 lines
2.7 KiB
Java
package org.thoughtcrime.bouncycastle.asn1;
|
|
|
|
import java.io.FilterOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.OutputStream;
|
|
|
|
public class DEROutputStream
|
|
extends FilterOutputStream implements DERTags
|
|
{
|
|
public DEROutputStream(
|
|
OutputStream os)
|
|
{
|
|
super(os);
|
|
}
|
|
|
|
private void writeLength(
|
|
int length)
|
|
throws IOException
|
|
{
|
|
if (length > 127)
|
|
{
|
|
int size = 1;
|
|
int val = length;
|
|
|
|
while ((val >>>= 8) != 0)
|
|
{
|
|
size++;
|
|
}
|
|
|
|
write((byte)(size | 0x80));
|
|
|
|
for (int i = (size - 1) * 8; i >= 0; i -= 8)
|
|
{
|
|
write((byte)(length >> i));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
write((byte)length);
|
|
}
|
|
}
|
|
|
|
void writeEncoded(
|
|
int tag,
|
|
byte[] bytes)
|
|
throws IOException
|
|
{
|
|
write(tag);
|
|
writeLength(bytes.length);
|
|
write(bytes);
|
|
}
|
|
|
|
void writeTag(int flags, int tagNo)
|
|
throws IOException
|
|
{
|
|
if (tagNo < 31)
|
|
{
|
|
write(flags | tagNo);
|
|
}
|
|
else
|
|
{
|
|
write(flags | 0x1f);
|
|
if (tagNo < 128)
|
|
{
|
|
write(tagNo);
|
|
}
|
|
else
|
|
{
|
|
byte[] stack = new byte[5];
|
|
int pos = stack.length;
|
|
|
|
stack[--pos] = (byte)(tagNo & 0x7F);
|
|
|
|
do
|
|
{
|
|
tagNo >>= 7;
|
|
stack[--pos] = (byte)(tagNo & 0x7F | 0x80);
|
|
}
|
|
while (tagNo > 127);
|
|
|
|
write(stack, pos, stack.length - pos);
|
|
}
|
|
}
|
|
}
|
|
|
|
void writeEncoded(int flags, int tagNo, byte[] bytes)
|
|
throws IOException
|
|
{
|
|
writeTag(flags, tagNo);
|
|
writeLength(bytes.length);
|
|
write(bytes);
|
|
}
|
|
|
|
protected void writeNull()
|
|
throws IOException
|
|
{
|
|
write(NULL);
|
|
write(0x00);
|
|
}
|
|
|
|
public void write(byte[] buf)
|
|
throws IOException
|
|
{
|
|
out.write(buf, 0, buf.length);
|
|
}
|
|
|
|
public void write(byte[] buf, int offSet, int len)
|
|
throws IOException
|
|
{
|
|
out.write(buf, offSet, len);
|
|
}
|
|
|
|
public void writeObject(
|
|
Object obj)
|
|
throws IOException
|
|
{
|
|
if (obj == null)
|
|
{
|
|
writeNull();
|
|
}
|
|
else if (obj instanceof DERObject)
|
|
{
|
|
((DERObject)obj).encode(this);
|
|
}
|
|
else if (obj instanceof DEREncodable)
|
|
{
|
|
((DEREncodable)obj).getDERObject().encode(this);
|
|
}
|
|
else
|
|
{
|
|
throw new IOException("object not DEREncodable");
|
|
}
|
|
}
|
|
}
|