Seed based dilithium key generation
This commit is contained in:
@@ -81,7 +81,7 @@ CClib_methods[] =
|
|||||||
{ (char *)"musig", (char *)"verify", (char *)"msg sig pubkey", 3, 3, 'V', EVAL_MUSIG },
|
{ (char *)"musig", (char *)"verify", (char *)"msg sig pubkey", 3, 3, 'V', EVAL_MUSIG },
|
||||||
{ (char *)"musig", (char *)"send", (char *)"combined_pk amount", 2, 2, 'x', EVAL_MUSIG },
|
{ (char *)"musig", (char *)"send", (char *)"combined_pk amount", 2, 2, 'x', EVAL_MUSIG },
|
||||||
{ (char *)"musig", (char *)"spend", (char *)"sendtxid sig destpubkey", 3, 3, 'y', EVAL_MUSIG },
|
{ (char *)"musig", (char *)"spend", (char *)"sendtxid sig destpubkey", 3, 3, 'y', EVAL_MUSIG },
|
||||||
{ (char *)"dilithium", (char *)"keypair", (char *)"<no args>", 0, 0, 'K', EVAL_DILITHIUM },
|
{ (char *)"dilithium", (char *)"keypair", (char *)"[hexseed]", 0, 1, 'K', EVAL_DILITHIUM },
|
||||||
{ (char *)"dilithium", (char *)"sign", (char *)"msg privkey", 2, 2, 'S', EVAL_DILITHIUM },
|
{ (char *)"dilithium", (char *)"sign", (char *)"msg privkey", 2, 2, 'S', EVAL_DILITHIUM },
|
||||||
{ (char *)"dilithium", (char *)"verify", (char *)"msg sig pubtxid", 3, 3, 'V', EVAL_DILITHIUM },
|
{ (char *)"dilithium", (char *)"verify", (char *)"msg sig pubtxid", 3, 3, 'V', EVAL_DILITHIUM },
|
||||||
{ (char *)"dilithium", (char *)"send", (char *)"pubtxid amount", 2, 2, 'x', EVAL_DILITHIUM },
|
{ (char *)"dilithium", (char *)"send", (char *)"pubtxid amount", 2, 2, 'x', EVAL_DILITHIUM },
|
||||||
|
|||||||
@@ -2437,7 +2437,8 @@ void challenge(poly *c,
|
|||||||
*
|
*
|
||||||
* Returns 0 (success)
|
* Returns 0 (success)
|
||||||
**************************************************/
|
**************************************************/
|
||||||
int _dilithium_keypair(uint8_t *pk, uint8_t *sk) {
|
int _dilithium_keypair(uint8_t *pk, uint8_t *sk,uint8_t *privkey)
|
||||||
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint8_t seedbuf[3*SEEDBYTES];
|
uint8_t seedbuf[3*SEEDBYTES];
|
||||||
uint8_t tr[CRHBYTES];
|
uint8_t tr[CRHBYTES];
|
||||||
@@ -2448,7 +2449,8 @@ int _dilithium_keypair(uint8_t *pk, uint8_t *sk) {
|
|||||||
polyveck s2, t, t1, t0;
|
polyveck s2, t, t1, t0;
|
||||||
|
|
||||||
/* Expand 32 bytes of randomness into rho, rhoprime and key */
|
/* Expand 32 bytes of randomness into rho, rhoprime and key */
|
||||||
randombytes(seedbuf, SEEDBYTES);
|
//randombytes(seedbuf, SEEDBYTES);
|
||||||
|
memcpy(seedbuf,privkey,SEEDBYTES);
|
||||||
shake256(seedbuf, 3*SEEDBYTES, seedbuf, SEEDBYTES);
|
shake256(seedbuf, 3*SEEDBYTES, seedbuf, SEEDBYTES);
|
||||||
rho = seedbuf;
|
rho = seedbuf;
|
||||||
rhoprime = rho + SEEDBYTES;
|
rhoprime = rho + SEEDBYTES;
|
||||||
@@ -2841,8 +2843,16 @@ int32_t main(void)
|
|||||||
|
|
||||||
UniValue dilithium_keypair(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
UniValue dilithium_keypair(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||||
{
|
{
|
||||||
UniValue result(UniValue::VOBJ); uint8_t pk[CRYPTO_PUBLICKEYBYTES],sk[CRYPTO_SECRETKEYBYTES]; char str[CRYPTO_SECRETKEYBYTES*2+1]; int32_t i;
|
UniValue result(UniValue::VOBJ); uint8_t seed[SEEDBYTES],pk[CRYPTO_PUBLICKEYBYTES],sk[CRYPTO_SECRETKEYBYTES]; char str[CRYPTO_SECRETKEYBYTES*2+1]; int32_t i,n,externalflag=0;
|
||||||
_dilithium_keypair(pk,sk);
|
//randombytes(seed,SEEDBYTES);
|
||||||
|
Myprivkey(seed);
|
||||||
|
if ( params != 0 && (n= cJSON_GetArraySize(params)) == 1 )
|
||||||
|
{
|
||||||
|
if ( musig_parsehash(seed,jitem(params,0),32) < 0 )
|
||||||
|
return(cclib_error(result,"error parsing seed"));
|
||||||
|
else externalflag = 1;
|
||||||
|
}
|
||||||
|
_dilithium_keypair(pk,sk,seed);
|
||||||
for (i=0; i<sizeof(pk); i++)
|
for (i=0; i<sizeof(pk); i++)
|
||||||
sprintf(&str[i<<1],"%02x",pk[i]);
|
sprintf(&str[i<<1],"%02x",pk[i]);
|
||||||
str[i<<1] = 0;
|
str[i<<1] = 0;
|
||||||
@@ -2851,6 +2861,12 @@ UniValue dilithium_keypair(uint64_t txfee,struct CCcontract_info *cp,cJSON *para
|
|||||||
sprintf(&str[i<<1],"%02x",sk[i]);
|
sprintf(&str[i<<1],"%02x",sk[i]);
|
||||||
str[i<<1] = 0;
|
str[i<<1] = 0;
|
||||||
result.push_back(Pair("privkey",str));
|
result.push_back(Pair("privkey",str));
|
||||||
|
for (i=0; i<SEEDBYTES; i++)
|
||||||
|
sprintf(&str[i<<1],"%02x",seed[i]);
|
||||||
|
str[i<<1] = 0;
|
||||||
|
result.push_back(Pair("seed",str));
|
||||||
|
if ( externalflag == 0 )
|
||||||
|
result.push_back(Pair("warning","test mode using privkey for -pubkey, only for testing. there is no point using quantum secure signing if you are using a privkey with a known secp256k1 pubkey!!"));
|
||||||
result.push_back(Pair("result","success"));
|
result.push_back(Pair("result","success"));
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
@@ -2858,7 +2874,7 @@ UniValue dilithium_keypair(uint64_t txfee,struct CCcontract_info *cp,cJSON *para
|
|||||||
UniValue dilithium_sign(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
UniValue dilithium_sign(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||||
{
|
{
|
||||||
UniValue result(UniValue::VOBJ);
|
UniValue result(UniValue::VOBJ);
|
||||||
_dilithium_sign(sm, &smlen, m, MLEN, sk); // 7.2
|
//_dilithium_sign(sm, &smlen, m, MLEN, sk); // 7.2
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user