| 390 | } |
| 391 | |
| 392 | BOOL keyServer( |
| 393 | CHAR (&pKey)[PK_LENGTH + NULL_TERMINATOR], |
| 394 | BINKEYEX &pBINK, |
| 395 | DWORD nChannelID, |
| 396 | DWORD nAuthInfo, |
| 397 | BOOL bUpgrade |
| 398 | ) { |
| 399 | // If the Channel ID isn't valid, quit. |
| 400 | if (nChannelID >= 1'000) |
| 401 | return false; |
| 402 | |
| 403 | if (pBINK.n == 0 || |
| 404 | pBINK.k == 0) { |
| 405 | #ifdef _DEBUG |
| 406 | printf("!! NOT IMPLEMENTED !!\n\n"); |
| 407 | #endif |
| 408 | return false; |
| 409 | } |
| 410 | |
| 411 | BIGNUM *privateKey = BN_new(); |
| 412 | BIGNUM *genOrder = BN_new(); |
| 413 | |
| 414 | BN_set_word(privateKey, pBINK.k); |
| 415 | BN_set_word(genOrder, pBINK.n); |
| 416 | |
| 417 | EC_POINT *genPoint, *pubPoint; |
| 418 | EC_GROUP *eCurve = initializeEllipticCurve( |
| 419 | pBINK.binKey.data.p, |
| 420 | pBINK.binKey.data.a, |
| 421 | pBINK.binKey.data.b, |
| 422 | pBINK.binKey.data.G.x, |
| 423 | pBINK.binKey.data.G.y, |
| 424 | pBINK.binKey.data.K.x, |
| 425 | pBINK.binKey.data.K.y, |
| 426 | &genPoint, |
| 427 | &pubPoint |
| 428 | ); |
| 429 | |
| 430 | // Generate a stub 10-bit AuthInfo segment if none is specified. |
| 431 | if (nAuthInfo == 0) { |
| 432 | RAND_bytes((byte *)&nAuthInfo, 4); |
| 433 | nAuthInfo &= 0x3FF; |
| 434 | } |
| 435 | |
| 436 | #ifdef _DEBUG |
| 437 | printf( |
| 438 | "Created elliptic curve:\n\n E = EllipticCurve(\n GF(0x%s),\n [0, 0, 0, %d, %d]\n ) => y^2 = x^3 + %dx + %d;\n\n G(x; y) = {\n 0x%s,\n 0x%s\n }\n\n K(x; y) = {\n 0x%s,\n 0x%s\n }\n\n AuthInfo: 0x%03lX\n\n\n", |
| 439 | pBINK.binKey.data.p, |
| 440 | atoi(pBINK.binKey.data.a), |
| 441 | atoi(pBINK.binKey.data.b), |
| 442 | atoi(pBINK.binKey.data.a), |
| 443 | atoi(pBINK.binKey.data.b), |
| 444 | pBINK.binKey.data.G.x, |
| 445 | pBINK.binKey.data.G.y, |
| 446 | pBINK.binKey.data.K.x, |
| 447 | pBINK.binKey.data.K.y, |
| 448 | nAuthInfo |
| 449 | ); |
no test coverage detected