[PATCH] 8165751: NPE in Signature with java.security.debug=provider

Sean Mullan sean.mullan at oracle.com
Tue Dec 13 19:27:39 UTC 2016


On 12/13/16 1:43 PM, Adam Petcher wrote:
> Here is the latest diff that simply adds a null check to the existing
> code. When the provider is null, the debug output will be "...algorithm
> from: (no provider)". The test code is the same as the last diff.

Looks good to me.

--Sean

>
>
> diff --git a/src/java.base/share/classes/java/security/Signature.java
> b/src/java.base/share/classes/java/security/Signature.java
> --- a/src/java.base/share/classes/java/security/Signature.java
> +++ b/src/java.base/share/classes/java/security/Signature.java
> @@ -452,6 +452,10 @@
>          return this.provider;
>      }
>
> +    private String getProviderName() {
> +        return (provider == null)  ? "(no provider)" : provider.getName();
> +    }
> +
>      void chooseFirstProvider() {
>          // empty, overridden in Delegate
>      }
> @@ -473,7 +477,7 @@
>
>          if (!skipDebug && pdebug != null) {
>              pdebug.println("Signature." + algorithm +
> -                " verification algorithm from: " +
> this.provider.getName());
> +                " verification algorithm from: " + getProviderName());
>          }
>      }
>
> @@ -522,7 +526,7 @@
>
>          if (!skipDebug && pdebug != null) {
>              pdebug.println("Signature." + algorithm +
> -                " verification algorithm from: " +
> this.provider.getName());
> +                " verification algorithm from: " + getProviderName());
>          }
>      }
>
> @@ -543,7 +547,7 @@
>
>          if (!skipDebug && pdebug != null) {
>              pdebug.println("Signature." + algorithm +
> -                " signing algorithm from: " + this.provider.getName());
> +                " signing algorithm from: " + getProviderName());
>          }
>      }
>
> @@ -566,7 +570,7 @@
>
>          if (!skipDebug && pdebug != null) {
>              pdebug.println("Signature." + algorithm +
> -                " signing algorithm from: " + this.provider.getName());
> +                " signing algorithm from: " + getProviderName());
>          }
>      }
>
> diff --git a/test/java/security/Signature/NoProvider.java
> b/test/java/security/Signature/NoProvider.java
> new file mode 100644
> --- /dev/null
> +++ b/test/java/security/Signature/NoProvider.java
> @@ -0,0 +1,99 @@
> +/*
> + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> + *
> + * This code is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 only, as
> + * published by the Free Software Foundation.
> + *
> + * This code is distributed in the hope that it will be useful, but
> WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> + * version 2 for more details (a copy is included in the LICENSE file that
> + * accompanied this code).
> + *
> + * You should have received a copy of the GNU General Public License
> version
> + * 2 along with this work; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
> + *
> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
> + * or visit www.oracle.com if you need additional information or have any
> + * questions.
> + */
> +
> +/*
> + * @test
> + * @bug 8165751
> + * @summary Verify that that a subclass of Signature that does not
> contain a
> + *     provider can be used verify.
> + * @run main/othervm -Djava.security.debug=provider NoProvider
> + */
> +
> +import java.security.*;
> +
> +public class NoProvider {
> +
> +    private static class NoProviderPublicKey implements PublicKey {
> +
> +        public String getAlgorithm() {
> +            return "NoProvider";
> +        }
> +        public String getFormat() {
> +            return "none";
> +        }
> +        public byte[] getEncoded() {
> +            return new byte[1];
> +        }
> +    }
> +
> +    private static class NoProviderSignature extends Signature {
> +
> +        public NoProviderSignature() {
> +            super("NoProvider");
> +        }
> +
> +        protected void engineInitVerify(PublicKey publicKey)
> +            throws InvalidKeyException {
> +            // do nothing
> +        }
> +
> +        protected void engineInitSign(PrivateKey privateKey)
> +            throws InvalidKeyException {
> +            // do nothing
> +        }
> +
> +        protected void engineUpdate(byte b) throws SignatureException {
> +            // do nothing
> +        }
> +
> +        protected void engineUpdate(byte[] b, int off, int len)
> +            throws SignatureException {
> +            // do nothing
> +        }
> +
> +        protected byte[] engineSign() throws SignatureException {
> +            return new byte[1];
> +        }
> +
> +        protected boolean engineVerify(byte[] sigBytes)
> +            throws SignatureException {
> +            return false;
> +        }
> +
> +        @Deprecated
> +        protected void engineSetParameter(String param, Object value)
> +            throws InvalidParameterException {
> +            // do nothing
> +        }
> +
> +        @Deprecated
> +        protected Object engineGetParameter(String param)
> +            throws InvalidParameterException {
> +            return null;
> +        }
> +    }
> +
> +    public static void main(String[] args) throws Exception {
> +        new NoProviderSignature().initVerify(new NoProviderPublicKey());
> +    }
> +}
>
>
> On 12/13/2016 11:56 AM, Sean Mullan wrote:
>> On 12/13/16 11:30 AM, Adam Petcher wrote:
>>> Thanks for the review.
>>>
>>> After thinking about this some more, I don't like the idea of using
>>> Optional for a member variable due to the limitations of this class and
>>> the lack of support for this usage of it. I'll send out a new diff that
>>> uses a standard null check.
>>>
>>> See below for other comments.
>>>
>>>
>>> On 12/12/2016 9:20 PM, Wang Weijun wrote:
>>>> Hi Adam
>>>>
>>>> The only behavior change is with the debug output, right?
>>> Yes. This will be more obvious in my next diff.
>>>>
>>>> Is this a new pattern that internal optional fields should be defined
>>>> as an Optional?
>>>>
>>>> And, when there is no provider the string form "from: " looks strange,
>>>> I would rather make it "from nowhere". I would also move the space
>>>> before "from" to where the method is called, say, " verification
>>>> algorithm " + getProvidedByString().
>>> It doesn't print the "from: " when there is no provider. So the string
>>> will look like "Signature.DSA verification algorithm" in this case. I
>>> don't have a strong opinion on whether we should print "from: no
>>> provider" (for example), but Sean expressed a preference for leaving
>>> this entire part blank when there is no provider (as it is in my last
>>> diff).
>>
>> Maybe "from: (no provider)" would be better. I think a previous
>> version had "from: none", but thinking about it more, "from: (no
>> provider)" is probably better than not printing anything for a null
>> provider.
>>
>> --Sean
>>
>>>>
>>>> Thanks
>>>> Max
>>>>
>>>>> On Dec 13, 2016, at 4:05 AM, Adam Petcher <adam.petcher at oracle.com>
>>>>> wrote:
>>>>>
>>>>> Okay. I changed getProvider() to return this.provider.orElse(null),
>>>>> which will allow this method to return null. For consistency, I allow
>>>>> all other providers (in Instance and Service) to be null using
>>>>> Optional.ofNullable(). Hopefully, I found and fixed all the
>>>>> whitespace issues, too. Here is the corrected diff:
>>>>>
>>>>> diff --git a/src/java.base/share/classes/java/security/Signature.java
>>>>> b/src/java.base/share/classes/java/security/Signature.java
>>>>> --- a/src/java.base/share/classes/java/security/Signature.java
>>>>> +++ b/src/java.base/share/classes/java/security/Signature.java
>>>>> @@ -134,7 +134,7 @@
>>>>>      private String algorithm;
>>>>>
>>>>>      // The provider
>>>>> -    Provider provider;
>>>>> +    Optional<Provider> provider = Optional.empty();
>>>>>
>>>>>      /**
>>>>>       * Possible {@link #state} value, signifying that
>>>>> @@ -266,7 +266,7 @@
>>>>>              SignatureSpi spi = (SignatureSpi)instance.impl;
>>>>>              sig = new Delegate(spi, algorithm);
>>>>>          }
>>>>> -        sig.provider = instance.provider;
>>>>> +        sig.provider = Optional.ofNullable(instance.provider);
>>>>>          return sig;
>>>>>      }
>>>>>
>>>>> @@ -449,13 +449,17 @@
>>>>>       */
>>>>>      public final Provider getProvider() {
>>>>>          chooseFirstProvider();
>>>>> -        return this.provider;
>>>>> +        return this.provider.orElse(null);
>>>>>      }
>>>>>
>>>>>      void chooseFirstProvider() {
>>>>>          // empty, overridden in Delegate
>>>>>      }
>>>>>
>>>>> +    private String getProvidedByString() {
>>>>> +        return provider.map(x -> " from: " + x.getName()).orElse("");
>>>>> +    }
>>>>> +
>>>>>      /**
>>>>>       * Initializes this object for verification. If this method is
>>>>> called
>>>>>       * again with a different argument, it negates the effect
>>>>> @@ -473,7 +477,7 @@
>>>>>
>>>>>          if (!skipDebug && pdebug != null) {
>>>>>              pdebug.println("Signature." + algorithm +
>>>>> -                " verification algorithm from: " +
>>>>> this.provider.getName());
>>>>> +                " verification algorithm" + getProvidedByString());
>>>>>          }
>>>>>      }
>>>>>
>>>>> @@ -522,7 +526,7 @@
>>>>>
>>>>>          if (!skipDebug && pdebug != null) {
>>>>>              pdebug.println("Signature." + algorithm +
>>>>> -                " verification algorithm from: " +
>>>>> this.provider.getName());
>>>>> +                " verification algorithm" + getProvidedByString());
>>>>>          }
>>>>>      }
>>>>>
>>>>> @@ -543,7 +547,7 @@
>>>>>
>>>>>          if (!skipDebug && pdebug != null) {
>>>>>              pdebug.println("Signature." + algorithm +
>>>>> -                " signing algorithm from: " +
>>>>> this.provider.getName());
>>>>> +                " signing algorithm" + getProvidedByString());
>>>>>          }
>>>>>      }
>>>>>
>>>>> @@ -566,7 +570,7 @@
>>>>>
>>>>>          if (!skipDebug && pdebug != null) {
>>>>>              pdebug.println("Signature." + algorithm +
>>>>> -                " signing algorithm from: " +
>>>>> this.provider.getName());
>>>>> +                " signing algorithm" + getProvidedByString());
>>>>>          }
>>>>>      }
>>>>>
>>>>> @@ -1087,7 +1091,7 @@
>>>>>                      }
>>>>>                      try {
>>>>>                          sigSpi = newInstance(s);
>>>>> -                        provider = s.getProvider();
>>>>> +                        provider =
>>>>> Optional.ofNullable(s.getProvider());
>>>>>                          // not needed any more
>>>>>                          firstService = null;
>>>>>                          serviceIterator = null;
>>>>> @@ -1132,7 +1136,7 @@
>>>>>                      try {
>>>>>                          SignatureSpi spi = newInstance(s);
>>>>>                          init(spi, type, key, random);
>>>>> -                        provider = s.getProvider();
>>>>> +                        provider =
>>>>> Optional.ofNullable(s.getProvider());
>>>>>                          sigSpi = spi;
>>>>>                          firstService = null;
>>>>>                          serviceIterator = null;
>>>>> diff --git a/test/java/security/Signature/NoProvider.java
>>>>> b/test/java/security/Signature/NoProvider.java
>>>>> new file mode 100644
>>>>> --- /dev/null
>>>>> +++ b/test/java/security/Signature/NoProvider.java
>>>>> @@ -0,0 +1,99 @@
>>>>> +/*
>>>>> + * Copyright (c) 2016, Oracle and/or its affiliates. All rights
>>>>> reserved.
>>>>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>>>>> + *
>>>>> + * This code is free software; you can redistribute it and/or
>>>>> modify it
>>>>> + * under the terms of the GNU General Public License version 2
>>>>> only, as
>>>>> + * published by the Free Software Foundation.
>>>>> + *
>>>>> + * This code is distributed in the hope that it will be useful, but
>>>>> WITHOUT
>>>>> + * ANY WARRANTY; without even the implied warranty of
>>>>> MERCHANTABILITY or
>>>>> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
>>>>> License
>>>>> + * version 2 for more details (a copy is included in the LICENSE
>>>>> file that
>>>>> + * accompanied this code).
>>>>> + *
>>>>> + * You should have received a copy of the GNU General Public License
>>>>> version
>>>>> + * 2 along with this work; if not, write to the Free Software
>>>>> Foundation,
>>>>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
>>>>> + *
>>>>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA
>>>>> 94065 USA
>>>>> + * or visit www.oracle.com if you need additional information or
>>>>> have any
>>>>> + * questions.
>>>>> + */
>>>>> +
>>>>> +/*
>>>>> + * @test
>>>>> + * @bug 8165751
>>>>> + * @summary Verify that that a subclass of Signature that does not
>>>>> contain a
>>>>> + *     provider can be used verify.
>>>>> + * @run main/othervm -Djava.security.debug=provider NoProvider
>>>>> + */
>>>>> +
>>>>> +import java.security.*;
>>>>> +
>>>>> +public class NoProvider {
>>>>> +
>>>>> +    private static class NoProviderPublicKey implements PublicKey {
>>>>> +
>>>>> +        public String getAlgorithm() {
>>>>> +            return "NoProvider";
>>>>> +        }
>>>>> +        public String getFormat() {
>>>>> +            return "none";
>>>>> +        }
>>>>> +        public byte[] getEncoded() {
>>>>> +            return new byte[1];
>>>>> +        }
>>>>> +    }
>>>>> +
>>>>> +    private static class NoProviderSignature extends Signature {
>>>>> +
>>>>> +        public NoProviderSignature() {
>>>>> +            super("NoProvider");
>>>>> +        }
>>>>> +
>>>>> +        protected void engineInitVerify(PublicKey publicKey)
>>>>> +            throws InvalidKeyException {
>>>>> +            // do nothing
>>>>> +        }
>>>>> +
>>>>> +        protected void engineInitSign(PrivateKey privateKey)
>>>>> +            throws InvalidKeyException {
>>>>> +            // do nothing
>>>>> +        }
>>>>> +
>>>>> +        protected void engineUpdate(byte b) throws
>>>>> SignatureException {
>>>>> +            // do nothing
>>>>> +        }
>>>>> +
>>>>> +        protected void engineUpdate(byte[] b, int off, int len)
>>>>> +            throws SignatureException {
>>>>> +            // do nothing
>>>>> +        }
>>>>> +
>>>>> +        protected byte[] engineSign() throws SignatureException {
>>>>> +            return new byte[1];
>>>>> +        }
>>>>> +
>>>>> +        protected boolean engineVerify(byte[] sigBytes)
>>>>> +            throws SignatureException {
>>>>> +            return false;
>>>>> +        }
>>>>> +
>>>>> +        @Deprecated
>>>>> +        protected void engineSetParameter(String param, Object value)
>>>>> +            throws InvalidParameterException {
>>>>> +            // do nothing
>>>>> +        }
>>>>> +
>>>>> +        @Deprecated
>>>>> +        protected Object engineGetParameter(String param)
>>>>> +            throws InvalidParameterException {
>>>>> +            return null;
>>>>> +        }
>>>>> +    }
>>>>> +
>>>>> +    public static void main(String[] args) throws Exception {
>>>>> +        new NoProviderSignature().initVerify(new
>>>>> NoProviderPublicKey());
>>>>> +    }
>>>>> +}
>>>>>
>>>>>
>>>>> On 12/12/2016 1:44 PM, Sean Mullan wrote:
>>>>>> On 12/8/16 11:17 AM, Adam Petcher wrote:
>>>>>>> Subclasses of Signature may have a null provider. In this case, the
>>>>>>> debug logging code will throw a NPE when attempting to call
>>>>>>> getName() on
>>>>>>> it. Since this member may be null, I would like to change its
>>>>>>> type to
>>>>>>> Optional to ensure that code checks whether it is present before
>>>>>>> using
>>>>>>> it. I have assumed that getProvider() methods (in both Signature and
>>>>>>> Service) always return non-null---if this assumption is incorrect,
>>>>>>> then
>>>>>>> I'll need to change some of the uses of Optional in/around these
>>>>>>> methods.
>>>>>> I think we would want to preserve the current behavior of
>>>>>> getProvider returning null for one of these subclasses (even though
>>>>>> it isn't specified that null is an acceptable return value). Better
>>>>>> to be safe here, otherwise NoSuchElementException would be thrown
>>>>>> which would be unexpected and not specified by getProvider.
>>>>>>
>>>>>> Other than that, just a minor style comment on a few lines of the
>>>>>> test:
>>>>>>
>>>>>>> +    private static class NoProviderPublicKey implements PublicKey{
>>>>>> space before "{"
>>>>>>
>>>>>> --Sean
>>>>>>
>>>>>>> Note that this issue of missing null checks for providers exists in
>>>>>>> several classes (e.g. Cipher, MessageDigest). Once this patch is
>>>>>>> reviewed and committed, I will apply the same solution to all other
>>>>>>> affected classes.
>>>>>>>
>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8165751
>>>>>>>
>>>>>>> Diff:
>>>>>>>
>>>>>>> diff --git
>>>>>>> a/src/java.base/share/classes/java/security/Signature.java
>>>>>>> b/src/java.base/share/classes/java/security/Signature.java
>>>>>>> --- a/src/java.base/share/classes/java/security/Signature.java
>>>>>>> +++ b/src/java.base/share/classes/java/security/Signature.java
>>>>>>> @@ -134,7 +134,7 @@
>>>>>>>      private String algorithm;
>>>>>>>
>>>>>>>      // The provider
>>>>>>> -    Provider provider;
>>>>>>> +    Optional<Provider> provider = Optional.empty();
>>>>>>>
>>>>>>>      /**
>>>>>>>       * Possible {@link #state} value, signifying that
>>>>>>> @@ -266,7 +266,7 @@
>>>>>>>              SignatureSpi spi = (SignatureSpi)instance.impl;
>>>>>>>              sig = new Delegate(spi, algorithm);
>>>>>>>          }
>>>>>>> -        sig.provider = instance.provider;
>>>>>>> +        sig.provider = Optional.of(instance.provider);
>>>>>>>          return sig;
>>>>>>>      }
>>>>>>>
>>>>>>> @@ -449,13 +449,17 @@
>>>>>>>       */
>>>>>>>      public final Provider getProvider() {
>>>>>>>          chooseFirstProvider();
>>>>>>> -        return this.provider;
>>>>>>> +        return this.provider.get();
>>>>>>>      }
>>>>>>>
>>>>>>>      void chooseFirstProvider() {
>>>>>>>          // empty, overridden in Delegate
>>>>>>>      }
>>>>>>>
>>>>>>> +    private String getProvidedByString(){
>>>>>>> +        return provider.map(x -> " from: " +
>>>>>>> x.getName()).orElse("");
>>>>>>> +    }
>>>>>>> +
>>>>>>>      /**
>>>>>>>       * Initializes this object for verification. If this method is
>>>>>>> called
>>>>>>>       * again with a different argument, it negates the effect
>>>>>>> @@ -473,7 +477,7 @@
>>>>>>>
>>>>>>>          if (!skipDebug && pdebug != null) {
>>>>>>>              pdebug.println("Signature." + algorithm +
>>>>>>> -                " verification algorithm from: " +
>>>>>>> this.provider.getName());
>>>>>>> +                " verification algorithm" + getProvidedByString());
>>>>>>>          }
>>>>>>>      }
>>>>>>>
>>>>>>> @@ -522,7 +526,7 @@
>>>>>>>
>>>>>>>          if (!skipDebug && pdebug != null) {
>>>>>>>              pdebug.println("Signature." + algorithm +
>>>>>>> -                " verification algorithm from: " +
>>>>>>> this.provider.getName());
>>>>>>> +                " verification algorithm" + getProvidedByString());
>>>>>>>          }
>>>>>>>      }
>>>>>>>
>>>>>>> @@ -543,7 +547,7 @@
>>>>>>>
>>>>>>>          if (!skipDebug && pdebug != null) {
>>>>>>>              pdebug.println("Signature." + algorithm +
>>>>>>> -                " signing algorithm from: " +
>>>>>>> this.provider.getName());
>>>>>>> +                " signing algorithm" + getProvidedByString());
>>>>>>>          }
>>>>>>>      }
>>>>>>>
>>>>>>> @@ -566,7 +570,7 @@
>>>>>>>
>>>>>>>          if (!skipDebug && pdebug != null) {
>>>>>>>              pdebug.println("Signature." + algorithm +
>>>>>>> -                " signing algorithm from: " +
>>>>>>> this.provider.getName());
>>>>>>> +                " signing algorithm" + getProvidedByString());
>>>>>>>          }
>>>>>>>      }
>>>>>>>
>>>>>>> @@ -1087,7 +1091,7 @@
>>>>>>>                      }
>>>>>>>                      try {
>>>>>>>                          sigSpi = newInstance(s);
>>>>>>> -                        provider = s.getProvider();
>>>>>>> +                        provider = Optional.of(s.getProvider());
>>>>>>>                          // not needed any more
>>>>>>>                          firstService = null;
>>>>>>>                          serviceIterator = null;
>>>>>>> @@ -1132,7 +1136,7 @@
>>>>>>>                      try {
>>>>>>>                          SignatureSpi spi = newInstance(s);
>>>>>>>                          init(spi, type, key, random);
>>>>>>> -                        provider = s.getProvider();
>>>>>>> +                        provider = Optional.of(s.getProvider());
>>>>>>>                          sigSpi = spi;
>>>>>>>                          firstService = null;
>>>>>>>                          serviceIterator = null;
>>>>>>> diff --git a/test/java/security/Signature/NoProvider.java
>>>>>>> b/test/java/security/Signature/NoProvider.java
>>>>>>> new file mode 100644
>>>>>>> --- /dev/null
>>>>>>> +++ b/test/java/security/Signature/NoProvider.java
>>>>>>> @@ -0,0 +1,99 @@
>>>>>>> +/*
>>>>>>> + * Copyright (c) 2016, Oracle and/or its affiliates. All rights
>>>>>>> reserved.
>>>>>>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>>>>>>> + *
>>>>>>> + * This code is free software; you can redistribute it and/or
>>>>>>> modify it
>>>>>>> + * under the terms of the GNU General Public License version 2
>>>>>>> only, as
>>>>>>> + * published by the Free Software Foundation.
>>>>>>> + *
>>>>>>> + * This code is distributed in the hope that it will be useful, but
>>>>>>> WITHOUT
>>>>>>> + * ANY WARRANTY; without even the implied warranty of
>>>>>>> MERCHANTABILITY or
>>>>>>> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
>>>>>>> License
>>>>>>> + * version 2 for more details (a copy is included in the LICENSE
>>>>>>> file that
>>>>>>> + * accompanied this code).
>>>>>>> + *
>>>>>>> + * You should have received a copy of the GNU General Public
>>>>>>> License
>>>>>>> version
>>>>>>> + * 2 along with this work; if not, write to the Free Software
>>>>>>> Foundation,
>>>>>>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
>>>>>>> + *
>>>>>>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA
>>>>>>> 94065 USA
>>>>>>> + * or visit www.oracle.com if you need additional information or
>>>>>>> have any
>>>>>>> + * questions.
>>>>>>> + */
>>>>>>> +
>>>>>>> +/*
>>>>>>> + * @test
>>>>>>> + * @bug 8165751
>>>>>>> + * @summary Verify that that a subclass of Signature that does not
>>>>>>> contain a
>>>>>>> + *     provider can be used verify.
>>>>>>> + * @run main/othervm -Djava.security.debug=provider NoProvider
>>>>>>> + */
>>>>>>> +
>>>>>>> +import java.security.*;
>>>>>>> +
>>>>>>> +public class NoProvider {
>>>>>>> +
>>>>>>> +    private static class NoProviderPublicKey implements PublicKey{
>>>>>>> +        public String getAlgorithm(){
>>>>>>> +            return "NoProvider";
>>>>>>> +        }
>>>>>>> +        public String getFormat(){
>>>>>>> +            return "none";
>>>>>>> +        }
>>>>>>> +        public byte[] getEncoded(){
>>>>>>> +            return new byte[1];
>>>>>>> +        }
>>>>>>> +    }
>>>>>>> +
>>>>>>> +    private static class NoProviderSignature extends Signature{
>>>>>>> +
>>>>>>> +        public NoProviderSignature(){
>>>>>>> +            super("NoProvider");
>>>>>>> +        }
>>>>>>> +
>>>>>>> +        protected void engineInitVerify(PublicKey publicKey)
>>>>>>> +            throws InvalidKeyException{
>>>>>>> +            // do nothing
>>>>>>> +        }
>>>>>>> +
>>>>>>> +        protected void engineInitSign(PrivateKey privateKey)
>>>>>>> +            throws InvalidKeyException{
>>>>>>> +            // do nothing
>>>>>>> +        }
>>>>>>> +
>>>>>>> +        protected void engineUpdate(byte b) throws
>>>>>>> SignatureException{
>>>>>>> +            // do nothing
>>>>>>> +        }
>>>>>>> +
>>>>>>> +        protected void engineUpdate(byte[] b, int off, int len)
>>>>>>> +            throws SignatureException{
>>>>>>> +            // do nothing
>>>>>>> +        }
>>>>>>> +
>>>>>>> +        protected byte[] engineSign() throws SignatureException{
>>>>>>> +            return new byte[1];
>>>>>>> +        }
>>>>>>> +
>>>>>>> +        protected boolean engineVerify(byte[] sigBytes)
>>>>>>> +            throws SignatureException{
>>>>>>> +            return false;
>>>>>>> +        }
>>>>>>> +
>>>>>>> +        @Deprecated
>>>>>>> +        protected void engineSetParameter(String param, Object
>>>>>>> value)
>>>>>>> +            throws InvalidParameterException{
>>>>>>> +            // do nothing
>>>>>>> +        }
>>>>>>> +
>>>>>>> +        @Deprecated
>>>>>>> +        protected Object engineGetParameter(String param)
>>>>>>> +            throws InvalidParameterException{
>>>>>>> +            return null;
>>>>>>> +        }
>>>>>>> +
>>>>>>> +    }
>>>>>>> +
>>>>>>> +    public static void main(String[] args) throws Exception {
>>>>>>> +        new NoProviderSignature().initVerify(new
>>>>>>> NoProviderPublicKey());
>>>>>>> +    }
>>>>>>> +}
>>>
>



More information about the security-dev mailing list