From 29e29eb5a292ea02bf257a548b2ba2d85a314942 Mon Sep 17 00:00:00 2001
From: Thai Duong <thaidn@google.com>
Date: Fri, 18 Aug 2017 15:55:04 -0700
Subject: [PATCH] Fix Lint and compatibility issues.

Change-Id: I62a4a98c2ebf5651576a42c065e9ea3582b1f041
ORIGINAL_AUTHOR=Thai Duong <thaidn@google.com>
GitOrigin-RevId: d7860b81c481959dfd6fac540026ba3c9747fa4a
---
 WORKSPACE                                     |  6 ++++++
 apps/googlepayments/BUILD                     |  2 +-
 .../PaymentMethodTokenHybridDecrypt.java      |  8 ++++---
 .../PaymentMethodTokenHybridEncrypt.java      | 21 ++++++++++++-------
 .../payments/PaymentMethodTokenRecipient.java |  5 +++--
 .../payments/PaymentMethodTokenSender.java    | 19 ++++++++++-------
 .../PaymentMethodTokenRecipientTest.java      |  6 +++---
 doc/JAVA-HOWTO.md                             |  4 ++--
 java/BUILD                                    | 14 ++++++++-----
 .../java/com/google/crypto/tink/config/BUILD  |  2 +-
 .../com/google/crypto/tink/integration/BUILD  |  3 ++-
 .../java/com/google/crypto/tink/subtle/BUILD  |  1 -
 .../google/crypto/tink/config/ConfigTest.java |  8 +++----
 proto/config.proto                            |  2 +-
 tools/testing/BUILD                           |  8 +++----
 .../crypto/tink/tinkey/AddCommandTest.java    |  2 ++
 .../crypto/tink/tinkey/RotateCommandTest.java |  2 ++
 17 files changed, 70 insertions(+), 43 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index a3158d2a8..86dc7eeca 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -183,6 +183,12 @@ maven_jar(
     sha1 = "949abe1460757b8dc9902c562f83e49675444572",
 )
 
+maven_jar(
+    name = "joda_time",
+    artifact = "joda-time:joda-time:2.9.9",
+    sha1 = "f7b520c458572890807d143670c9b24f4de90897",
+)
+
 maven_jar(
     name = "junit_junit_4",
     artifact = "junit:junit:jar:4.12",
diff --git a/apps/googlepayments/BUILD b/apps/googlepayments/BUILD
index bd5dcff95..5f3356f2f 100644
--- a/apps/googlepayments/BUILD
+++ b/apps/googlepayments/BUILD
@@ -1,4 +1,4 @@
-package(default_visibility = ["//visibility:public"])
+package(default_visibility = ["//visibility:private"])
 
 licenses(["notice"])  # Apache 2.0
 
diff --git a/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenHybridDecrypt.java b/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenHybridDecrypt.java
index 86191af69..ea97e56bd 100644
--- a/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenHybridDecrypt.java
+++ b/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenHybridDecrypt.java
@@ -44,7 +44,8 @@ class PaymentMethodTokenHybridDecrypt implements HybridDecrypt {
     try {
       JSONObject json = new JSONObject(new String(ciphertext, StandardCharsets.UTF_8));
       validate(json);
-      byte[] kem = PaymentMethodTokenUtil.BASE64.decode(json.getString(PaymentMethodTokenConstants.JSON_EPHEMERAL_PUBLIC_KEY));
+      byte[] kem = PaymentMethodTokenUtil.BASE64.decode(json.getString(
+          PaymentMethodTokenConstants.JSON_EPHEMERAL_PUBLIC_KEY));
       int symmetricKeySize = PaymentMethodTokenConstants.AES_CTR_KEY_SIZE
           + PaymentMethodTokenConstants.HMAC_SHA256_KEY_SIZE;
       byte[] demKey = recipientKem.generateKey(
@@ -60,7 +61,8 @@ class PaymentMethodTokenHybridDecrypt implements HybridDecrypt {
           json.getString(PaymentMethodTokenConstants.JSON_ENCRYPTED_MESSAGE_KEY));
       byte[] computedTag = PaymentMethodTokenUtil.hmacSha256(hmacSha256Key,
           encryptedMessage);
-      byte[] expectedTag = PaymentMethodTokenUtil.BASE64.decode(json.getString(PaymentMethodTokenConstants.JSON_TAG_KEY));
+      byte[] expectedTag = PaymentMethodTokenUtil.BASE64.decode(json.getString(
+          PaymentMethodTokenConstants.JSON_TAG_KEY));
       if (!SubtleUtil.arrayEquals(expectedTag, computedTag)) {
         throw new GeneralSecurityException("cannot decrypt; invalid MAC");
       }
@@ -68,7 +70,7 @@ class PaymentMethodTokenHybridDecrypt implements HybridDecrypt {
           PaymentMethodTokenConstants.AES_CTR_KEY_SIZE);
       return PaymentMethodTokenUtil.aesCtr(aesCtrKey, encryptedMessage);
     } catch (JSONException e) {
-      throw new GeneralSecurityException("cannot decrypt; failed to parse JSON", e);
+      throw new GeneralSecurityException("cannot decrypt; failed to parse JSON");
     }
   }
 
diff --git a/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenHybridEncrypt.java b/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenHybridEncrypt.java
index 0e8108cc9..7aedfe4ff 100644
--- a/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenHybridEncrypt.java
+++ b/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenHybridEncrypt.java
@@ -23,6 +23,7 @@ import java.nio.charset.StandardCharsets;
 import java.security.GeneralSecurityException;
 import java.security.interfaces.ECPublicKey;
 import java.util.Arrays;
+import org.json.JSONException;
 import org.json.JSONObject;
 
 /**
@@ -56,13 +57,17 @@ class PaymentMethodTokenHybridEncrypt implements HybridEncrypt {
         kemKey.getSymmetricKey(), PaymentMethodTokenConstants.AES_CTR_KEY_SIZE, symmetricKeySize);
     byte[] tag = PaymentMethodTokenUtil.hmacSha256(hmacSha256Key, ciphertext);
     byte[] ephemeralPublicKey = kemKey.getKemBytes();
-    return new JSONObject()
-        .put(PaymentMethodTokenConstants.JSON_ENCRYPTED_MESSAGE_KEY,
-            PaymentMethodTokenUtil.BASE64.encode(ciphertext))
-        .put(PaymentMethodTokenConstants.JSON_TAG_KEY, PaymentMethodTokenUtil.BASE64.encode(tag))
-        .put(PaymentMethodTokenConstants.JSON_EPHEMERAL_PUBLIC_KEY,
-            PaymentMethodTokenUtil.BASE64.encode(ephemeralPublicKey))
-        .toString()
-        .getBytes(StandardCharsets.UTF_8);
+    try {
+      return new JSONObject()
+          .put(PaymentMethodTokenConstants.JSON_ENCRYPTED_MESSAGE_KEY,
+              PaymentMethodTokenUtil.BASE64.encode(ciphertext))
+          .put(PaymentMethodTokenConstants.JSON_TAG_KEY, PaymentMethodTokenUtil.BASE64.encode(tag))
+          .put(PaymentMethodTokenConstants.JSON_EPHEMERAL_PUBLIC_KEY,
+              PaymentMethodTokenUtil.BASE64.encode(ephemeralPublicKey))
+          .toString()
+          .getBytes(StandardCharsets.UTF_8);
+    } catch (JSONException e) {
+      throw new GeneralSecurityException("cannot encrypt; JSON error");
+    }
   }
 }
diff --git a/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenRecipient.java b/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenRecipient.java
index 477adaf53..f436e13ad 100644
--- a/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenRecipient.java
+++ b/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenRecipient.java
@@ -213,7 +213,7 @@ public final class PaymentMethodTokenRecipient {
       }
       throw new IllegalArgumentException("unsupported version: " + protocolVersion);
     } catch (JSONException e) {
-      throw new GeneralSecurityException("cannot unseal; invalid JSON message", e);
+      throw new GeneralSecurityException("cannot unseal; invalid JSON message");
     }
   }
 
@@ -266,7 +266,8 @@ public final class PaymentMethodTokenRecipient {
     throw new GeneralSecurityException("cannot decrypt");
   }
 
-  private void validateV1(final JSONObject jsonMsg) throws GeneralSecurityException {
+  private void validateV1(final JSONObject jsonMsg)
+      throws GeneralSecurityException, JSONException {
     if (!jsonMsg.has(PaymentMethodTokenConstants.JSON_PROTOCOL_VERSION_KEY)
         || !jsonMsg.has(PaymentMethodTokenConstants.JSON_SIGNATURE_KEY)
         || !jsonMsg.has(PaymentMethodTokenConstants.JSON_SIGNED_MESSAGE_KEY)
diff --git a/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenSender.java b/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenSender.java
index 09aa242bc..4360931d3 100644
--- a/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenSender.java
+++ b/apps/googlepayments/src/main/java/com/google/payments/PaymentMethodTokenSender.java
@@ -23,6 +23,7 @@ import java.nio.charset.StandardCharsets;
 import java.security.GeneralSecurityException;
 import java.security.interfaces.ECPrivateKey;
 import java.security.interfaces.ECPublicKey;
+import org.json.JSONException;
 import org.json.JSONObject;
 
 /**
@@ -184,12 +185,16 @@ public final class PaymentMethodTokenSender {
         PaymentMethodTokenConstants.PROTOCOL_VERSION_EC_V1,
         signedMessage);
     byte[] signature = signer.sign(toSignBytes);
-    return new JSONObject()
-        .put(PaymentMethodTokenConstants.JSON_SIGNED_MESSAGE_KEY, signedMessage)
-        .put(PaymentMethodTokenConstants.JSON_PROTOCOL_VERSION_KEY,
-            PaymentMethodTokenConstants.PROTOCOL_VERSION_EC_V1)
-        .put(PaymentMethodTokenConstants.JSON_SIGNATURE_KEY,
-            PaymentMethodTokenUtil.BASE64.encode(signature))
-        .toString();
+    try {
+      return new JSONObject()
+          .put(PaymentMethodTokenConstants.JSON_SIGNED_MESSAGE_KEY, signedMessage)
+          .put(PaymentMethodTokenConstants.JSON_PROTOCOL_VERSION_KEY,
+              PaymentMethodTokenConstants.PROTOCOL_VERSION_EC_V1)
+          .put(PaymentMethodTokenConstants.JSON_SIGNATURE_KEY,
+              PaymentMethodTokenUtil.BASE64.encode(signature))
+          .toString();
+    } catch (JSONException e) {
+      throw new GeneralSecurityException("cannot seal; JSON error");
+    }
   }
 }
diff --git a/apps/googlepayments/src/test/java/com/google/payments/PaymentMethodTokenRecipientTest.java b/apps/googlepayments/src/test/java/com/google/payments/PaymentMethodTokenRecipientTest.java
index 5b4771bca..c8b6dc962 100644
--- a/apps/googlepayments/src/test/java/com/google/payments/PaymentMethodTokenRecipientTest.java
+++ b/apps/googlepayments/src/test/java/com/google/payments/PaymentMethodTokenRecipientTest.java
@@ -211,7 +211,7 @@ public class PaymentMethodTokenRecipientTest {
     trustedKeysJson.put("keys", new JSONArray().put(key1).put(key2));
 
     try {
-      PaymentMethodTokenRecipient recipient = new PaymentMethodTokenRecipient.Builder()
+      PaymentMethodTokenRecipient unused = new PaymentMethodTokenRecipient.Builder()
           .senderVerifyingKeys(trustedKeysJson.toString())
           .recipientId(RECIPIENT_ID)
           .addRecipientPrivateKey(MERCHANT_PRIVATE_KEY_PKCS8_BASE64)
@@ -287,7 +287,7 @@ public class PaymentMethodTokenRecipientTest {
       recipient.unseal(payload.toString());
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertEquals("cannot unseal; invalid JSON message", e.getMessage());
+      // expected
     }
   }
 
@@ -305,7 +305,7 @@ public class PaymentMethodTokenRecipientTest {
       recipient.unseal(payload.toString());
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertEquals("cannot unseal; invalid JSON message", e.getMessage());
+      // expected
     }
   }
 }
diff --git a/doc/JAVA-HOWTO.md b/doc/JAVA-HOWTO.md
index 66932f93b..c4a528ca0 100644
--- a/doc/JAVA-HOWTO.md
+++ b/doc/JAVA-HOWTO.md
@@ -42,7 +42,7 @@ For custom initialization the registration can proceed directly via `Registry`-c
 ```
 
 For more complex use cases, with multiple primitives and custom implementations,
-one can use Tink configuration tools from [`com.google.crypto.tink.config`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/config)-package, 
+one can use Tink configuration tools from [`com.google.crypto.tink.config`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/config)-package,
 which provides a configuration language for specifying key types and their key
 managers to be used by Tink at runtime, and utilities for handling the
 configurations.  This allows for customizable configuration without need of
@@ -208,7 +208,7 @@ To create a custom implementation of a primitive proceed as follows:
 2. Define protocol buffers that hold key material and parameters for the custom
    cryptographic scheme; the name of the key protocol buffer (a.k.a. type URL)
    determines the _key type_ for the custom implementation.
-3. Implement [`KeyManager`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/KeyManager.java) 
+3. Implement [`KeyManager`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/KeyManager.java)
    interface for the _primitive_ from step #1 and the _key type_ from step #2.
 
 To use a custom implementation of a primitive in an application, register with
diff --git a/java/BUILD b/java/BUILD
index 70039d44a..ad470d6ac 100644
--- a/java/BUILD
+++ b/java/BUILD
@@ -57,6 +57,15 @@ java_library(
     ],
 )
 
+java_library(
+    name = "config_android",
+    visibility = ["//visibility:public"],
+    exports = [
+        "//java/src/main/java/com/google/crypto/tink/config:android",
+        "//java/src/main/java/com/google/crypto/tink/config:tink_catalogue_android",
+    ],
+)
+
 # RESTRICTED
 
 FULL_PROTOS = [
@@ -113,7 +122,6 @@ java_library(
 java_library(
     name = "cleartext_keyset_handle",
     visibility = [
-        "//tools/testing:__subpackages__",
         "//tools/tinkey:__pkg__",
     ],
     exports = [
@@ -123,10 +131,6 @@ java_library(
 
 java_library(
     name = "cleartext_keyset_handle_android",
-    visibility = [
-        "//tools/testing:__subpackages__",
-        "//tools/tinkey:__pkg__",
-    ],
     exports = [
         "//java/src/main/java/com/google/crypto/tink:cleartext_keyset_handle_android",
     ],
diff --git a/java/src/main/java/com/google/crypto/tink/config/BUILD b/java/src/main/java/com/google/crypto/tink/config/BUILD
index a8b07639f..6709d53e6 100644
--- a/java/src/main/java/com/google/crypto/tink/config/BUILD
+++ b/java/src/main/java/com/google/crypto/tink/config/BUILD
@@ -29,7 +29,7 @@ java_library(
     javacopts = JAVACOPTS,
     deps = [
         "tink_catalogue_android",
-        "//java/src/main/java/com/google/crypto/tink",
+        "//java/src/main/java/com/google/crypto/tink:android",
         "//proto:config_java_proto_lite",
     ],
 )
diff --git a/java/src/main/java/com/google/crypto/tink/integration/BUILD b/java/src/main/java/com/google/crypto/tink/integration/BUILD
index 2afda1987..092d6bd28 100644
--- a/java/src/main/java/com/google/crypto/tink/integration/BUILD
+++ b/java/src/main/java/com/google/crypto/tink/integration/BUILD
@@ -26,13 +26,14 @@ java_library(
     runtime_deps = [
         "@com_fasterxml_jackson_annotations//jar",
         "@com_fasterxml_jackson_databind//jar",
+        "@com_google_code_gson_gson//jar",
+        "@joda_time//jar",
         "@org_apache_commons_logging//jar",
         "@org_apache_httpcomponents_httpclient//jar",
         "@org_apache_httpcomponents_httpcore//jar",
     ],
     deps = [
         "//java/src/main/java/com/google/crypto/tink",
-        "//java/src/main/java/com/google/crypto/tink/subtle:aead",
         "@com_amazonaws_sdk_core//jar",
         "@com_amazonaws_sdk_kms//jar",
         "@com_google_api_client//jar",
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/BUILD b/java/src/main/java/com/google/crypto/tink/subtle/BUILD
index cc98c4168..dc9db938d 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/BUILD
+++ b/java/src/main/java/com/google/crypto/tink/subtle/BUILD
@@ -22,7 +22,6 @@ java_library(
     ],
     javacopts = JAVACOPTS,
     deps = [
-        "//java/src/main/java/com/google/crypto/tink:primitives",
         "@com_google_errorprone_error_prone_annotations//jar",
     ],
 )
diff --git a/java/src/test/java/com/google/crypto/tink/config/ConfigTest.java b/java/src/test/java/com/google/crypto/tink/config/ConfigTest.java
index 4ae7612aa..459803bad 100644
--- a/java/src/test/java/com/google/crypto/tink/config/ConfigTest.java
+++ b/java/src/test/java/com/google/crypto/tink/config/ConfigTest.java
@@ -47,14 +47,14 @@ public class ConfigTest {
         .setNewKeyAllowed(true)
         .build();
     try {
-      KeyManager<Aead> keyManager = Registry.getKeyManager(typeUrl);
+      KeyManager<Aead> unused = Registry.getKeyManager(typeUrl);
       fail();
     } catch (GeneralSecurityException e) {
       // expected
     }
 
     Config.registerKeyType(entry);
-    KeyManager<Aead> keyManager = Registry.getKeyManager(typeUrl);
+    KeyManager<Aead> unused = Registry.getKeyManager(typeUrl);
   }
 
   @Test
@@ -74,7 +74,7 @@ public class ConfigTest {
       // Initially, there should be no key manager in the registry.
       for (KeyTypeEntry entry : tinkConfig.getEntryList()) {
         try {
-          KeyManager<?> keyManager = Registry.getKeyManager(entry.getTypeUrl());
+          KeyManager<?> unused = Registry.getKeyManager(entry.getTypeUrl());
           fail("Registry should contain no manager for " + entry.getTypeUrl());
         } catch (GeneralSecurityException e) {
           // expected
@@ -83,7 +83,7 @@ public class ConfigTest {
       // After registering the config the registry should contain the key managers.
       Config.register(tinkConfig);
       for (KeyTypeEntry entry : tinkConfig.getEntryList()) {
-        KeyManager<?> keyManager = Registry.getKeyManager(entry.getTypeUrl());
+        KeyManager<?> unused = Registry.getKeyManager(entry.getTypeUrl());
       }
       // Another register-attmpt should fail, as key managers already exist.
       try {
diff --git a/proto/config.proto b/proto/config.proto
index 92b98f11a..239d1a9d0 100644
--- a/proto/config.proto
+++ b/proto/config.proto
@@ -40,4 +40,4 @@ message KeyTypeEntry {
 message TinkConfig {
   string config_name = 1;
   repeated KeyTypeEntry entry = 2;
-}
\ No newline at end of file
+}
diff --git a/tools/testing/BUILD b/tools/testing/BUILD
index fe9accb92..a9e5d84bb 100644
--- a/tools/testing/BUILD
+++ b/tools/testing/BUILD
@@ -4,6 +4,7 @@ load("//java/build_defs:javac.bzl", "JAVACOPTS")
 
 java_binary(
     name = "hybrid_encrypt_cli_java",
+    testonly = 1,
     srcs = [
         "java/com/google/crypto/tink/testing/HybridEncryptCli.java",
     ],
@@ -11,14 +12,14 @@ java_binary(
     main_class = "com.google.crypto.tink.testing.HybridEncryptCli",
     visibility = ["//tools/testing:__subpackages__"],
     deps = [
-        "//java",
-        "//java:cleartext_keyset_handle",
         "//java:config",
+        "//java:testonly",
     ],
 )
 
 java_binary(
     name = "hybrid_decrypt_cli_java",
+    testonly = 1,
     srcs = [
         "java/com/google/crypto/tink/testing/HybridDecryptCli.java",
     ],
@@ -26,8 +27,7 @@ java_binary(
     main_class = "com.google.crypto.tink.testing.HybridDecryptCli",
     visibility = ["//tools/testing:__subpackages__"],
     deps = [
-        "//java",
-        "//java:cleartext_keyset_handle",
         "//java:config",
+        "//java:testonly",
     ],
 )
diff --git a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/AddCommandTest.java b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/AddCommandTest.java
index a96fcbef2..9fdc52d8b 100644
--- a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/AddCommandTest.java
+++ b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/AddCommandTest.java
@@ -17,6 +17,7 @@
 package com.google.crypto.tink.tinkey;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.KeysetReader;
 import com.google.crypto.tink.TestUtil;
@@ -92,6 +93,7 @@ public class AddCommandTest {
           outputStream, OUTPUT_FORMAT,
           emptyStream, INPUT_FORMAT,
           masterKeyUri, credentialPath, NEW_TEMPLATE);
+      fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       TestUtil.assertExceptionContains(e, "empty keyset");
     }
diff --git a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/RotateCommandTest.java b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/RotateCommandTest.java
index 40752bd0c..77bd87b09 100644
--- a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/RotateCommandTest.java
+++ b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/RotateCommandTest.java
@@ -17,6 +17,7 @@
 package com.google.crypto.tink.tinkey;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.KeysetReader;
 import com.google.crypto.tink.TestUtil;
@@ -92,6 +93,7 @@ public class RotateCommandTest {
           outputStream, OUTPUT_FORMAT,
           emptyStream, INPUT_FORMAT,
           masterKeyUri, credentialPath, NEW_TEMPLATE);
+      fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       TestUtil.assertExceptionContains(e, "empty keyset");
     }
-- 
GitLab