Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- pragma solidity ^0.4.2;
- contract EC {
- uint256 constant gx = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798;
- uint256 constant gy = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8;
- uint256 constant n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F;
- uint256 constant a = 0;
- uint256 constant b = 7;
- function EC(){}
- function _add (uint256 x1,uint256 z1, uint256 x2,uint256 z2) constant returns(uint256 x3,uint256 z3){
- (x3, z3) = (addmod(mulmod(z2, x1, n), mulmod(x2, z1, n), n), mulmod(z1, z2, n));
- }
- function _sub (uint256 x1,uint256 z1, uint256 x2,uint256 z2) constant returns(uint256 x3,uint256 z3){
- (x3, z3) = (addmod(mulmod(z2, x1, n),mulmod(n-x2, z1, n), n), mulmod(z1, z2 , n));
- }
- function _multiply (uint256 x1,uint256 z1, uint256 x2,uint256 z2) constant returns(uint256 x3,uint256 z3){
- (x3, z3) = (mulmod(x1, x2 , n), mulmod(z1, z2 , n));
- }
- function _divide (uint256 x1,uint256 z1, uint256 x2,uint256 z2) constant returns(uint256 x3,uint256 z3){
- (x3, z3) = (mulmod(x1, z2 , n), mulmod(z1 , x2 , n));
- }
- function inv (uint256 a) constant returns(uint256 invA){
- uint256 t=0;
- uint256 newT=1;
- uint256 r=n;
- uint256 newR=a;
- uint256 q;
- while (newR != 0) {
- q = r / newR;
- (t, newT) = (newT, addmod(t , (n - mulmod(q, newT,n)) , n));
- (r, newR) = (newR, r - q * newR );
- }
- return t;
- }
- function Add (uint256 x1,uint256 y1,uint256 z1, uint256 x2,uint256 y2,uint256 z2) constant returns(uint256 x3,uint256 y3,uint256 z3) {
- uint256 l;
- uint256 lz;
- uint256 da;
- uint256 db;
- if ((x1==0)&&(y1==0)) {
- return (x2,y2,z2);
- }
- if ((x2==0)&&(y2==0)) {
- return (x1,y1,z1);
- }
- if ((x1==x2)&&(y1==y2)) {
- (l,lz) = _multiply(x1, z1, x1, z1);
- (l,lz) = _multiply(l, lz, 3, 1);
- (l,lz) = _add(l, lz, a, 1);
- (da,db) = _multiply(y1, z1, 2, 1);
- }
- else {
- (l,lz) = _sub(y2, z2, y1, z1);
- (da,db) = _sub(x2, z2, x1, z1);
- }
- (l, lz) = _divide(l, lz, da, db);
- (x3, da) = _multiply(l, lz, l, lz);
- (x3, da) = _sub(x3, da, x1, z1);
- (x3, da) = _sub(x3, da, x2, z2);
- (y3, db) = _sub(x1, z1, x3, da);
- (y3, db) = _multiply(y3, db, l, lz );
- (y3, db) = _sub(y3, db, y1, z1 );
- if (da != db) {
- x3 = mulmod(x3, db, n);
- y3 = mulmod(y3, da, n);
- z3 = mulmod(da, db, n);
- } else {
- z3 = da;
- }
- }
- function Double(uint256 x1,uint256 y1,uint256 z1) constant returns(uint256 x3,uint256 y3,uint256 z3){
- (x3,y3,z3) = Add(x1,y1,z1,x1,y1,z1);
- }
- function Mulultiply(uint256 d, uint256 x1,uint256 y1,uint256 z1) constant returns(uint256 x3,uint256 y3,uint256 z3){
- uint256 remaining = d;
- uint256 px = x1;
- uint256 py = y1;
- uint256 pz = z1;
- uint256 acx = 0;
- uint256 acy = 0;
- uint256 acz = 1;
- if (d==0) {
- return (0,0,1);
- }
- while (remaining != 0) {
- if ((remaining & 1) != 0) {
- (acx,acy,acz) = Add(acx,acy,acz, px,py,pz);
- }
- remaining = remaining / 2;
- (px,py,pz) = Double(px,py,pz);
- }
- (x3,y3,z3) = (acx,acy,acz);
- }
- function privkey_to_public(uint256 privKey) constant returns(uint256 qx, uint256 qy){
- uint256 x;
- uint256 y;
- uint256 z;
- (x,y,z) = Mulultiply(privKey, gx, gy, 1);
- z = inv(z);
- qx = mulmod(x , z ,n);
- qy = mulmod(y , z ,n);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement