Пример #1
0
	//地址是否合法
	PrivateKey::PrivateKey(SignatureType type) {
		std::string raw_pub_key = "";
		type_ = type;
		if (type_ == SIGNTYPE_ED25519) {
			utils::MutexGuard guard_(lock_);
			// ed25519;
			raw_priv_key_.resize(32);
			//ed25519_randombytes_unsafe((void*)raw_priv_key_.c_str(), 32);
			if (!utils::GetStrongRandBytes(raw_priv_key_)){
				valid_ = false;
				return;
			}
			raw_pub_key.resize(32);
			ed25519_publickey((const unsigned char*)raw_priv_key_.c_str(), (unsigned char*)raw_pub_key.c_str());
		}
		else if (type_ == SIGNTYPE_CFCASM2) {
			utils::EccSm2 key(utils::EccSm2::GetCFCAGroup());
			key.NewRandom();
			raw_priv_key_ = key.getSkeyBin();
			raw_pub_key = key.GetPublicKey();
		}
		else{
			LOG_ERROR("Unknown signature type(%d)", type_);
		}
		pub_key_.Init(raw_pub_key);
		pub_key_.type_ = type_;
		pub_key_.valid_ = true;
		valid_ = true;
	}
Пример #2
0
void Page::resign(const std::array<uint8_t, Const::ED25519_KEY_LEN>& sk)
{
  ed25519_public_key pk;
  ed25519_publickey(sk.data(), pk);

  Json::FastWriter writer;
  std::string data = writer.write(getCommonData());
  const uint8_t* bytes = reinterpret_cast<const uint8_t*>(data.c_str());
  ed25519_sign(bytes, data.size(), sk.data(), pk, pageSig_.data());
}
Пример #3
0
int main() {
	int i, res;
	ed25519_public_key pk;
	ed25519_signature sig;
	unsigned char forge[1024] = {'x'};
	curved25519_key csk[2] = {{255}};
	uint64_t ticks, pkticks = maxticks, signticks = maxticks, openticks = maxticks, curvedticks = maxticks;

	for (i = 0; i < 1024; i++) {
		ed25519_publickey(dataset[i].sk, pk);
		edassertequal(dataset[i].pk, pk, sizeof(pk), i, "public key didn't match");
		ed25519_sign((unsigned char *)dataset[i].m, i, dataset[i].sk, pk, sig);
		edassertequal(dataset[i].sig, sig, sizeof(sig), i, "signature didn't match");
		edassert(!ed25519_sign_open((unsigned char *)dataset[i].m, i, pk, sig), i, "failed to open message");

		memcpy(forge, dataset[i].m, i);
		if (i)
			forge[i - 1] += 1;

		edassert(ed25519_sign_open(forge, (i) ? i : 1, pk, sig), i, "opened forged message");
	}

	for (i = 0; i < 1024; i++)
		curved25519_scalarmult_basepoint(csk[(i & 1) ^ 1], csk[i & 1]);
	edassertequal(curved25519_expected, csk[0], sizeof(curved25519_key), 0, "curve25519 failed to generate correct value");

	printf("success\n");

	for (i = 0; i < 2048; i++) {
		timeit(ed25519_publickey(dataset[0].sk, pk), pkticks)
		edassertequal(dataset[0].pk, pk, sizeof(pk), i, "public key didn't match");
		timeit(ed25519_sign((unsigned char *)dataset[0].m, 0, dataset[0].sk, pk, sig), signticks)
		edassertequal(dataset[0].sig, sig, sizeof(sig), i, "signature didn't match");
		timeit(res = ed25519_sign_open((unsigned char *)dataset[0].m, 0, pk, sig), openticks)
		edassert(!res, 0, "failed to open message");
		timeit(curved25519_scalarmult_basepoint(csk[1], csk[0]), curvedticks);
	}
	printf("%.0f ticks/public key generation\n", (double)pkticks);
	printf("%.0f ticks/signature\n", (double)signticks);
	printf("%.0f ticks/signature verification\n", (double)openticks);
	printf("%.0f ticks/curve25519 basepoint scalarmult\n", (double)curvedticks);
	return 0;
}
Пример #4
0
TEST (uint256_union, key_encryption)
{
    rai::keypair key1;
    rai::raw_key secret_key;
    secret_key.data.bytes.fill (0);
    rai::uint256_union encrypted;
	encrypted.encrypt (key1.prv, secret_key, key1.pub.owords [0]);
    rai::raw_key key4;
	key4.decrypt (encrypted, secret_key, key1.pub.owords [0]);
    ASSERT_EQ (key1.prv, key4);
    rai::public_key pub;
    ed25519_publickey (key4.data.bytes.data (), pub.bytes.data ());
    ASSERT_EQ (key1.pub, pub);
}
Пример #5
0
/** Create a fulfillment given a secret key and the message */
Ed25519::Ed25519 (
    SecretKey const& secretKey,
    Slice message)
{
    // First derive the public key, and place it in the
    // payload:
    ed25519_publickey (
        secretKey.data(),
        payload_.data());

    ed25519_sign (
        message.data(),
        message.size(),
        secretKey.data(),
        payload_.data(),
        payload_.data() + pubkey_size_);
}
Пример #6
0
	//not modify
	bool PrivateKey::From(const std::string &encode_private_key) {
		valid_ = false;
		std::string tmp;

		do {
			PrivateKeyPrefix prefix;
			std::string raw_pubkey;
			valid_ = GetKeyElement(encode_private_key, prefix, type_, raw_priv_key_);
			if (!valid_) {
				return false;
			}

			if (prefix != PRIVATEKEY_PREFIX) {
				valid_ = false;
				return false;
			}

			if (type_ == SIGNTYPE_ED25519) {
				tmp.resize(32);
				ed25519_publickey((const unsigned char*)raw_priv_key_.c_str(), (unsigned char*)tmp.c_str());
			}
			else if (type_ == SIGNTYPE_CFCASM2) {
				utils::EccSm2 skey(utils::EccSm2::GetCFCAGroup());
				skey.From(raw_priv_key_);
				tmp = skey.GetPublicKey();
			}
			else{
				LOG_ERROR("Unknown signature type(%d)", type_);
			}
			//ToBase58();
			pub_key_.type_ = type_;
			pub_key_.Init(tmp);
			pub_key_.valid_ = true;
			valid_ = true;

		} while (false);
		return valid_;
	}
