1a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak/*
2a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak * Copyright 2013 The Android Open Source Project
3a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak *
4a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak * Licensed under the Apache License, Version 2.0 (the "License");
5a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak * you may not use this file except in compliance with the License.
6a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak * You may obtain a copy of the License at
7a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak *
8a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak *      http://www.apache.org/licenses/LICENSE-2.0
9a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak *
10a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak * Unless required by applicable law or agreed to in writing, software
11a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak * distributed under the License is distributed on an "AS IS" BASIS,
12a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak * See the License for the specific language governing permissions and
14a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak * limitations under the License.
15a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak */
16a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak
17a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniakpackage org.conscrypt;
18a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak
19a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak/**
20a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak *
21a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak * Helper class for dealing with hexadecimal strings.
22a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak *
23a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak */
24a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak// public for testing by TrustedCertificateStoreTest
25a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniakpublic class Hex {
26a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak    private Hex() {}
27a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak
28a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak    private final static char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
29a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak
30a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak    public static String bytesToHexString(byte[] bytes) {
31a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak        char[] buf = new char[bytes.length * 2];
32a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak        int c = 0;
33a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak        for (byte b : bytes) {
34a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak            buf[c++] = DIGITS[(b >> 4) & 0xf];
35a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak            buf[c++] = DIGITS[b & 0xf];
36a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak        }
37a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak        return new String(buf);
38a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak    }
39a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak
40a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak    public static String intToHexString(int i, int minWidth) {
41a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak        int bufLen = 8;  // Max number of hex digits in an int
42a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak        char[] buf = new char[bufLen];
43a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak        int cursor = bufLen;
44a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak
45a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak        do {
46a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak            buf[--cursor] = DIGITS[i & 0xf];
47a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak        } while ((i >>>= 4) != 0 || (bufLen - cursor < minWidth));
48a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak
49a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak        return new String(buf, cursor, bufLen - cursor);
50a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak    }
51a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak
52a7157d7eebb61d55410af93fc960a96bcfe4296ePrzemyslaw Szczepaniak}
53