test_class.file: java_src/src/test/java/com/google/crypto/tink/signature/PublicKeySignWrapperTest.java
test_class.identifier: PublicKeySignWrapperTest
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,
                  new EcdsaSignKeyManager().getKeyType(),
                  KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
              1,
              KeyStatusType.ENABLED,
              OutputPrefixType.TINK);
  
      EcdsaPrivateKey legacyPrivateKey =
          TestUtil.generateEcdsaPrivKey(
              EllipticCurveType.NIST_P256, HashType.SHA256, EcdsaSignatureEncoding.DER);
      Key legacy =
          TestUtil.createKey(
              TestUtil.createKeyData(
                  legacyPrivateKey,
                  new EcdsaSignKeyManager().getKeyType(),
                  KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
              2,
              KeyStatusType.ENABLED,
              OutputPrefixType.LEGACY);
  
      EcdsaPrivateKey rawPrivateKey =
          TestUtil.generateEcdsaPrivKey(
              EllipticCurveType.NIST_P384, HashType.SHA512, EcdsaSignatureEncoding.DER);
      Key raw =
          TestUtil.createKey(
              TestUtil.createKeyData(
                  rawPrivateKey,
                  new EcdsaSignKeyManager().getKeyType(),
                  KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
              3,
              KeyStatusType.ENABLED,
              OutputPrefixType.RAW);
  
      EcdsaPrivateKey crunchyPrivateKey =
          TestUtil.generateEcdsaPrivKey(
              EllipticCurveType.NIST_P384, HashType.SHA512, EcdsaSignatureEncoding.DER);
      Key crunchy =
          TestUtil.createKey(
              TestUtil.createKeyData(
                  crunchyPrivateKey,
                  new EcdsaSignKeyManager().getKeyType(),
                  KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
              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]));
        // Signs with the primary private key.
        PublicKeySign signer =
            new PublicKeySignWrapper()
                .wrap(Registry.getPrimitives(keysetHandle, PublicKeySign.class));
        byte[] plaintext = Random.randBytes(1211);
        byte[] sig = signer.sign(plaintext);
        if (keys[i].getOutputPrefixType() != OutputPrefixType.RAW) {
          byte[] prefix = Arrays.copyOfRange(sig, 0, CryptoFormat.NON_RAW_PREFIX_SIZE);
          assertArrayEquals(prefix, CryptoFormat.getOutputPrefix(keys[i]));
        }
  
        // Verifying with the primary public key should work.
        PublicKeyVerify verifier =
            PublicKeyVerifyFactory.getPrimitive(
                TestUtil.createKeysetHandle(
                    TestUtil.createKeyset(
                        TestUtil.createKey(
                            TestUtil.createKeyData(
                                privateKeys[i].getPublicKey(),
                                new EcdsaVerifyKeyManager().getKeyType(),
                                KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
                            keys[i].getKeyId(),
                            KeyStatusType.ENABLED,
                            keys[i].getOutputPrefixType()))));
        try {
          verifier.verify(sig, plaintext);
        } catch (GeneralSecurityException ex) {
          fail("Valid signature, should not throw exception");
        }
  
        // Verifying with a random public key should fail.
        EcdsaPrivateKey randomPrivKey =
            TestUtil.generateEcdsaPrivKey(
                EllipticCurveType.NIST_P521, HashType.SHA512, EcdsaSignatureEncoding.DER);
        verifier =
            PublicKeyVerifyFactory.getPrimitive(
                TestUtil.createKeysetHandle(
                    TestUtil.createKeyset(
                        TestUtil.createKey(
                            TestUtil.createKeyData(
                                randomPrivKey.getPublicKey(),
                                new EcdsaVerifyKeyManager().getKeyType(),
                                KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
                            keys[i].getKeyId(),
                            KeyStatusType.ENABLED,
                            keys[i].getOutputPrefixType()))));
        try {
          verifier.verify(sig, plaintext);
          fail("Invalid signature, should have thrown exception");
        } catch (GeneralSecurityException expected) {
          // Expected
        }
      }
    }
test_case.class_method_signature: PublicKeySignWrapperTest.testMultipleKeys()
test_case.full_signature: @Test public void testMultipleKeys()
test_case.identifier: testMultipleKeys
test_case.invocations: generateEcdsaPrivKey createKey createKeyData getKeyType generateEcdsaPrivKey createKey createKeyData getKeyType generateEcdsaPrivKey createKey createKeyData getKeyType generateEcdsaPrivKey createKey createKeyData getKeyType createKeysetHandle createKeyset wrap getPrimitives randBytes sign getOutputPrefixType copyOfRange assertArrayEquals getOutputPrefix getPrimitive createKeysetHandle createKeyset createKey createKeyData getPublicKey getKeyType getKeyId getOutputPrefixType verify fail generateEcdsaPrivKey getPrimitive createKeysetHandle createKeyset createKey createKeyData getPublicKey getKeyType getKeyId getOutputPrefixType 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/PublicKeySignWrapper.java
focal_class.identifier: PublicKeySignWrapper
focal_class.interfaces: implements PrimitiveWrapper<PublicKeySign, PublicKeySign>
focal_class.class_method_signature: PublicKeySignWrapper.PublicKeySignWrapper()
focal_class.full_signature:   PublicKeySignWrapper()
focal_class.identifier: PublicKeySignWrapper
focal_class.parameters: ()
focal_class.signature:  PublicKeySignWrapper()
focal_class.class_method_signature: PublicKeySignWrapper.wrap(final PrimitiveSet<PublicKeySign> primitives)
focal_class.full_signature: @Override public PublicKeySign wrap(final PrimitiveSet<PublicKeySign> primitives)
focal_class.identifier: wrap
focal_class.modifiers: @Override public
focal_class.parameters: (final PrimitiveSet<PublicKeySign> primitives)
focal_class.return: PublicKeySign
focal_class.signature: PublicKeySign wrap(final PrimitiveSet<PublicKeySign> primitives)
focal_class.class_method_signature: PublicKeySignWrapper.getPrimitiveClass()
focal_class.full_signature: @Override public Class<PublicKeySign> getPrimitiveClass()
focal_class.identifier: getPrimitiveClass
focal_class.modifiers: @Override public
focal_class.parameters: ()
focal_class.return: Class<PublicKeySign>
focal_class.signature: Class<PublicKeySign> getPrimitiveClass()
focal_class.class_method_signature: PublicKeySignWrapper.getInputPrimitiveClass()
focal_class.full_signature: @Override public Class<PublicKeySign> getInputPrimitiveClass()
focal_class.identifier: getInputPrimitiveClass
focal_class.modifiers: @Override public
focal_class.parameters: ()
focal_class.return: Class<PublicKeySign>
focal_class.signature: Class<PublicKeySign> getInputPrimitiveClass()
focal_class.class_method_signature: PublicKeySignWrapper.register()
focal_class.full_signature: public static void register()
focal_class.identifier: register
focal_class.modifiers: public static
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void register()
focal_method.body: @Override
    public PublicKeySign wrap(final PrimitiveSet<PublicKeySign> primitives) {
      return new WrappedPublicKeySign(primitives);
    }
focal_method.class_method_signature: PublicKeySignWrapper.wrap(final PrimitiveSet<PublicKeySign> primitives)
focal_method.full_signature: @Override public PublicKeySign wrap(final PrimitiveSet<PublicKeySign> primitives)
focal_method.identifier: wrap
focal_method.modifiers: @Override public
focal_method.parameters: (final PrimitiveSet<PublicKeySign> primitives)
focal_method.return: PublicKeySign
focal_method.signature: PublicKeySign wrap(final PrimitiveSet<PublicKeySign> primitives)