On Thu, 13 Apr 2023 17:35:00 GMT, Xue-Lei Andrew Fan <xue...@openjdk.org> wrote:

>> `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.
>
>> `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.
>> 
> I did not get the idea.  Why DHKEM.java need register itself in a provider?  
> A DHKEM.java is a part of a provider, and the Provider implementation in the 
> provider knows how to register DHKEM.
> 
>> 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()`. 
> 
> I did not get the idea.  How could it be possible to return different 
> instances. `getInstance("DHKEM", p)` returns the DHKEM implementation in 
> provider p.  The "DHKEM" string name here is not the DHKEM.java class in 
> SunJCE provider.
> 
> Back to the question you have previously: 
>> If the interface is only in KEM, then it needs a provider() method, but an 
>> implementation actually does not know what the provider is.
> 
> Why it is needed to know the provider of the interface?  Do you mean the 
> Encapsulator provider could be different from the KEM provider?  That's, KEM 
> provider is ProviderK, and the Encapsulator provider is ProviderE, and you 
> want them work together?   Does it make sense that it is required that 
> Encapsulator is an internal implementation of the KEM provider (i.e., both 
> from the same provider)?

Currently, `provider()` is a method of `KEM.Encapsulator`. If `KEMSpi. 
newEncapsulator` also returns this interface, then what value should its 
`provider()` method return? This is what I meant registering itself to a 
provider.

When I said different instances, I was asking

var k = KEM.getInstance("DHKEM", p);
var e = k.newEncapsulator(pk);
// now, is p == e.provider()?


Or, are you suggesting we should define `provider()` somewhere else? It's 
possible, but I have difficulty making every class immutable.

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

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

Reply via email to