On Thu, 13 Apr 2023 19:01:24 GMT, Xue-Lei Andrew Fan <xue...@openjdk.org> wrote:
>> 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. > >> 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. > > If the provider() method in KEM.Encapsulator is the only reason, the cost to > support it may be too high with so many duplicated/similar > specifications/names and code. > > Option 1: Remove the KEM.Encapsulator.provider() method, and provide no > access to the underlying provider object. > >> 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(). > > The Provider class is mutable, we may not want to change the provider object > asked for "DHKEM". I think you have used a solution to pass the provider > object in the KEM.java implementation currently. Maybe, it could be twitted > a little bit so that the provider can be passed to a delegated > KM.Encapsulator interface implementation. > > Option 2: > > public final class KEM { > interface Encapsulator { > ... > KEM.Encapsulated encapsulate(...); > ... > > default Provider provider() { > return null; > } > } > > private static class DelegatedEncapsulator implements Encapsulator { > private final Provider p; > private DelegatedEncapsulator(Encapsulator e, Provider p) { > this.p = p; > ... > } > public Provider provider() { > return this.p; > } > } > > ... > KEMSpi spi = (KEMSpi) service.newInstance(null); > return new DelegatedEncapsulator( > spi.engineNewEncapsulator(pk, spec, secureRandom), // > This is the interface implementation, use the same provider as KEM. > service.getProvider()); // This is the provider passed to > the delegated KEM.Encapsulator object. > ... > } For more details about option 2, please refer to https://github.com/openjdk/jdk/pull/13470/files. The KEM.java and KEMSpi.java is pretty much the same except the clean up of En/Decapsulator(s) in this PR. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/13256#discussion_r1166057562