package de.persosim.simulator.protocols.pace; import java.security.InvalidAlgorithmParameterException; import java.security.KeyPair; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; import java.security.spec.InvalidKeySpecException; import de.persosim.simulator.crypto.CryptoUtil; import de.persosim.simulator.crypto.DomainParameterSet; /** * This class performs the generic, i.e. non key agreement specific parts of generic mapping. * * @author slutters * */ public abstract class GenericMapping implements Mapping { @Override public MappingResult performMapping(DomainParameterSet domainParametersUnmapped, byte[] sNonce, byte[] publicKeyComponentPcd) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, InvalidKeySpecException { KeyPair keyPairPiccUnmapped = CryptoUtil.generateKeyPair(domainParametersUnmapped, new SecureRandom()); PublicKey publicKeyPcdUnMapped = domainParametersUnmapped.reconstructPublicKey(publicKeyComponentPcd); byte[] secretPointOfKeyAgreementEncoding = performKeyAgreement(domainParametersUnmapped, keyPairPiccUnmapped.getPrivate(), publicKeyPcdUnMapped); DomainParameterSet domainParametersMapped = performMappingOfDomainParameters(domainParametersUnmapped, sNonce, secretPointOfKeyAgreementEncoding); KeyPair keyPairPiccMapped = CryptoUtil.updateKeyPairToNewDomainParameters(keyPairPiccUnmapped, domainParametersMapped); return new MappingResultGm(domainParametersUnmapped, domainParametersMapped, keyPairPiccUnmapped, keyPairPiccMapped); } /** * This method performs a key agreement specified by the implementing class. * * @param domainParameters the common domain parameters used by the provided keys * @param privKeyPicc the private key * @param pubKeyPcd the public key * @return the result of the key agreement */ public abstract byte[] performKeyAgreement(DomainParameterSet domainParameters, PrivateKey privKeyPicc, PublicKey pubKeyPcd); @Override public String getMappingName() { return "Generic Mapping"; } }