aboutsummaryrefslogtreecommitdiff
path: root/keystore-cts/java/com/google/security/wycheproof/JsonUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'keystore-cts/java/com/google/security/wycheproof/JsonUtil.java')
-rw-r--r--keystore-cts/java/com/google/security/wycheproof/JsonUtil.java91
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));
+ }
+}