int main(void) { int i; secp256k1_pubkey_t pubkey; secp256k1_ecdsa_signature_t sig; benchmark_verify_t data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); for (i = 0; i < 32; i++) { data.msg[i] = 1 + i; } for (i = 0; i < 32; i++) { data.key[i] = 33 + i; } data.siglen = 72; CHECK(secp256k1_ecdsa_sign(data.ctx, &sig, data.msg, data.key, NULL, NULL)); CHECK(secp256k1_ecdsa_signature_serialize_der(data.ctx, data.sig, &data.siglen, &sig)); CHECK(secp256k1_ec_pubkey_create(data.ctx, &pubkey, data.key)); CHECK(secp256k1_ec_pubkey_serialize(data.ctx, data.pubkey, &data.pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED) == 1); run_benchmark("ecdsa_verify", benchmark_verify, NULL, NULL, &data, 10, 20000); secp256k1_context_destroy(data.ctx); return 0; }
int main(void) { int i; secp256k1_pubkey pubkey; secp256k1_ecdsa_signature sig; benchmark_verify_t data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); for (i = 0; i < 32; i++) { data.msg[i] = 1 + i; } for (i = 0; i < 32; i++) { data.key[i] = 33 + i; } data.siglen = 72; CHECK(secp256k1_ecdsa_sign(data.ctx, &sig, data.msg, data.key, NULL, NULL)); CHECK(secp256k1_ecdsa_signature_serialize_der(data.ctx, data.sig, &data.siglen, &sig)); CHECK(secp256k1_ec_pubkey_create(data.ctx, &pubkey, data.key)); data.pubkeylen = 33; CHECK(secp256k1_ec_pubkey_serialize(data.ctx, data.pubkey, &data.pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED) == 1); run_benchmark("ecdsa_verify", benchmark_verify, NULL, NULL, &data, 10, 20000); #ifdef ENABLE_OPENSSL_TESTS data.ec_group = EC_GROUP_new_by_curve_name(NID_secp256k1); run_benchmark("ecdsa_verify_openssl", benchmark_verify_openssl, NULL, NULL, &data, 10, 20000); EC_GROUP_free(data.ec_group); #endif secp256k1_context_destroy(data.ctx); return 0; }
size_t signature_to_der(secp256k1_context *secpctx, u8 der[72], const struct signature *sig) { size_t len = 72; secp256k1_ecdsa_signature_serialize_der(secpctx, der, &len, &sig->sig); /* IsValidSignatureEncoding() expect extra byte for sighash */ assert(IsValidSignatureEncoding(der, len + 1)); return len; }
bool ecc_sign(const uint8_t *private_key, const uint8_t *hash, unsigned char *sigder, size_t *outlen) { assert(secp256k1_ctx); secp256k1_ecdsa_signature sig; if (!secp256k1_ecdsa_sign(secp256k1_ctx, &sig, hash, private_key, secp256k1_nonce_function_rfc6979, NULL)) return false; if (secp256k1_ecdsa_signature_serialize_der(secp256k1_ctx, sigder, outlen, &sig)) return false; return true; }
bool encode_signature(der_signature& out, const ec_signature& signature) { // Copy to avoid exposing external types. secp256k1_ecdsa_signature sign; std::copy(signature.begin(), signature.end(), std::begin(sign.data)); const auto context = signing.context(); auto size = max_der_signature_size; out.resize(size); if (secp256k1_ecdsa_signature_serialize_der(context, out.data(), &size, &sign) != 1) return false; out.resize(size); return true; }
SECP256K1_API jobjectArray JNICALL Java_org_commercium_NativeSecp256k1_secp256k1_1ecdsa_1sign (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); unsigned char* secKey = (unsigned char*) (data + 32); jobjectArray retArray; jbyteArray sigArray, intsByteArray; unsigned char intsarray[2]; secp256k1_ecdsa_signature sig[72]; int ret = secp256k1_ecdsa_sign(ctx, sig, data, secKey, NULL, NULL ); unsigned char outputSer[72]; size_t outputLen = 72; if( ret ) { int ret2 = secp256k1_ecdsa_signature_serialize_der(ctx,outputSer, &outputLen, sig ); (void)ret2; } intsarray[0] = outputLen; intsarray[1] = ret; retArray = (*env)->NewObjectArray(env, 2, (*env)->FindClass(env, "[B"), (*env)->NewByteArray(env, 1)); sigArray = (*env)->NewByteArray(env, outputLen); (*env)->SetByteArrayRegion(env, sigArray, 0, outputLen, (jbyte*)outputSer); (*env)->SetObjectArrayElement(env, retArray, 0, sigArray); intsByteArray = (*env)->NewByteArray(env, 2); (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); (void)classObject; return retArray; }
bool bp_sign(const struct bp_key *key, const void *data, size_t data_len, void **sig_, size_t *sig_len_) { secp256k1_ecdsa_signature sig; if (32 != data_len) { return false; } secp256k1_context *ctx = get_secp256k1_context(); if (!ctx) { return false; } if (!secp256k1_ec_seckey_verify(ctx, key->secret)) { return false; } if (!secp256k1_ecdsa_sign(ctx, &sig, data, key->secret, secp256k1_nonce_function_rfc6979, NULL)) { return false; } *sig_ = malloc(72); *sig_len_ = 72; if (!secp256k1_ecdsa_signature_serialize_der(ctx, *sig_, sig_len_, &sig)) { free(sig_); *sig_ = NULL; return false; } return true; }