Anunciamos nuestra propia criptografía de curva elíptica en solidez.

Recientemente, Gorka Irazoqui Apecechea y yo publicamos con orgullo una biblioteca de criptografía de solidez de criptografía de curva elíptica como proyecto de código abierto bajo la licencia MIT.

Pero, ¿por qué hemos implementado nuestra propia biblioteca criptográfica? Como todos ustedes saben, el desarrollo de sus propias bibliotecas criptográficas no suele ser recomendable. Sin embargo, encontramos varias razones para hacerlo:

Agnóstico de la curva: descubrimos que la mayoría de las operaciones eran genéricas para curvas elípticas principales, por lo que no había ninguna razón especial para que se diera cuenta de una sola.Biblioteca genérica: La mayoría de las bibliotecas son ampliamente utilizadas para derivaciones clave o validaciones de firmas. Sin embargo, necesitamos operaciones de curva elíptica para otras operaciones criptográficas, por ejemplo, para una biblioteca que implementa funciones aleatorias verificables (VRF).Funciones homogeneas: intentamos tener una distinción clara entre operaciones aritméticas en operaciones afines y jacobianas.

elliptic-curve-solidity es una biblioteca rentable, flexible y ergonómica para operaciones aritméticas de curva elíptica. Se ha generalizado para admitir cualquier curva elíptica basada en números primos de hasta 256 bits.

La biblioteca ha sido diseñada con solo funciones puras para reducir el consumo de gas tanto como sea posible. Pretende ser lo más completo posible brindando las siguientes operaciones.

Modular: inverso, exponenciaciónJacobiano: suma, doble, multiplicaciónAfín: inverso, suma, resta, multiplicaciónAuxiliar: convertir a afín, derivar coordenada Y, punto en curva

Las curvas soportadas y probadas son secp256k1, secp256r1 (P-256), secp192r1 (P-192) y secp224r1 (P-224).

El contrato EllipticCurve.sol se puede usar directamente por herencia o por instanciación. El siguiente ejemplo de Secp256k1 describe cómo heredar la biblioteca al proporcionar una función para derivar una clave pública de una clave secreta:

pragma solidity ^ 0.5.0; import "./EllipticCurve.sol";contract Secp256k1 es EllipticCurve {uint256 constante GX = 0x79BE667EF9DCBB5555160895CE870B07029BFCDB2DCE28D959F2815B16F81798;
constante uint256 GY = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8;
uint256 constante PP = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFFFFC2F;
uint256 constante AA = 0;
uint256 constante BB = 7; función derivePubKey (uint256 privKey) retornos puros públicos (uint256 qx, uint256 qy) {
(qx, qy) = ecMul (
privKey,
GX,
GY
AUTOMÓVIL CLUB BRITÁNICO,
PÁGINAS
);
}
}

El repositorio incluye un análisis exhaustivo del consumo de gas de todas las funciones de la biblioteca.

Como ejemplo ilustrativo, el costo de una operación de derivación clave en Secp256k1 es de alrededor de 550k de gas.

Consumo de gas de la operación de derivación clave en la curva Secp256k1

Queremos agradecer a los siguientes recursos y autores, en los que se inspiró nuestra biblioteca: