diff options
Diffstat (limited to 'keystore-cts/java/com/google/security/wycheproof/JsonUtil.java')
-rw-r--r-- | keystore-cts/java/com/google/security/wycheproof/JsonUtil.java | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/keystore-cts/java/com/google/security/wycheproof/JsonUtil.java b/keystore-cts/java/com/google/security/wycheproof/JsonUtil.java new file mode 100644 index 0000000..6ff9e2f --- /dev/null +++ b/keystore-cts/java/com/google/security/wycheproof/JsonUtil.java @@ -0,0 +1,91 @@ +/** + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.security.wycheproof; + +import static java.nio.charset.StandardCharsets.UTF_8; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonParser; +import com.google.gson.stream.JsonReader; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.IOException; +import java.math.BigInteger; + +/** Utilities for reading test vectors in JSON format */ +public class JsonUtil { + + /** + * Reads a set of test vectors from a file. + * @param filename the name of the file, local to the directory with the + * the test vectors. + * @return a JsonObject with a test + * @throws IOException if the test vectors could not be read. + * @throws JsonParseException if the file is not valid JSON. + */ + public static JsonObject getTestVectors(Class ref, String filename) throws + IOException { + // The directory where the test vectors are. + String testVectorsDir = "/"; + try (InputStream is = ref.getResourceAsStream(testVectorsDir + filename)) { + JsonReader reader = new JsonReader(new InputStreamReader(is, UTF_8)); + JsonParser parser = new JsonParser(); + JsonElement elem = parser.parse(reader); + return elem.getAsJsonObject(); + } + } + + /** + * Converts a JsonElement into a byte array. + * @param element a JsonElement containing an encoded byte array. + * Wycheproof represents byte arrays as hexadeciamal strings. + * @throws ClassCastException if element is not a valid string value. + * @throws IllegalStateException - if element contains an array. + */ + public static byte[] asByteArray(JsonElement element) { + String hex = element.getAsString(); + return TestUtil.hexToBytes(hex); + } + + /** + * Converts a JsonElement into a BigInteger. + * @param element a JsonElement containing a BigInteger. + * Wycheproof represents BigIntegers as hexadecimal strings using + * twos complement representation. + * <p> E.g., 31 is represented as "1f", -1 is represented as "f", and + * 255 is represented as "0ff". + * @throws ClassCastException if element is not a valid string value. + * @throws IllegalStateException if element contains an array. + * @throws NumberFormatException if representation of the BigInteger is invalid. + */ + public static BigInteger asBigInteger(JsonElement element) { + String hex = element.getAsString(); + return asBigInteger(hex); + } + public static BigInteger asBigInteger(String hex) { + // TODO(bleichen): Consider to change the representation of BigIntegers in + // Wycheproof as hexadecimal string with a sign. + if (hex.length() % 2 == 1) { + if (hex.charAt(0) >= '0' && hex.charAt(0) <= '7') { + hex = "0" + hex; + } else { + hex = "f" + hex; + } + } + return new BigInteger(TestUtil.hexToBytes(hex)); + } +} |