mirror of
				https://github.com/Laupetin/OpenAssetTools.git
				synced 2025-11-04 12:37:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
 | 
						|
 *
 | 
						|
 * LibTomCrypt is a library that provides various cryptographic
 | 
						|
 * algorithms in a highly modular and flexible manner.
 | 
						|
 *
 | 
						|
 * The library is free for all purposes without any express
 | 
						|
 * guarantee it works.
 | 
						|
 */
 | 
						|
 | 
						|
/* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b
 | 
						|
 *
 | 
						|
 * All curves taken from NIST recommendation paper of July 1999
 | 
						|
 * Available at http://csrc.nist.gov/cryptval/dss.htm
 | 
						|
 */
 | 
						|
#include "tomcrypt.h"
 | 
						|
 | 
						|
/**
 | 
						|
  @file ecc_ansi_x963_export.c
 | 
						|
  ECC Crypto, Tom St Denis
 | 
						|
*/
 | 
						|
 | 
						|
#ifdef LTC_MECC
 | 
						|
 | 
						|
/** ECC X9.63 (Sec. 4.3.6) uncompressed export
 | 
						|
  @param key     Key to export
 | 
						|
  @param out     [out] destination of export
 | 
						|
  @param outlen  [in/out]  Length of destination and final output size
 | 
						|
  Return CRYPT_OK on success
 | 
						|
*/
 | 
						|
int ecc_ansi_x963_export(ecc_key *key, unsigned char *out, unsigned long *outlen)
 | 
						|
{
 | 
						|
   unsigned char buf[ECC_BUF_SIZE];
 | 
						|
   unsigned long numlen, xlen, ylen;
 | 
						|
 | 
						|
   LTC_ARGCHK(key    != NULL);
 | 
						|
   LTC_ARGCHK(outlen != NULL);
 | 
						|
 | 
						|
   if (ltc_ecc_is_valid_idx(key->idx) == 0) {
 | 
						|
      return CRYPT_INVALID_ARG;
 | 
						|
   }
 | 
						|
   numlen = key->dp->size;
 | 
						|
   xlen = mp_unsigned_bin_size(key->pubkey.x);
 | 
						|
   ylen = mp_unsigned_bin_size(key->pubkey.y);
 | 
						|
 | 
						|
   if (xlen > numlen || ylen > numlen || sizeof(buf) < numlen) {
 | 
						|
      return CRYPT_BUFFER_OVERFLOW;
 | 
						|
   }
 | 
						|
 | 
						|
   if (*outlen < (1 + 2*numlen)) {
 | 
						|
      *outlen = 1 + 2*numlen;
 | 
						|
      return CRYPT_BUFFER_OVERFLOW;
 | 
						|
   }
 | 
						|
 | 
						|
   LTC_ARGCHK(out    != NULL);
 | 
						|
 | 
						|
   /* store byte 0x04 */
 | 
						|
   out[0] = 0x04;
 | 
						|
 | 
						|
   /* pad and store x */
 | 
						|
   zeromem(buf, sizeof(buf));
 | 
						|
   mp_to_unsigned_bin(key->pubkey.x, buf + (numlen - xlen));
 | 
						|
   XMEMCPY(out+1, buf, numlen);
 | 
						|
 | 
						|
   /* pad and store y */
 | 
						|
   zeromem(buf, sizeof(buf));
 | 
						|
   mp_to_unsigned_bin(key->pubkey.y, buf + (numlen - ylen));
 | 
						|
   XMEMCPY(out+1+numlen, buf, numlen);
 | 
						|
 | 
						|
   *outlen = 1 + 2*numlen;
 | 
						|
   return CRYPT_OK;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
/* ref:         HEAD -> master, tag: v1.18.2 */
 | 
						|
/* git commit:  7e7eb695d581782f04b24dc444cbfde86af59853 */
 | 
						|
/* commit time: 2018-07-01 22:49:01 +0200 */
 |