// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.crypto.generators;

import java.security.SecureRandom;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.params.ECCSIPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECCSIPublicKeyParameters;
import org.bouncycastle.util.BigIntegers;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.CryptoServiceProperties;
import org.bouncycastle.crypto.CryptoServicesRegistrar;
import org.bouncycastle.crypto.constraints.DefaultServiceProperties;
import org.bouncycastle.crypto.CryptoServicePurpose;
import org.bouncycastle.crypto.KeyGenerationParameters;
import org.bouncycastle.crypto.params.ECCSIKeyGenerationParameters;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.math.ec.ECPoint;
import java.math.BigInteger;
import org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator;

public class ECCSIKeyPairGenerator implements AsymmetricCipherKeyPairGenerator
{
    private BigInteger q;
    private ECPoint G;
    private Digest digest;
    private ECCSIKeyGenerationParameters parameters;
    
    @Override
    public void init(final KeyGenerationParameters keyGenerationParameters) {
        this.parameters = (ECCSIKeyGenerationParameters)keyGenerationParameters;
        this.q = this.parameters.getQ();
        this.G = this.parameters.getG();
        this.digest = this.parameters.getDigest();
        CryptoServicesRegistrar.checkConstraints(new DefaultServiceProperties("ECCSI", this.parameters.getN(), null, CryptoServicePurpose.KEYGEN));
    }
    
    @Override
    public AsymmetricCipherKeyPair generateKeyPair() {
        final SecureRandom random = this.parameters.getRandom();
        this.digest.reset();
        final byte[] id = this.parameters.getId();
        final ECPoint kpak = this.parameters.getKPAK();
        final BigInteger mod = BigIntegers.createRandomBigInteger(256, random).mod(this.q);
        final ECPoint normalize = this.G.multiply(mod).normalize();
        final byte[] encoded = this.G.getEncoded(false);
        this.digest.update(encoded, 0, encoded.length);
        final byte[] encoded2 = kpak.getEncoded(false);
        this.digest.update(encoded2, 0, encoded2.length);
        this.digest.update(id, 0, id.length);
        final byte[] encoded3 = normalize.getEncoded(false);
        this.digest.update(encoded3, 0, encoded3.length);
        final byte[] magnitude = new byte[this.digest.getDigestSize()];
        this.digest.doFinal(magnitude, 0);
        return new AsymmetricCipherKeyPair(new ECCSIPublicKeyParameters(normalize), new ECCSIPrivateKeyParameters(this.parameters.computeSSK(new BigInteger(1, magnitude).mod(this.q).multiply(mod)), new ECCSIPublicKeyParameters(normalize)));
    }
}
