⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyagreement.java

📁 kmlnjlkj nlkjlkjkljl okopokipoipo oipipipo i
💻 JAVA
字号:
package org.bouncycastle.jce.provider.asymmetric.ec;import org.bouncycastle.asn1.DERObjectIdentifier;import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;import org.bouncycastle.asn1.x9.X9IntegerConverter;import org.bouncycastle.crypto.BasicAgreement;import org.bouncycastle.crypto.CipherParameters;import org.bouncycastle.crypto.DerivationFunction;import org.bouncycastle.crypto.agreement.ECDHBasicAgreement;import org.bouncycastle.crypto.agreement.ECDHCBasicAgreement;import org.bouncycastle.crypto.agreement.kdf.DHKDFParameters;import org.bouncycastle.crypto.agreement.kdf.ECDHKEKGenerator;import org.bouncycastle.crypto.digests.SHA1Digest;import org.bouncycastle.crypto.params.ECPrivateKeyParameters;import org.bouncycastle.jce.interfaces.ECPrivateKey;import org.bouncycastle.jce.interfaces.ECPublicKey;import org.bouncycastle.jce.provider.asymmetric.ec.ECUtil;import javax.crypto.KeyAgreementSpi;import javax.crypto.SecretKey;import javax.crypto.ShortBufferException;import javax.crypto.spec.SecretKeySpec;import java.math.BigInteger;import java.security.InvalidAlgorithmParameterException;import java.security.InvalidKeyException;import java.security.Key;import java.security.NoSuchAlgorithmException;import java.security.PrivateKey;import java.security.PublicKey;import java.security.SecureRandom;import java.security.spec.AlgorithmParameterSpec;import java.util.Hashtable;/** * Diffie-Hellman key agreement using elliptic curve keys, ala IEEE P1363 * both the simple one, and the simple one with cofactors are supported. */public class KeyAgreement    extends KeyAgreementSpi{    private static final X9IntegerConverter converter = new X9IntegerConverter();    private static final Hashtable algorithms = new Hashtable();    static    {        Integer i128 = new Integer(128);        Integer i192 = new Integer(192);        Integer i256 = new Integer(256);        algorithms.put(NISTObjectIdentifiers.id_aes128_CBC.getId(), i128);        algorithms.put(NISTObjectIdentifiers.id_aes192_CBC.getId(), i192);        algorithms.put(NISTObjectIdentifiers.id_aes256_CBC.getId(), i256);        algorithms.put(NISTObjectIdentifiers.id_aes128_wrap.getId(), i128);        algorithms.put(NISTObjectIdentifiers.id_aes192_wrap.getId(), i192);        algorithms.put(NISTObjectIdentifiers.id_aes256_wrap.getId(), i256);        algorithms.put(PKCSObjectIdentifiers.id_alg_CMS3DESwrap.getId(), i192);    }    private BigInteger             result;    private ECPrivateKeyParameters privKey;    private BasicAgreement         agreement;    private DerivationFunction     kdf;    private byte[] bigIntToBytes(        BigInteger    r)    {        return converter.integerToBytes(r, converter.getByteLength(privKey.getParameters().getG().getX()));    }        protected KeyAgreement(        BasicAgreement  agreement)    {        this.agreement = agreement;    }    protected KeyAgreement(        BasicAgreement  agreement,        DerivationFunction kdf)    {        this.agreement = agreement;        this.kdf = kdf;    }    protected Key engineDoPhase(        Key     key,        boolean lastPhase)         throws InvalidKeyException, IllegalStateException    {        if (privKey == null)        {            throw new IllegalStateException("EC Diffie-Hellman not initialised.");        }        if (!lastPhase)        {            throw new IllegalStateException("EC Diffie-Hellman can only be between two parties.");        }        if (!(key instanceof ECPublicKey))        {            throw new InvalidKeyException("EC Key Agreement doPhase requires ECPublicKey");        }        CipherParameters pubKey = ECUtil.generatePublicKeyParameter((PublicKey)key);        result = agreement.calculateAgreement(pubKey);        return null;    }    protected byte[] engineGenerateSecret()         throws IllegalStateException    {        return bigIntToBytes(result);    }    protected int engineGenerateSecret(        byte[]  sharedSecret,        int     offset)         throws IllegalStateException, ShortBufferException    {        byte[]  secret = bigIntToBytes(result);        if (sharedSecret.length - offset < secret.length)        {            throw new ShortBufferException("ECKeyAgreement - buffer too short");        }        System.arraycopy(secret, 0, sharedSecret, offset, secret.length);                return secret.length;    }    protected SecretKey engineGenerateSecret(        String algorithm)        throws NoSuchAlgorithmException    {        if (kdf != null)        {            if (!algorithms.containsKey(algorithm))            {                throw new NoSuchAlgorithmException("unknown algorithm encountered: " + algorithm);            }                        int    keySize = ((Integer)algorithms.get(algorithm)).intValue();            DHKDFParameters params = new DHKDFParameters(new DERObjectIdentifier(algorithm), keySize, bigIntToBytes(result));            byte[] keyBytes = new byte[keySize / 8];            kdf.init(params);                        kdf.generateBytes(keyBytes, 0, keyBytes.length);            return new SecretKeySpec(keyBytes, algorithm);        }        return new SecretKeySpec(bigIntToBytes(result), algorithm);    }    protected void engineInit(        Key                     key,        AlgorithmParameterSpec  params,        SecureRandom            random)         throws InvalidKeyException, InvalidAlgorithmParameterException    {        if (!(key instanceof ECPrivateKey))        {            throw new InvalidKeyException("ECKeyAgreement requires ECPrivateKey for initialisation");        }        privKey = (ECPrivateKeyParameters)ECUtil.generatePrivateKeyParameter((PrivateKey)key);        agreement.init(privKey);    }    protected void engineInit(        Key             key,        SecureRandom    random)         throws InvalidKeyException    {        if (!(key instanceof ECPrivateKey))        {            throw new InvalidKeyException("ECKeyAgreement requires ECPrivateKey");        }        privKey = (ECPrivateKeyParameters)ECUtil.generatePrivateKeyParameter((PrivateKey)key);        agreement.init(privKey);    }    public static class DH        extends KeyAgreement    {        public DH()        {            super(new ECDHBasicAgreement());        }    }    public static class DHC        extends KeyAgreement    {        public DHC()        {            super(new ECDHCBasicAgreement());        }    }    public static class DHwithSHA1KDF        extends KeyAgreement    {        public DHwithSHA1KDF()        {            super(new ECDHBasicAgreement(), new ECDHKEKGenerator(new SHA1Digest()));        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -