001package top.cenze.utils.crypt.sm.sm2;
002
003
004import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
005import org.bouncycastle.crypto.params.ECDomainParameters;
006import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
007import org.bouncycastle.math.ec.ECCurve;
008import org.bouncycastle.math.ec.ECFieldElement;
009import org.bouncycastle.math.ec.ECFieldElement.Fp;
010import org.bouncycastle.math.ec.ECPoint;
011
012import java.math.BigInteger;
013import java.security.SecureRandom;
014
015public class SM2 {
016
017    //国密参数
018    public static String[] ecc_param = {
019            "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",
020            "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",
021            "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",
022            "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",
023            "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",
024            "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"
025    };
026
027    public static SM2 Instance()
028    {
029        return new SM2();
030    }
031
032    public final BigInteger ecc_p;
033    public final BigInteger ecc_a;
034    public final BigInteger ecc_b;
035    public final BigInteger ecc_n;
036    public final BigInteger ecc_gx;
037    public final BigInteger ecc_gy;
038    public final ECCurve ecc_curve;
039    public final ECPoint ecc_point_g;
040    public final ECDomainParameters ecc_bc_spec;
041    public final ECKeyPairGenerator ecc_key_pair_generator;
042    public final ECFieldElement ecc_gx_fieldelement;
043    public final ECFieldElement ecc_gy_fieldelement;
044
045    public SM2()
046    {
047        this.ecc_p = new BigInteger(ecc_param[0], 16);
048        this.ecc_a = new BigInteger(ecc_param[1], 16);
049        this.ecc_b = new BigInteger(ecc_param[2], 16);
050        this.ecc_n = new BigInteger(ecc_param[3], 16);
051        this.ecc_gx = new BigInteger(ecc_param[4], 16);
052        this.ecc_gy = new BigInteger(ecc_param[5], 16);
053
054        this.ecc_gx_fieldelement = new Fp(this.ecc_p, this.ecc_gx);
055        this.ecc_gy_fieldelement = new Fp(this.ecc_p, this.ecc_gy);
056
057        this.ecc_curve = new ECCurve.Fp(this.ecc_p, this.ecc_a, this.ecc_b);
058        this.ecc_point_g = new ECPoint.Fp(this.ecc_curve, this.ecc_gx_fieldelement, this.ecc_gy_fieldelement);
059
060        this.ecc_bc_spec = new ECDomainParameters(this.ecc_curve, this.ecc_point_g, this.ecc_n);
061
062        ECKeyGenerationParameters ecc_ecgenparam;
063        ecc_ecgenparam = new ECKeyGenerationParameters(this.ecc_bc_spec, new SecureRandom());
064
065        this.ecc_key_pair_generator = new ECKeyPairGenerator();
066        this.ecc_key_pair_generator.init(ecc_ecgenparam);
067    }
068}