1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.util.encoders;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.ByteArrayOutputStream;
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.IOException;
5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.OutputStream;
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class Hex
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private static final Encoder encoder = new HexEncoder();
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * encode the input data producing a Hex encoded byte array.
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @return a byte array containing the Hex encoded data.
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static byte[] encode(
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[]    data)
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return encode(data, 0, data.length);
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * encode the input data producing a Hex encoded byte array.
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @return a byte array containing the Hex encoded data.
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static byte[] encode(
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[]    data,
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int       off,
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int       length)
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ByteArrayOutputStream    bOut = new ByteArrayOutputStream();
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        try
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            encoder.encode(data, off, length, bOut);
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        catch (IOException e)
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new RuntimeException("exception encoding Hex string: " + e);
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return bOut.toByteArray();
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Hex encode the byte data writing it to the given output stream.
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @return the number of bytes produced.
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static int encode(
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[]         data,
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        OutputStream   out)
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        throws IOException
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return encoder.encode(data, 0, data.length, out);
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Hex encode the byte data writing it to the given output stream.
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @return the number of bytes produced.
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static int encode(
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[]         data,
66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int            off,
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int            length,
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        OutputStream   out)
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        throws IOException
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return encoder.encode(data, off, length, out);
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * decode the Hex encoded input data. It is assumed the input data is valid.
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @return a byte array representing the decoded data.
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static byte[] decode(
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[]    data)
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ByteArrayOutputStream    bOut = new ByteArrayOutputStream();
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        try
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            encoder.decode(data, 0, data.length, bOut);
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        catch (IOException e)
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new RuntimeException("exception decoding Hex string: " + e);
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return bOut.toByteArray();
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * decode the Hex encoded String data - whitespace will be ignored.
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @return a byte array representing the decoded data.
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static byte[] decode(
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        String    data)
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ByteArrayOutputStream    bOut = new ByteArrayOutputStream();
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        try
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            encoder.decode(data, bOut);
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        catch (IOException e)
111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new RuntimeException("exception decoding Hex string: " + e);
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return bOut.toByteArray();
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * decode the Hex encoded String data writing it to the given output stream,
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * whitespace characters will be ignored.
121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @return the number of bytes produced.
123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static int decode(
125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        String          data,
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        OutputStream    out)
127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        throws IOException
128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return encoder.decode(data, out);
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
132