Пример #7
0
Json::Value walletPropose (Json::Value const& params)
{
    DivvyAddress   naSeed;
    DivvyAddress   naAccount;

    KeyType type = KeyType::secp256k1;

    bool const has_key_type   = params.isMember (jss::key_type);
    bool const has_passphrase = params.isMember (jss::passphrase);

    if (has_key_type)
    {
        // `key_type` must be valid if present.

        type = keyTypeFromString (params[jss::key_type].asString());

        if (type == KeyType::invalid)
        {
            return rpcError (rpcBAD_SEED);
        }

        naSeed = getSeedFromRPC (params);
    }
    else if (has_passphrase)
    {
        naSeed.setSeedGeneric (params[jss::passphrase].asString());
    }
    else
    {
        naSeed.setSeedRandom();
    }

    if (!naSeed.isSet())
    {
        return rpcError(rpcBAD_SEED);
    }

    if (type == KeyType::secp256k1)
    {
        DivvyAddress naGenerator = DivvyAddress::createGeneratorPublic (naSeed);
        naAccount.setAccountPublic (naGenerator, 0);
    }
    else if (type == KeyType::ed25519)
    {
        uint256 secretkey = keyFromSeed (naSeed.getSeed());

        Blob publickey (33);
        publickey[0] = 0xED;
        ed25519_publickey (secretkey.data(), &publickey[1]);
        secretkey.zero();  // security erase

        naAccount.setAccountPublic (publickey);
    }
    else
    {
        assert (false);  // not reached
    }

    Json::Value obj (Json::objectValue);

    obj[jss::master_seed] = naSeed.humanSeed ();
    obj[jss::master_seed_hex] = to_string (naSeed.getSeed ());
    obj[jss::master_key] = naSeed.humanSeed1751();
    obj[jss::account_id] = naAccount.humanAccountID ();
    obj[jss::public_key] = naAccount.humanAccountPublic();
    obj[jss::key_type] = to_string (type);

    auto acct = naAccount.getAccountPublic();
    obj[jss::public_key_hex] = strHex(acct.begin(), acct.size());

    return obj;
}