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

📄 ec_crypt.c

📁 加密算法实现 Pegwit is a program for performing public key file encryption and authentication. Encr
💻 C
字号:
/*
 * Elliptic curve cryptographic primitives
 *
 * This public domain software was written by Paulo S.L.M. Barreto
 * <pbarreto@uninet.com.br> based on original C++ software written by
 * George Barwood <george.barwood@dial.pipex.com>
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "ec_curve.h"
#include "ec_vlong.h"
#include "ec_crypt.h"

void cpMakePublicKey (vlPoint vlPublicKey, const vlPoint vlPrivateKey)
{
	ecPoint ecPublicKey;

	ecCopy (&ecPublicKey, &curve_point);
	ecMultiply (&ecPublicKey, vlPrivateKey);
	ecPack (&ecPublicKey, vlPublicKey);
} /* cpMakePublicKey */


void cpEncodeSecret (const vlPoint vlPublicKey, vlPoint vlMessage, vlPoint vlSecret)
{
	ecPoint q;

	ecCopy (&q, &curve_point); ecMultiply (&q, vlSecret); ecPack (&q, vlMessage);
	ecUnpack (&q, vlPublicKey); ecMultiply (&q, vlSecret);	gfPack (q.x, vlSecret);
} /* cpMakeSecret */


void cpDecodeSecret (const vlPoint vlPrivateKey, const vlPoint vlMessage, vlPoint d)
{
	ecPoint q;

		ecUnpack (&q, vlMessage);	
	ecMultiply (&q, vlPrivateKey);
	gfPack(q.x, d);
} /* ecDecodeSecret */

void cpSign(const vlPoint vlPrivateKey, const vlPoint k, const vlPoint vlMac, cpPair * sig)
{
	ecPoint q;
	vlPoint tmp;
				
	ecCopy( &q, &curve_point );
	ecMultiply( &q, k);
	gfPack(q.x, sig->r);
	vlAdd( sig->r, vlMac );
	vlRemainder( sig->r, prime_order );
	if ( sig->r[0] == 0 ) return;
	vlMulMod( tmp, vlPrivateKey, sig->r, prime_order );
	vlCopy( sig->s, k );
	if ( vlGreater( tmp, sig->s ) )
		vlAdd( sig->s, prime_order );
	vlSubtract( sig->s, tmp );
} /* cpSign */

int cpVerify(const vlPoint vlPublicKey, const vlPoint vlMac, cpPair * sig )
{
	ecPoint t1,t2;
	vlPoint t3,t4;
	
	ecCopy( &t1, &curve_point );
	ecMultiply( &t1, sig->s );
	ecUnpack( &t2, vlPublicKey );
	ecMultiply( &t2, sig->r );
	ecAdd( &t1, &t2 );
	gfPack( t1.x, t4 );
	vlRemainder( t4, prime_order );
	vlCopy( t3, sig->r );
	if ( vlGreater( t4, t3 ) )
		vlAdd( t3, prime_order );
	vlSubtract( t3, t4 );
	return vlEqual( t3, vlMac );
} /* cpVerify */

⌨️ 快捷键说明

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