diff options
| author | J08nY | 2018-07-27 22:37:53 +0200 |
|---|---|---|
| committer | J08nY | 2018-07-27 22:37:53 +0200 |
| commit | 9bc30bf9727cda5a6a78668843b01c689e25bc18 (patch) | |
| tree | 48410923b022efcb7f00d6ebaf2cc296530d5947 /src | |
| parent | 0d961f0c0bdc5a0ace91bc7b2289055b26d4fbe7 (diff) | |
| download | ECTester-9bc30bf9727cda5a6a78668843b01c689e25bc18.tar.gz ECTester-9bc30bf9727cda5a6a78668843b01c689e25bc18.tar.zst ECTester-9bc30bf9727cda5a6a78668843b01c689e25bc18.zip | |
Diffstat (limited to 'src')
| -rw-r--r-- | src/cz/crcs/ectester/standalone/libs/jni/mscng.c | 154 |
1 files changed, 62 insertions, 92 deletions
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;
+ // 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, sizeof(BCRYPT_ECCKEY_BLOB));
+ 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, "<init>", "([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, "<init>", "([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);
|
