📄 kg_ecc.c
字号:
/****************************************************************************
* *
* cryptlib ECC Key Generation/Checking Routines *
* Copyright Matthias Bruestle and Peter Gutmann 2006-2007 *
* *
****************************************************************************/
#define PKC_CONTEXT /* Indicate that we're working with PKC context */
#if defined( INC_ALL )
#include "crypt.h"
#include "context.h"
#include "keygen.h"
#else
#include "crypt.h"
#include "context/context.h"
#include "context/keygen.h"
#endif /* Compiler-specific includes */
#ifdef USE_ECC
/****************************************************************************
* *
* Fixed ECC Parameters *
* *
****************************************************************************/
/* We always used pre-generated parameters both because it's unlikely that
anyone will ever decide to generate nonstandard parameters when standard
ones are available (or at least no sane person, no doubt every little
standards committee wanting to make their mark will feel the need to
have their own personal incompatible parameters). In addition using
externally-generated parameters can (as for DSA) lead to problems with
maliciously-generated paramters (see "CM-Curves with good Cryptography
Properties", Neal Koblitz, Proceedings of Crypto'91, p.279), and finally
(also like DSA) it can lead to problems with parameter-substitution
attacks (see "Digital Signature Schemes with Domain Parameters", Serge
Vaudenay, Proceedings of ACISP'04, p.188) */
typedef struct {
ECC_PARAM_TYPE paramType;
const int curveSizeBits;
const BYTE *p;
const BYTE *a;
const BYTE *b;
const BYTE *gx;
const BYTE *gy;
const BYTE *r;
} ECC_DOMAIN_PARAMS;
static const ECC_DOMAIN_PARAMS domainParamTbl[] = {
/* NIST P192, X9.62 P192v1 */
{ ECC_PARAM_P192, 192,
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF",
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC",
"\x64\x21\x05\x19\xE5\x9C\x80\xE7\x0F\xA7\xE9\xAB\x72\x24\x30\x49" \
"\xFE\xB8\xDE\xEC\xC1\x46\xB9\xB1",
"\x18\x8D\xA8\x0E\xB0\x30\x90\xF6\x7C\xBF\x20\xEB\x43\xA1\x88\x00" \
"\xF4\xFF\x0A\xFD\x82\xFF\x10\x12",
"\x07\x19\x2B\x95\xFF\xC8\xDA\x78\x63\x10\x11\xED\x6B\x24\xCD\xD5" \
"\x73\xF9\x77\xA1\x1E\x79\x48\x11",
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x99\xDE\xF8\x36" \
"\x14\x6B\xC9\xB1\xB4\xD2\x28\x31" },
#if 0
/* X9.62 P192v2 */
{ ECC_PARAM_P192v2, 192,
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF",
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC",
"\xCC\x22\xD6\xDF\xB9\x5C\x6B\x25\xE4\x9C\x0D\x63\x64\xA4\xE5\x98" \
"\x0C\x39\x3A\xA2\x16\x68\xD9\x53",
"\xEE\xA2\xBA\xE7\xE1\x49\x78\x42\xF2\xDE\x77\x69\xCF\xE9\xC9\x89" \
"\xC0\x72\xAD\x69\x6F\x48\x03\x4A",
"\x65\x74\xD1\x1D\x69\xB6\xEC\x7A\x67\x2B\xB8\x2A\x08\x3D\xF2\xF2" \
"\xB0\x84\x7D\xE9\x70\xB2\xDE\x15",
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\x5F\xB1\xA7\x24" \
"\xDC\x80\x41\x86\x48\xD8\xDD\x31" },
/* X9.62 P192v3 */
{ ECC_PARAM_P192v3, 192,
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF",
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC",
"\x22\x12\x3D\xC2\x39\x5A\x05\xCA\xA7\x42\x3D\xAE\xCC\xC9\x47\x60" \
"\xA7\xD4\x62\x25\x6B\xD5\x69\x16",
"\x7D\x29\x77\x81\x00\xC6\x5A\x1D\xA1\x78\x37\x16\x58\x8D\xCE\x2B" \
"\x8B\x4A\xEE\x8E\x22\x8F\x18\x96",
"\x38\xA9\x0F\x22\x63\x73\x37\x33\x4B\x49\xDC\xB6\x6A\x6D\xC8\xF9" \
"\x97\x8A\xCA\x76\x48\xA9\x43\xB0",
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7A\x62\xD0\x31" \
"\xC8\x3F\x42\x94\xF6\x40\xEC\x13" },
/* NIST P224 */
{ ECC_PARAM_P224, 224,
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01",
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE",
"\xB4\x05\x0A\x85\x0C\x04\xB3\xAB\xF5\x41\x32\x56\x50\x44\xB0\xB7" \
"\xD7\xBF\xD8\xBA\x27\x0B\x39\x43\x23\x55\xFF\xB4",
"\xB7\x0E\x0C\xBD\x6B\xB4\xBF\x7F\x32\x13\x90\xB9\x4A\x03\xC1\xD3" \
"\x56\xC2\x11\x22\x34\x32\x80\xD6\x11\x5C\x1D\x21",
"\xBD\x37\x63\x88\xB5\xF7\x23\xFB\x4C\x22\xDF\xE6\xCD\x43\x75\xA0" \
"\x5A\x07\x47\x64\x44\xD5\x81\x99\x85\x00\x7E\x34",
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\xA2" \
"\xE0\xB8\xF0\x3E\x13\xDD\x29\x45\x5C\x5C\x2A\x3D" },
/* X9.62 P239v1 */
{ ECC_PARAM_P239, 239,
"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\xFF\xFF\xFF" \
"\xFF\xFF\x80\x00\x00\x00\x00\x00\x7F\xFF\xFF\xFF\xFF\xFF",
"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\xFF\xFF\xFF" \
"\xFF\xFF\x80\x00\x00\x00\x00\x00\x7F\xFF\xFF\xFF\xFF\xFC",
"\x6B\x01\x6C\x3B\xDC\xF1\x89\x41\xD0\xD6\x54\x92\x14\x75\xCA\x71" \
"\xA9\xDB\x2F\xB2\x7D\x1D\x37\x79\x61\x85\xC2\x94\x2C\x0A",
"\x0F\xFA\x96\x3C\xDC\xA8\x81\x6C\xCC\x33\xB8\x64\x2B\xED\xF9\x05" \
"\xC3\xD3\x58\x57\x3D\x3F\x27\xFB\xBD\x3B\x3C\xB9\xAA\xAF",
"\x7D\xEB\xE8\xE4\xE9\x0A\x5D\xAE\x6E\x40\x54\xCA\x53\x0B\xA0\x46" \
"\x54\xB3\x68\x18\xCE\x22\x6B\x39\xFC\xCB\x7B\x02\xF1\xAE",
"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\xFF\xFF\x9E" \
"\x5E\x9A\x9F\x5D\x90\x71\xFB\xD1\x52\x26\x88\x90\x9D\x0B" },
/* X9.62 P239v2 */
{ ECC_PARAM_P239v2, 239,
"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\xFF\xFF\xFF" \
"\xFF\xFF\x80\x00\x00\x00\x00\x00\x7F\xFF\xFF\xFF\xFF\xFF",
"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\xFF\xFF\xFF" \
"\xFF\xFF\x80\x00\x00\x00\x00\x00\x7F\xFF\xFF\xFF\xFF\xFC",
"\x61\x7F\xAB\x68\x32\x57\x6C\xBB\xFE\xD5\x0D\x99\xF0\x24\x9C\x3F" \
"\xEE\x58\xB9\x4B\xA0\x03\x8C\x7A\xE8\x4C\x8C\x83\x2F\x2C",
"\x38\xAF\x09\xD9\x87\x27\x70\x51\x20\xC9\x21\xBB\x5E\x9E\x26\x29" \
"\x6A\x3C\xDC\xF2\xF3\x57\x57\xA0\xEA\xFD\x87\xB8\x30\xE7",
"\x5B\x01\x25\xE4\xDB\xEA\x0E\xC7\x20\x6D\xA0\xFC\x01\xD9\xB0\x81" \
"\x32\x9F\xB5\x55\xDE\x6E\xF4\x60\x23\x7D\xFF\x8B\xE4\xBA",
"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x00\x00\xCF" \
"\xA7\xE8\x59\x43\x77\xD4\x14\xC0\x38\x21\xBC\x58\x20\x63" },
/* X9.62 P239v3 */
{ ECC_PARAM_P239v3, 239,
"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\xFF\xFF\xFF" \
"\xFF\xFF\x80\x00\x00\x00\x00\x00\x7F\xFF\xFF\xFF\xFF\xFF",
"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\xFF\xFF\xFF" \
"\xFF\xFF\x80\x00\x00\x00\x00\x00\x7F\xFF\xFF\xFF\xFF\xFC",
"\x25\x57\x05\xFA\x2A\x30\x66\x54\xB1\xF4\xCB\x03\xD6\xA7\x50\xA3" \
"\x0C\x25\x01\x02\xD4\x98\x87\x17\xD9\xBA\x15\xAB\x6D\x3E",
"\x67\x68\xAE\x8E\x18\xBB\x92\xCF\xCF\x00\x5C\x94\x9A\xA2\xC6\xD9" \
"\x48\x53\xD0\xE6\x60\xBB\xF8\x54\xB1\xC9\x50\x5F\xE9\x5A",
"\x16\x07\xE6\x89\x8F\x39\x0C\x06\xBC\x1D\x55\x2B\xAD\x22\x6F\x3B" \
"\x6F\xCF\xE4\x8B\x6E\x81\x84\x99\xAF\x18\xE3\xED\x6C\xF3",
"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\xFF\xFF\x97" \
"\x5D\xEB\x41\xB3\xA6\x05\x7C\x3C\x43\x21\x46\x52\x65\x51" },
#endif /* 0 */
/* NIST P256, X9.62 P256v1 */
{ ECC_PARAM_P256, 256,
"\xFF\xFF\xFF\xFF\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF",
"\xFF\xFF\xFF\xFF\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC",
"\x5A\xC6\x35\xD8\xAA\x3A\x93\xE7\xB3\xEB\xBD\x55\x76\x98\x86\xBC" \
"\x65\x1D\x06\xB0\xCC\x53\xB0\xF6\x3B\xCE\x3C\x3E\x27\xD2\x60\x4B",
"\x6B\x17\xD1\xF2\xE1\x2C\x42\x47\xF8\xBC\xE6\xE5\x63\xA4\x40\xF2" \
"\x77\x03\x7D\x81\x2D\xEB\x33\xA0\xF4\xA1\x39\x45\xD8\x98\xC2\x96",
"\x4F\xE3\x42\xE2\xFE\x1A\x7F\x9B\x8E\xE7\xEB\x4A\x7C\x0F\x9E\x16" \
"\x2B\xCE\x33\x57\x6B\x31\x5E\xCE\xCB\xB6\x40\x68\x37\xBF\x51\xF5",
"\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xBC\xE6\xFA\xAD\xA7\x17\x9E\x84\xF3\xB9\xCA\xC2\xFC\x63\x25\x51" },
#if 0
/* NIST P384 */
{ ECC_PARAM_P384, 384,
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE" \
"\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF",
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE" \
"\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFC",
"\xB3\x31\x2F\xA7\xE2\x3E\xE7\xE4\x98\x8E\x05\x6B\xE3\xF8\x2D\x19" \
"\x18\x1D\x9C\x6E\xFE\x81\x41\x12\x03\x14\x08\x8F\x50\x13\x87\x5A" \
"\xC6\x56\x39\x8D\x8A\x2E\xD1\x9D\x2A\x85\xC8\xED\xD3\xEC\x2A\xEF",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -