Java : vers une API du mécanisme d'encapsulation de clé

Par:
fredericmazue

ven, 28/04/2023 - 11:41

Le mécanisme d'encapsulation de clé, ou KEM, est une technique cryptographique moderne conçue pour chiffrer des clés symétriques à l'aide d'une cryptographie à clé asymétrique ou publique. Elle est différente de la technique plus traditionnelle qui crypte une clé symétrique générée aléatoirement avec une clé publique. Au lieu de cela, un KEM utilise une approche différente qui utilise généralement les propriétés de la clé publique pour dériver la clé symétrique. Ce mécanisme est plus simple et résout plusieurs des inconvénients de l'approche traditionnelle.

La proposition JEP 8301034 vise à introduire une API pour le mécanisme d'encapsulation de clé (KEM). Ce JEP définit une nouvelle classe nommée KEMpour les fonctions d'encapsulation et de décapsulation :

package javax.crypto;

public final class KEM {

    public static final class Encapsulated {
        public Encapsulated(SecretKey key, byte[] encapsulation, byte[] params);
        public SecretKey key();
        public byte[] encapsulation();
        public byte[] params();
    }

    public static final class Encapsulator {
        Provider provider();
        int secretSize();
        int encapsulationSize();
        KEM.Encapsulated encapsulate();
        KEM.Encapsulated encapsulate(int from, int to, String algorithm);
    }

    public static final class Decapsulator {
        Provider provider();
        int secretSize();
        int encapsulationSize();
        SecretKey decapsulate(byte[] encapsulation) throws DecapsulateException;
        SecretKey decapsulate(byte[] encapsulation, int from, int to, String algorithm)
                throws DecapsulateException;
    }

    public static KEM getInstance(String alg)
        throws NoSuchAlgorithmException;
    public static KEM getInstance(String alg, Provider p)
        throws NoSuchAlgorithmException;
    public static KEM getInstance(String alg, String p)
        throws NoSuchAlgorithmException, NoSuchProviderException;

    public Encapsulator newEncapsulator(PublicKey pk)
            throws InvalidKeyException;
    public Encapsulator newEncapsulator(PublicKey pk, SecureRandom sr)
            throws InvalidKeyException;
    public Encapsulator newEncapsulator(PublicKey pk, AlgorithmParameterSpec spec, SecureRandom sr)
            throws InvalidAlgorithmParameterException, InvalidKeyException;

    public Decapsulator newDecapsulator(PrivateKey sk)
            throws InvalidKeyException;
    public Decapsulator newDecapsulator(PrivateKey sk, AlgorithmParameterSpec spec)
            throws InvalidAlgorithmParameterException, InvalidKeyException;
}

public class DecapsulateException extends GeneralSecurityException;

public interface KEMSpi {

    interface EncapsulatorSpi {
        int engineSecretSize();
        int engineEncapsulationSize();
        KEM.Encapsulated engineEncapsulate(int from, int to, String algorithm);
    }

    interface DecapsulatorSpi {
        int engineSecretSize();
        int engineEncapsulationSize();
        SecretKey engineDecapsulate(byte[] encapsulation, int from, int to, String algorithm)
                throws DecapsulateException;
    }

    EncapsulatorSpi engineNewEncapsulator(PublicKey pk, AlgorithmParameterSpec spec, SecureRandom sr)
            throws InvalidAlgorithmParameterException, InvalidKeyException;
    DecapsulatorSpi engineNewDecapsulator(PrivateKey sk, AlgorithmParameterSpec spec)
            throws InvalidAlgorithmParameterException, InvalidKeyException;
}