void xs_curve25519_dh(xsMachine *the) { void *secret, *basepoint; xsResult = xsArrayBuffer(NULL, C25519_EXPONENT_SIZE); secret = xsToArrayBuffer(xsArg(0)); if (xsToInteger(xsArgc) > 1) { if (xsGetArrayBufferLength(xsArg(1)) != 32) xsRangeError("bad arg"); basepoint = xsToArrayBuffer(xsArg(1)); } else basepoint = (void *)c25519_base_x; c25519_prepare(secret); c25519_smult(xsToArrayBuffer(xsResult), basepoint, secret); }
void xs_curve25519_dh(xsMachine *the) { void *secret, *basepoint; xsIntegerValue sz; xsResult = xsNew1(xsGlobal, xsID("Chunk"), xsInteger(32)); getChunkData(the, &xsArg(0), &secret, &sz); if (sz != 32) cryptThrowFSK(kFskErrInvalidParameter); if (xsToInteger(xsArgc) > 1) { getChunkData(the, &xsArg(1), &basepoint, &sz); if (sz != 32) cryptThrowFSK(kFskErrInvalidParameter); } else basepoint = (void *)c25519_base_x; c25519_prepare(secret); c25519_smult(xsGetHostData(xsResult), basepoint, secret); }