From 9bc30bf9727cda5a6a78668843b01c689e25bc18 Mon Sep 17 00:00:00 2001 From: J08nY Date: Fri, 27 Jul 2018 22:37:53 +0200 Subject: Get Mscng signatures to work (partially). --- src/cz/crcs/ectester/standalone/libs/jni/mscng.c | 156 +++++++++-------------- 1 file changed, 63 insertions(+), 93 deletions(-) (limited to 'src') diff --git a/src/cz/crcs/ectester/standalone/libs/jni/mscng.c b/src/cz/crcs/ectester/standalone/libs/jni/mscng.c index b0b71be..04b0fcf 100644 --- a/src/cz/crcs/ectester/standalone/libs/jni/mscng.c +++ b/src/cz/crcs/ectester/standalone/libs/jni/mscng.c @@ -448,59 +448,46 @@ static jobject key_to_privkey(JNIEnv *env, BCRYPT_KEY_HANDLE key) { ULONG paramLength; jobject ec_priv_param_spec = create_ec_param_spec(env, fullBuf, ¶mLength); - free(fullBuf); - - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPRIVATE_BLOB, NULL, 0, &bufSize, 0))) { - //err - wprintf(L"**** Error 0x%x returned by BCryptExportKey(length only)\n", status); - return NULL; - } - - PBYTE privBuf = calloc(bufSize, 1); - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPRIVATE_BLOB, privBuf, bufSize, &bufSize, 0))) { - //err - wprintf(L"**** Error 0x%x returned by BCryptExportKey(whole)\n", status); - return NULL; - } - printf("generate length %lu\n", bufSize); - printf("generated privkey: "); - for (size_t i = 0; i < bufSize; ++i) { - printf("%02x", (unsigned)privBuf[i] & 0xffU); - } - printf("\n"); - - // privBuf looks like: - // BCRYPT_ECCKEY_BLOB header - // Qx[cbKey] X-coordinate of the public point. - // Qy[cbKey] Y-coordinate of the public point. - // d[cbKey] Private key. - BCRYPT_ECCKEY_BLOB *privHeader = (BCRYPT_ECCKEY_BLOB*)privBuf; - PBYTE priv_x = &privBuf[sizeof(BCRYPT_ECCKEY_BLOB)]; - PBYTE priv_y = priv_x + privHeader->cbKey; - PBYTE priv = priv_y + privHeader->cbKey; - - jbyteArray header_bytes = (*env)->NewByteArray(env, sizeof(BCRYPT_ECCKEY_BLOB)); + // fullBuf looks like: + // BCRYPT_ECCFULLKEY_BLOB header + // P[cbFieldLength] Prime specifying the base field. + // A[cbFieldLength] Coefficient A of the equation y^2 = x^3 + A*x + B mod p + // B[cbFieldLength] Coefficient B of the equation y^2 = x^3 + A*x + B mod p + // Gx[cbFieldLength] X-coordinate of the base point. + // Gy[cbFieldLength] Y-coordinate of the base point. + // n[cbSubgroupOrder] Order of the group generated by G = (x,y) + // h[cbCofactor] Cofactor of G in E. + // S[cbSeed] Seed of the curve. + // Qx[cbFieldLength] X-coordinate of the public point. + // Qy[cbFieldLength] Y-coordinate of the public point. + // d[cbSubgroupOrder] Private key. + BCRYPT_ECCFULLKEY_BLOB *privHeader = (BCRYPT_ECCFULLKEY_BLOB*)fullBuf; + PBYTE priv_x = &fullBuf[paramLength]; + PBYTE priv_y = priv_x + privHeader->cbFieldLength; + PBYTE priv = priv_y + privHeader->cbFieldLength; + + jbyteArray header_bytes = (*env)->NewByteArray(env, paramLength); jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL); - memcpy(header_data, privHeader, sizeof(BCRYPT_ECCKEY_BLOB)); + memcpy(header_data, privHeader, paramLength); (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0); - jbyteArray x_bytes = (*env)->NewByteArray(env, privHeader->cbKey); + jbyteArray x_bytes = (*env)->NewByteArray(env, privHeader->cbFieldLength); jbyte *x_data = (*env)->GetByteArrayElements(env, x_bytes, NULL); - memcpy(x_data, priv_x, privHeader->cbKey); + memcpy(x_data, priv_x, privHeader->cbFieldLength); (*env)->ReleaseByteArrayElements(env, x_bytes, x_data, 0); - jbyteArray y_bytes = (*env)->NewByteArray(env, privHeader->cbKey); + jbyteArray y_bytes = (*env)->NewByteArray(env, privHeader->cbFieldLength); jbyte *y_data = (*env)->GetByteArrayElements(env, y_bytes, NULL); - memcpy(y_data, priv_y, privHeader->cbKey); + memcpy(y_data, priv_y, privHeader->cbFieldLength); (*env)->ReleaseByteArrayElements(env, y_bytes, y_data, 0); - jbyteArray priv_bytes = (*env)->NewByteArray(env, privHeader->cbKey); + jbyteArray priv_bytes = (*env)->NewByteArray(env, privHeader->cbSubgroupOrder); jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL); - memcpy(key_priv, priv, privHeader->cbKey); + memcpy(key_priv, priv, privHeader->cbSubgroupOrder); (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0); - free(privBuf); + free(fullBuf); jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "", "([B[B[B[BLjava/security/spec/ECParameterSpec;)V"); return (*env)->NewObject(env, privkey_class, ec_priv_init, header_bytes, x_bytes, y_bytes, priv_bytes, ec_priv_param_spec); @@ -529,45 +516,39 @@ static jobject key_to_pubkey(JNIEnv *env, BCRYPT_KEY_HANDLE key) { ULONG paramLength; jobject ec_pub_param_spec = create_ec_param_spec(env, fullBuf, ¶mLength); - free(fullBuf); - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPUBLIC_BLOB, NULL, 0, &bufSize, 0))) { - //err - wprintf(L"**** Error 0x%x returned by BCryptExportKey(length only)\n", status); - return NULL; - } - - PBYTE pubBuf = calloc(bufSize, 1); - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPUBLIC_BLOB, pubBuf, bufSize, &bufSize, 0))) { - //err - wprintf(L"**** Error 0x%x returned by BCryptExportKey(whole)\n", status); - return NULL; - } - - // pubBuf looks like: - // BCRYPT_ECCKEY_BLOB header - // Qx[cbKey] X-coordinate of the public point. - // Qy[cbKey] Y-coordinate of the public point. - BCRYPT_ECCKEY_BLOB *pubHeader = (BCRYPT_ECCKEY_BLOB*)pubBuf; - PBYTE pub_x = &pubBuf[sizeof(BCRYPT_ECCKEY_BLOB)]; - PBYTE pub_y = pub_x + pubHeader->cbKey; + // fullBuf looks like: + // BCRYPT_ECCFULLKEY_BLOB header + // P[cbFieldLength] Prime specifying the base field. + // A[cbFieldLength] Coefficient A of the equation y^2 = x^3 + A*x + B mod p + // B[cbFieldLength] Coefficient B of the equation y^2 = x^3 + A*x + B mod p + // Gx[cbFieldLength] X-coordinate of the base point. + // Gy[cbFieldLength] Y-coordinate of the base point. + // n[cbSubgroupOrder] Order of the group generated by G = (x,y) + // h[cbCofactor] Cofactor of G in E. + // S[cbSeed] Seed of the curve. + // Qx[cbFieldLength] X-coordinate of the public point. + // Qy[cbFieldLength] Y-coordinate of the public point. + BCRYPT_ECCFULLKEY_BLOB *pubHeader = (BCRYPT_ECCFULLKEY_BLOB*)fullBuf; + PBYTE pub_x = &fullBuf[paramLength]; + PBYTE pub_y = pub_x + pubHeader->cbFieldLength; - jbyteArray header_bytes = (*env)->NewByteArray(env, sizeof(BCRYPT_ECCKEY_BLOB)); + jbyteArray header_bytes = (*env)->NewByteArray(env, paramLength); jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL); - memcpy(header_data, pubHeader, sizeof(BCRYPT_ECCKEY_BLOB)); + memcpy(header_data, pubHeader, paramLength); (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0); - jbyteArray x_bytes = (*env)->NewByteArray(env, pubHeader->cbKey); + jbyteArray x_bytes = (*env)->NewByteArray(env, pubHeader->cbFieldLength); jbyte *x_data = (*env)->GetByteArrayElements(env, x_bytes, NULL); - memcpy(x_data, pub_x, pubHeader->cbKey); + memcpy(x_data, pub_x, pubHeader->cbFieldLength); (*env)->ReleaseByteArrayElements(env, x_bytes, x_data, 0); - jbyteArray y_bytes = (*env)->NewByteArray(env, pubHeader->cbKey); + jbyteArray y_bytes = (*env)->NewByteArray(env, pubHeader->cbFieldLength); jbyte *y_data = (*env)->GetByteArrayElements(env, y_bytes, NULL); - memcpy(y_data, pub_y, pubHeader->cbKey); + memcpy(y_data, pub_y, pubHeader->cbFieldLength); (*env)->ReleaseByteArrayElements(env, y_bytes, y_data, 0); - free(pubBuf); + free(fullBuf); jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "", "([B[B[BLjava/security/spec/ECParameterSpec;)V"); return (*env)->NewObject(env, pubkey_class, ec_pub_init, header_bytes, x_bytes, y_bytes, ec_pub_param_spec); @@ -718,14 +699,14 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey jint pub_length = (*env)->GetArrayLength(env, pubkey); jbyte *pub_data = (*env)->GetByteArrayElements(env, pubkey, NULL); - if (NT_FAILURE(status = BCryptImportKeyPair(kaHandle, NULL, BCRYPT_ECCPUBLIC_BLOB, &pkey, pub_data, pub_length, 0))) { + if (NT_FAILURE(status = BCryptImportKeyPair(kaHandle, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, &pkey, pub_data, pub_length, 0))) { wprintf(L"**** Error 0x%x returned by BCryptImportKeyPair(pub)\n", status); } (*env)->ReleaseByteArrayElements(env, pubkey, pub_data, JNI_ABORT); jint priv_length = (*env)->GetArrayLength(env, privkey); jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey, NULL); - if (NT_FAILURE(status = BCryptImportKeyPair(kaHandle, NULL, BCRYPT_ECCPRIVATE_BLOB, &skey, priv_data, priv_length, 0))) { + if (NT_FAILURE(status = BCryptImportKeyPair(kaHandle, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, &skey, priv_data, priv_length, 0))) { wprintf(L"**** Error 0x%x returned by BCryptImportKeyPair(priv)\n", status); } (*env)->ReleaseByteArrayElements(env, privkey, priv_data, JNI_ABORT); @@ -797,10 +778,11 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig BCRYPT_ALG_HANDLE sigHandle = NULL; - if (!init_algo(env, &sigHandle, BCRYPT_ECDSA_ALGORITHM, params)) { - //err - printf("init err!\n"); - } + if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&sigHandle, BCRYPT_ECDSA_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0))) { + //err + wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status); + return 0; + } BCRYPT_ALG_HANDLE hashHandle = NULL; @@ -827,14 +809,7 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig jint priv_length = (*env)->GetArrayLength(env, privkey); jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey, NULL); - - printf("priv_length %i\n", priv_length); - printf("using privkey: "); - for (size_t i = 0; i < priv_length; ++i) { - printf("%02x", (unsigned)priv_data[i] & 0xffU); - } - printf("\n"); - if (NT_FAILURE(status = BCryptImportKeyPair(sigHandle, NULL, BCRYPT_ECCPRIVATE_BLOB, &skey, priv_data, priv_length, 0))) { + if (NT_FAILURE(status = BCryptImportKeyPair(sigHandle, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, &skey, priv_data, priv_length, 0))) { wprintf(L"**** Error 0x%x returned by BCryptImportKeyPair\n", status); } (*env)->ReleaseByteArrayElements(env, privkey, priv_data, JNI_ABORT); @@ -866,9 +841,11 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna BCRYPT_ALG_HANDLE sigHandle = NULL; - if (!init_algo(env, &sigHandle, BCRYPT_ECDSA_ALGORITHM, params)) { - //err - } + if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&sigHandle, BCRYPT_ECDSA_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0))) { + //err + wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status); + return 0; + } BCRYPT_ALG_HANDLE hashHandle = NULL; @@ -895,14 +872,7 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna jint pub_length = (*env)->GetArrayLength(env, pubkey); jbyte *pub_data = (*env)->GetByteArrayElements(env, pubkey, NULL); - - printf("pub_length %i\n", pub_length); - printf("using pubkey: "); - for (size_t i = 0; i < pub_length; ++i) { - printf("%02x", (unsigned)pub_data[i] & 0xffU); - } - printf("\n"); - if (NT_FAILURE(status = BCryptImportKeyPair(sigHandle, NULL, BCRYPT_ECCPUBLIC_BLOB, &pkey, pub_data, pub_length, 0))) { + if (NT_FAILURE(status = BCryptImportKeyPair(sigHandle, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, &pkey, pub_data, pub_length, 0))) { wprintf(L"**** Error 0x%x returned by BCryptImportKeyPair\n", status); } (*env)->ReleaseByteArrayElements(env, pubkey, pub_data, JNI_ABORT); -- cgit v1.2.3-70-g09d2