Example #1
0
        /// <summary>バイト配列より点を作成する (SEC1, 2.3.4)</summary>
        public ECPoint(ECGroup group, byte[] data)
        {
            _group = group;
            _field = group.FiniteField;
            switch (data[0])
            {
            case 0: {                     // 無限遠点
                ECPoint tmp = _field.GetInfinityPoint(_group);
                _x = tmp._x;
                _y = tmp._y;
                _z = tmp._z;
                return;
            }

            case 2:
            case 3: {                     // 点圧縮済みデータ
                int keyBits  = group.P.BitCount();
                int keyBytes = (keyBits >> 3) + ((keyBits & 7) == 0 ? 0 : 1);
                if (data.Length != keyBytes + 1)
                {
                    throw new ArgumentException();
                }
                Number x  = _field.ToElement(new Number(data, 1, keyBytes, false));
                Number y2 = _field.Add(_field.Multiply(_field.Add(_field.Multiply(x, x), _group.A), x), _group.B);                             // (x^2 + a)*x + b
                Number y  = _field.Sqrt(y2);
                if (_field.ToNormal(y).GetBit(0) != data[0] - 2)
                {
                    y = _field.Modulus - y;
                }
                _x = x;
                _y = y;
                _z = _field.ToElement(Number.One);
                return;
            }

            case 4: {                     // 非圧縮データ
                int keyBits  = group.P.BitCount();
                int keyBytes = (keyBits >> 3) + ((keyBits & 7) == 0 ? 0 : 1);
                _x = _field.ToElement(new Number(data, 1, keyBytes, false));
                _y = _field.ToElement(new Number(data, 1 + keyBytes, keyBytes, false));
                _z = _field.ToElement(Number.One);
                return;
            }

            default:
                throw new ArgumentException();
            }
        }
Example #2
0
		/// <summary>バイト配列より点を作成する (SEC1, 2.3.4)</summary>
		public ECPoint (ECGroup group, byte[] data)
		{
			_group = group;
			_field = group.FiniteField;
			switch (data[0]) {
				case 0: { // 無限遠点
					ECPoint tmp = _field.GetInfinityPoint (_group);
					_x = tmp._x;
					_y = tmp._y;
					_z = tmp._z;
					return;
				}
				case 2:
				case 3: { // 点圧縮済みデータ
					int keyBits = group.P.BitCount ();
					int keyBytes = (keyBits >> 3) + ((keyBits & 7) == 0 ? 0 : 1);
					if (data.Length != keyBytes + 1)
						throw new ArgumentException ();
					Number x = _field.ToElement (new Number (data, 1, keyBytes, false));
					Number y2 = _field.Add (_field.Multiply (_field.Add (_field.Multiply (x, x), _group.A), x), _group.B); // (x^2 + a)*x + b
					Number y = _field.Sqrt (y2);
					if (_field.ToNormal (y).GetBit (0) != data[0] - 2)
						y = _field.Modulus - y;
					_x = x;
					_y = y;
					_z = _field.ToElement (Number.One);
					return;
				}
				case 4: { // 非圧縮データ
					int keyBits = group.P.BitCount ();
					int keyBytes = (keyBits >> 3) + ((keyBits & 7) == 0 ? 0 : 1);
					_x = _field.ToElement (new Number (data, 1, keyBytes, false));
					_y = _field.ToElement (new Number (data, 1 + keyBytes, keyBytes, false));
					_z = _field.ToElement (Number.One);
					return;
				}
				default:
					throw new ArgumentException ();
			}
		}