RFR: 8297878: KEM: Implementation

Weijun Wang weijun at openjdk.org
Thu Apr 13 17:12:43 UTC 2023


On Thu, 13 Apr 2023 02:51:28 GMT, Xue-Lei Andrew Fan <xuelei at openjdk.org> wrote:

>> If the interface is only in `KEM`, then it needs a `provider()` method, but an implementation actually does not know what the provider is. An implementation can be registered in any (or even multiple) providers.
>
>> If the interface is only in `KEM`, then it needs a `provider()` method, but an implementation actually does not know what the provider is.
> 
> With "implementation", do you mean the javax/crypto/KEPSpi.java or src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java?
> 
> If it is refer to KEPSpi.java, why KEPSpi.java need to know what the provider is?  Is it sufficient to use engineNewEncapsulator() to get the provider implementation?
> 
> If it is refer to DHKEM.java, I did not get the idea why the  provider is unknown.
> 
>> An implementation can be registered in any (or even multiple) providers.
> 
> I did not get the idea.  Why it is not registered in SunJCE?
> 
> I think you may have evaluated the following idea, but I'm not why it is not work.  I may missed something.  Would you mind explain in more details?
> 
> 
> public final class KEM {
>     interface Encapsulator {
>         ...
>         KEM.Encapsulated encapsulate(...);
>         ...
>     }
> 
>     public static KEM getInstance(String algorithm) {
>         ...
>     }
> 
>     // Search for the registered providers, return the 1st non-null provider.newEncapsulator() or throw exception.
>     public Encapsulator newEncapsulator(PublicKey pk,
>             AlgorithmParameterSpec spec, SecureRandom secureRandom)
>         ...
>     }
> }
> 
> public interface KEMSpi {
>     // A provider implementation will implement the KEM.Encapsulator 
>     // interface internally.  If a provider does not support the parameters,
>     // null or nil object will be returned.
>     public KEM.Encapsulator newEncapsulator(PublicKey pk,
>             AlgorithmParameterSpec spec, SecureRandom secureRandom);
> }       
> 
> Use case:
>     KEM.getInstance(DHKEM).newEncapsulator(...);

`DHKEM.java` is the implementation, and it does not know which provider it will be put into. It's inside the provider that calls `putService` or `put` to add an implementation there, not that the implementation registered itself in a provider.

If `getProvider()` is implemented inside the implementation, then it can only be attached to one provider. Also, do you expect it to return `new SunJCE()`? This means the `p` in `getInstance("DHKEM", p)` will be a different instance from the value returned by `getProvider()`. There is no specification talking about if the instances must be the same or not, but it's probably not a good idea to have 2 objects for the same provider.

In fact, I can create a new provider and simply call `putService` to add existing implementations (that were already provided by other providers) inside it, and I can `getInstance` from this provider and its `getProvider()` returns this provider.

For this reason, the base `Encapsulator` interface cannot be defined inside `KEM`. As I said earlier, it can be defined inside `KEMSpi` and then we add an extra `provider()` method to its implementation in `KEM`. I just don't think this is worth doing.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/13256#discussion_r1165815968



More information about the security-dev mailing list