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

📄 ellipticcurve.java

📁 椭圆曲线的生成
💻 JAVA
字号:
/*
 * @(#)EllipticCurve.java	1.3 03/12/19
 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

import java.math.BigInteger;
import java.util.Arrays;
import java.security.spec.*;

/**
 * This immutable class holds the necessary values needed to represent 
 * an elliptic curve.
 *
 * @see ECField
 * @see ECFieldFp
 * @see ECFieldF2m
 *
 * @author Valerie Peng
 * @version 1.3, 12/19/03
 *
 * @since 1.5
 */
public class EllipticCurve {
    
    private final ECField field;
    private final BigInteger a;
    private final BigInteger b;
    private final byte[] seed;

    // Check coefficient c is a valid element in ECField field.
    private static void checkValidity(ECField field,BigInteger c,String cName) 
    { 
		// can only perform check if field is ECFieldFp or ECFieldF2m. 
		if (field instanceof ECFieldFp) 
		{
	    	BigInteger p = ((ECFieldFp)field).getP();
	    	if (p.compareTo(c) != 1) 
	    	{
				throw new IllegalArgumentException(cName + "is too large");
	    	} 
	    	else if (c.signum()!= 1)
	    	{
				throw new IllegalArgumentException(cName + " is negative");
	    	}
		} 
		else if (field instanceof ECFieldF2m)
		{
	    	int m = ((ECFieldF2m)field).getM();
	    	if (c.bitLength()> m) 
	    	{
				throw new IllegalArgumentException(cName + " is too large");
	    	} 
		}
    }

    /**
     * Creates an elliptic curve with the specified elliptic field
     * <code>field</code> and the coefficients <code>a</code> and
     * <code>b</code>.
     * @param field the finite field that this elliptic curve is over.
     * @param a the first coefficient of this elliptic curve.
     * @param b the second coefficient of this elliptic curve.
     * @exception NullPointerException if <code>field</code>,
     * <code>a</code>, or <code>b</code> is null.
     * @exception IllegalArgumentException if <code>a</code>
     * or <code>b</code> is not null and not in <code>field</code>.
     */
    public EllipticCurve(ECField field, BigInteger a,BigInteger b) 
    {
		this(field, a, b, null);
    }    

    /**
     * Creates an elliptic curve with the specified elliptic field
     * <code>field</code>, the coefficients <code>a</code> and
     * <code>b</code>, and the <code>seed</code> used for curve generation.
     * @param field the finite field that this elliptic curve is over.
     * @param a the first coefficient of this elliptic curve.
     * @param b the second coefficient of this elliptic curve.
     * @param seed the bytes used during curve generation for later
     * validation. Contents of this array are copied to protect against
     * subsequent modification.
     * @exception NullPointerException if <code>field</code>,
     * <code>a</code>, or <code>b</code> is null.
     * @exception IllegalArgumentException if <code>a</code>
     * or <code>b</code> is not null and not in <code>field</code>.
     */
    public EllipticCurve(ECField field,BigInteger a,BigInteger b,byte[] seed) 
    {
        if (field == null) 
        {
            throw new NullPointerException("field is null");
        }
        if (a == null) 
        {
	    throw new NullPointerException("first coefficient is null");
		}
        if (b == null) 	
        {
            throw new NullPointerException("second coefficient is null");
        }
        checkValidity(field, a, "first coefficient");
		checkValidity(field, b, "second coefficient");
        this.field = field;
        this.a = a;
        this.b = b;
		if (seed != null) 
		{
	    	this.seed = (byte[])seed.clone();
		} 
		else 
		{
	    	this.seed = null;
		}
    }
 
    /**
     * Returns the finite field <code>field</code> that this
     * elliptic curve is over.
     * @return the field <code>field</code> that this curve 
     * is over.
     */    
    public ECField getField() 
    {
		return field;
    }

    /**
     * Returns the first coefficient <code>a</code> of the
     * elliptic curve.
     * @return the first coefficient <code>a</code>.
     */
    public BigInteger getA() 
    {
		return a;
    }

    /**
     * Returns the second coefficient <code>b</code> of the
     * elliptic curve.
     * @return the second coefficient <code>b</code>.
     */
    public BigInteger getB() 
    {
		return b;
    }

    /**
     * Returns the seeding bytes <code>seed</code> used 
     * during curve generation. May be null if not specified.
     * @return the seeding bytes <code>seed</code>. A new
     * array is returned each time this method is called.
     */
    public byte[] getSeed() 
    {
		if (seed == null) return null;
		else return (byte[])seed.clone();
    }

    /**
     * Compares this elliptic curve for equality with the specified object. 
     * @param obj the object to be compared.
     * @return true if <code>obj</code> is an instance of
     * EllipticCurve and the field, A, B, and seeding bytes match, false otherwise.
     */
    public boolean equals(Object obj) 
    {
		if (this == obj) return true;
		if (obj instanceof EllipticCurve) 
		{
	   		EllipticCurve curve = (EllipticCurve) obj;
	    	if ((field.equals(curve.field))&&(a.equals(curve.a))&&
	    	(b.equals(curve.b))&&(Arrays.equals(seed, curve.seed))) 
	    	{
			return true;
	    	} 
		}
		return false;
    }

    /**
     * Returns a hash code value for this elliptic curve.
     * @return a hash code value.
     */
    public int hashCode() 
    {
		return (field.hashCode()<< 6 + (a.hashCode() << 4) +
	    (b.hashCode() << 2)+(seed==null? 0:seed.length));
    }
    
}

⌨️ 快捷键说明

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