test_class.file: java_src/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyFactoryTest.java
test_class.identifier: PublicKeyVerifyFactoryTest
test_case.body: @Test
    public void testMultipleKeys() throws Exception {
      EcdsaPrivateKey tinkPrivateKey =
          TestUtil.generateEcdsaPrivKey(
              EllipticCurveType.NIST_P521, HashType.SHA512, EcdsaSignatureEncoding.DER);
      Key tink =
          TestUtil.createKey(
              TestUtil.createKeyData(
                  tinkPrivateKey.getPublicKey(),
                  new EcdsaVerifyKeyManager().getKeyType(),
                  KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
              1,
              KeyStatusType.ENABLED,
              OutputPrefixType.TINK);
  
      EcdsaPrivateKey legacyPrivateKey =
          TestUtil.generateEcdsaPrivKey(
              EllipticCurveType.NIST_P256, HashType.SHA256, EcdsaSignatureEncoding.DER);
      Key legacy =
          TestUtil.createKey(
              TestUtil.createKeyData(
                  legacyPrivateKey.getPublicKey(),
                  new EcdsaVerifyKeyManager().getKeyType(),
                  KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
              2,
              KeyStatusType.ENABLED,
              OutputPrefixType.LEGACY);
  
      EcdsaPrivateKey rawPrivateKey =
          TestUtil.generateEcdsaPrivKey(
              EllipticCurveType.NIST_P384, HashType.SHA512, EcdsaSignatureEncoding.DER);
      Key raw =
          TestUtil.createKey(
              TestUtil.createKeyData(
                  rawPrivateKey.getPublicKey(),
                  new EcdsaVerifyKeyManager().getKeyType(),
                  KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
              3,
              KeyStatusType.ENABLED,
              OutputPrefixType.RAW);
  
      EcdsaPrivateKey crunchyPrivateKey =
          TestUtil.generateEcdsaPrivKey(
              EllipticCurveType.NIST_P384, HashType.SHA512, EcdsaSignatureEncoding.DER);
      Key crunchy =
          TestUtil.createKey(
              TestUtil.createKeyData(
                  crunchyPrivateKey.getPublicKey(),
                  new EcdsaVerifyKeyManager().getKeyType(),
                  KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
              4,
              KeyStatusType.ENABLED,
              OutputPrefixType.CRUNCHY);
  
      Key[] keys = new Key[] {tink, legacy, raw, crunchy};
      EcdsaPrivateKey[] privateKeys =
          new EcdsaPrivateKey[] {tinkPrivateKey, legacyPrivateKey, rawPrivateKey, crunchyPrivateKey};
  
      int j = keys.length;
      for (int i = 0; i < j; i++) {
        KeysetHandle keysetHandle =
            TestUtil.createKeysetHandle(
                TestUtil.createKeyset(
                    keys[i], keys[(i + 1) % j], keys[(i + 2) % j], keys[(i + 3) % j]));
        PublicKeyVerify verifier = PublicKeyVerifyFactory.getPrimitive(keysetHandle);
        // Signature from any keys in the keyset should be valid.
        for (int k = 0; k < j; k++) {
          PublicKeySign signer =
              PublicKeySignFactory.getPrimitive(
                  TestUtil.createKeysetHandle(
                      TestUtil.createKeyset(
                          TestUtil.createKey(
                              TestUtil.createKeyData(
                                  privateKeys[k],
                                  new EcdsaSignKeyManager().getKeyType(),
                                  KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
                              keys[k].getKeyId(),
                              KeyStatusType.ENABLED,
                              keys[k].getOutputPrefixType()))));
          byte[] plaintext = Random.randBytes(1211);
          byte[] sig = signer.sign(plaintext);
          try {
            verifier.verify(sig, plaintext);
          } catch (GeneralSecurityException ex) {
            fail("Valid signature, should not throw exception: " + k);
          }
        }
  
        // Signature from a random key should be invalid.
        EcdsaPrivateKey randomPrivKey =
            TestUtil.generateEcdsaPrivKey(
                EllipticCurveType.NIST_P521, HashType.SHA512, EcdsaSignatureEncoding.DER);
        PublicKeySign signer =
            PublicKeySignFactory.getPrimitive(
                TestUtil.createKeysetHandle(
                    TestUtil.createKeyset(
                        TestUtil.createKey(
                            TestUtil.createKeyData(
                                randomPrivKey,
                                new EcdsaSignKeyManager().getKeyType(),
                                KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
                            1,
                            KeyStatusType.ENABLED,
                            keys[0].getOutputPrefixType()))));
        byte[] plaintext = Random.randBytes(1211);
        byte[] sig = signer.sign(plaintext);
        try {
          verifier.verify(sig, plaintext);
          fail("Invalid signature, should have thrown exception");
        } catch (GeneralSecurityException expected) {
          // Expected
        }
      }
    }
test_case.class_method_signature: PublicKeyVerifyFactoryTest.testMultipleKeys()
test_case.full_signature: @Test public void testMultipleKeys()
test_case.identifier: testMultipleKeys
test_case.invocations: generateEcdsaPrivKey createKey createKeyData getPublicKey getKeyType generateEcdsaPrivKey createKey createKeyData getPublicKey getKeyType generateEcdsaPrivKey createKey createKeyData getPublicKey getKeyType generateEcdsaPrivKey createKey createKeyData getPublicKey getKeyType createKeysetHandle createKeyset getPrimitive getPrimitive createKeysetHandle createKeyset createKey createKeyData getKeyType getKeyId getOutputPrefixType randBytes sign verify fail generateEcdsaPrivKey getPrimitive createKeysetHandle createKeyset createKey createKeyData getKeyType getOutputPrefixType randBytes sign verify fail
test_case.modifiers: @Test public
test_case.parameters: ()
test_case.return: void
test_case.signature: void testMultipleKeys()
focal_class.file: java_src/src/main/java/com/google/crypto/tink/signature/PublicKeyVerifyFactory.java
focal_class.identifier: PublicKeyVerifyFactory
focal_class.class_method_signature: PublicKeyVerifyFactory.getPrimitive(KeysetHandle keysetHandle)
focal_class.full_signature: @Deprecated public static PublicKeyVerify getPrimitive(KeysetHandle keysetHandle)
focal_class.identifier: getPrimitive
focal_class.modifiers: @Deprecated public static
focal_class.parameters: (KeysetHandle keysetHandle)
focal_class.return: PublicKeyVerify
focal_class.signature: PublicKeyVerify getPrimitive(KeysetHandle keysetHandle)
focal_class.class_method_signature: PublicKeyVerifyFactory.getPrimitive(
        KeysetHandle keysetHandle, final KeyManager<PublicKeyVerify> keyManager)
focal_class.full_signature: @Deprecated public static PublicKeyVerify getPrimitive(
        KeysetHandle keysetHandle, final KeyManager<PublicKeyVerify> keyManager)
focal_class.identifier: getPrimitive
focal_class.modifiers: @Deprecated public static
focal_class.parameters: (
        KeysetHandle keysetHandle, final KeyManager<PublicKeyVerify> keyManager)
focal_class.return: PublicKeyVerify
focal_class.signature: PublicKeyVerify getPrimitive(
        KeysetHandle keysetHandle, final KeyManager<PublicKeyVerify> keyManager)
focal_method.body: @Deprecated
    public static PublicKeyVerify getPrimitive(KeysetHandle keysetHandle)
        throws GeneralSecurityException {
      return getPrimitive(keysetHandle, /* keyManager= */ null);
    }
focal_method.class_method_signature: PublicKeyVerifyFactory.getPrimitive(KeysetHandle keysetHandle)
focal_method.full_signature: @Deprecated public static PublicKeyVerify getPrimitive(KeysetHandle keysetHandle)
focal_method.identifier: getPrimitive
focal_method.invocations: getPrimitive
focal_method.modifiers: @Deprecated public static
focal_method.parameters: (KeysetHandle keysetHandle)
focal_method.return: PublicKeyVerify
focal_method.signature: PublicKeyVerify getPrimitive(KeysetHandle keysetHandle)