1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.internal.net.utils;
17 
18 import java.math.BigInteger;
19 
20 /** BigIntegerUtils provides utility methods for doing Key Exchange. */
21 public final class BigIntegerUtils {
22 
23     /**
24      * Converts the unsigned Hex String to a positive BigInteger.
25      *
26      * @param hexString Hex representation of an unsigned value
27      * @return the argument converted to BigInteger by an unsigned conversion
28      */
unsignedHexStringToBigInteger(String hexString)29     public static BigInteger unsignedHexStringToBigInteger(String hexString) {
30         return new BigInteger(hexString, 16);
31     }
32 
33     /**
34      * Converts the unsigned byte array to a positive BigInteger.
35      *
36      * @param byteArray byte array that represents an unsigned value
37      * @return the argument converted to BigInteger by an unsigned conversion
38      */
unsignedByteArrayToBigInteger(byte[] byteArray)39     public static BigInteger unsignedByteArrayToBigInteger(byte[] byteArray) {
40         return new BigInteger(1/** positive */, byteArray);
41     }
42 
43     /**
44      * Returns a byte array containing the unsigned representation of this BigInteger. Zero-pad on
45      * the left of byte array to desired size.
46      *
47      * @param bigInteger input BigInteger
48      * @param size size of the output byte array
49      * @return the byte array containing the unsigned representation of this BigInteger.
50      */
bigIntegerToUnsignedByteArray(BigInteger bigInteger, int size)51     public static byte[] bigIntegerToUnsignedByteArray(BigInteger bigInteger, int size) {
52         byte[] byteArrayWithSignBit = bigInteger.toByteArray();
53         int len = byteArrayWithSignBit.length;
54         byte[] output = new byte[size];
55 
56         // {@link BigInteger} provides method {@link toByteArray} that returns a byte array
57         // containing the two's-complement representation of this BigInteger (minimum number of
58         // bytes required to represent this BigInteger, including at least one sign bit). This
59         // method first remove additional byte that caused by this sign bit and zero-pad on the left
60         // of byte array to desired size.
61         if (bigInteger.bitLength() % 8 == 0) {
62             len = len - 1;
63             System.arraycopy(byteArrayWithSignBit, 1, output, size - len, len);
64         } else {
65             System.arraycopy(byteArrayWithSignBit, 0, output, size - len, len);
66         }
67 
68         return output;
69     }
70 }
71