Exemple #1
0
void
xs_stream_encrypt(xsMachine *the)
{
	crypt_stream_t *stream = xsGetHostData(xsThis);
	int ac = xsToInteger(xsArgc);
	size_t len;
	void *indata, *outdata;

	if (xsTypeOf(xsArg(0)) == xsStringType)
		len = c_strlen(xsToString(xsArg(0)));
	else
		len = xsGetArrayBufferLength(xsArg(0));
	if (ac > 2 && xsTypeOf(xsArg(2)) != xsUndefinedType) {
		size_t n = xsToInteger(xsArg(2));
		if (n < len)
			len = n;
	}
	if (ac > 1 && xsTest(xsArg(1))) {
		if (xsGetArrayBufferLength(xsArg(1)) < (xsIntegerValue)len)
			crypt_throw_error(the, "too small buffer");
		xsResult = xsArg(1);
	}
	else
		xsResult = xsArrayBuffer(NULL, len);
	if (xsTypeOf(xsArg(0)) == xsStringType)
		indata = xsToString(xsArg(0));
	else
		indata = xsToArrayBuffer(xsArg(0));
	outdata = xsToArrayBuffer(xsResult);
	(*stream->process)(stream->ctx, indata, outdata, len);
}
Exemple #2
0
void
xs_rng_get(xsMachine *the)
{
	size_t n = xsToInteger(xsArg(0));
	uint8_t *bp, *bufend;
	uint8_t i, j, t;

	if (!rng_inited) {
		/* use srand */
#define DEFAULT_SEED_SIZE	16
		uint8_t seed[DEFAULT_SEED_SIZE];
		for (i = 0; i < DEFAULT_SEED_SIZE; i++)
			seed[i] = ((uint64_t)c_rand() * 256) / C_RAND_MAX;
		rng_init(seed, DEFAULT_SEED_SIZE);
		rng_inited++;
	}
	xsResult = xsArrayBuffer(NULL, n);
	bp = xsToArrayBuffer(xsResult);
	for (i = j = 0, bufend = bp + n; bp < bufend;) {
		++i;
		j += rng_state[i];
		t = rng_state[i];
		rng_state[i] = rng_state[j];
		rng_state[j] = t;
		t = rng_state[i] + rng_state[j];
		*bp++ = rng_state[t];
	}
}
Exemple #3
0
static void
cipher_process(xsMachine *the, kcl_symmetric_direction_t direction)
{
	crypt_cipher_t *cipher = xsGetHostData(xsThis);
	size_t len;
	void *indata, *outdata;

	if (cipher->keysched != NULL) {
		if (cipher->direction != direction) {
			(*cipher->keysched)(cipher->ctx, direction);
			cipher->direction = direction;
		}
	}
	if (xsToInteger(xsArgc) > 1 && xsTest(xsArg(1))) {
		if (xsGetArrayBufferLength(xsArg(1)) < (xsIntegerValue)cipher->blockSize)
			crypt_throw_error(the, "cipher: too small buffer");
		xsResult = xsArg(1);
	}
	else
		xsResult = xsArrayBuffer(NULL, cipher->blockSize);
	if (xsTypeOf(xsArg(0)) == xsStringType) {
		indata = xsToString(xsArg(0));
		len = c_strlen(indata);
	}
	else {
		indata = xsToArrayBuffer(xsArg(0));
		len = xsGetArrayBufferLength(xsArg(0));
	}
	if (len < cipher->blockSize)
		crypt_throw_error(the, "cipher: wrong size");
	outdata = xsToArrayBuffer(xsResult);
	(*cipher->process)(cipher->ctx, indata, outdata);
}
Exemple #4
0
void
xs_stream_encrypt(xsMachine *the)
{
	crypt_stream_t *stream = xsGetHostData(xsThis);
	int ac = xsToInteger(xsArgc);
	size_t len;
	void *indata, *outdata;

	if (xsTypeOf(xsArg(0)) == xsStringType)
		len = strlen(xsToString(xsArg(0)));
	else
		len = xsGetArrayBufferLength(xsArg(0));
	if (ac > 2 && xsTypeOf(xsArg(2)) != xsUndefinedType) {
		size_t n = xsToInteger(xsArg(2));
		if (n < len)
			len = n;
	}
	xsResult = ac > 1 && xsTest(xsArg(1)) ? xsArg(1) : xsArrayBuffer(NULL, len);
	if (xsTypeOf(xsArg(0)) == xsStringType)
		indata = xsToString(xsArg(0));
	else
		indata = xsToArrayBuffer(xsArg(0));
	outdata = xsToArrayBuffer(xsResult);
	(*stream->process)(stream->ctx, indata, outdata, len);
}
Exemple #5
0
void
xs_system_get_rng(xsMachine *the)
{
	int sz = xsToInteger(xsArg(0));

	xsResult = xsArrayBuffer(NULL, sz);
	mc_rng_gen((uint8_t *)xsToArrayBuffer(xsResult), sz);
}
Exemple #6
0
void
xs_rng_get(xsMachine *the)
{
	size_t n = xsToInteger(xsArg(0));

	xsResult = xsArrayBuffer(NULL, n);
	crypt_rng(xsToArrayBuffer(xsResult), n);
}
Exemple #7
0
void
xs_digest_close(xsMachine *the)
{
	crypt_digest_t *digest = xsGetHostData(xsThis);

	xsResult = xsArrayBuffer(NULL, digest->outputSize);
	(*digest->result)(digest->ctx, xsToArrayBuffer(xsResult));
}
Exemple #8
0
void xs_i2c_readBlock(xsMachine *the)
{
	FskErr err;
	xsI2C i2c = xsGetHostData(xsThis);
	int argc = xsToInteger(xsArgc), i;
	int format = 2;
    SInt32 dataSize = xsToInteger(xsArg(0)), readCount;
	UInt8 data[32];

	xsThrowIfNULL(i2c);

    DBG_I2C("xs_i2c_readBlock\n");

	if ((dataSize > 32) || (dataSize <= 0))
		xsThrowDiagnosticIfFskErr(kFskErrInvalidParameter, "I2C readBlock invalid size %d. %s", (int)dataSize, i2c->diagnosticID);

	FskPinI2CSetAddress(i2c->pin, i2c->address);
	err = FskPinI2CReadBytes(i2c->pin, dataSize, &readCount, data);
    if (err) {
        xsTraceDiagnostic("I2C readBlock failed with error %s %s.", FskInstrumentationGetErrorString(err), i2c->diagnosticID);
        goto bail;
    }

    if (argc > 1) {
        int t = xsTypeOf(xsArg(1));
        if ((xsNumberType == t) || (t == xsIntegerType))
            format = xsToInteger(xsArg(1));
        else {
            char *formatString = xsToString(xsArg(1));
            if (0 == FskStrCompare(formatString, "Buffer"))
                format = 2;
            else if (0 == FskStrCompare(formatString, "Chunk"))
                format = 0;
            else if (0 == FskStrCompare(formatString, "Array"))
                format = 1;
        }
    }
    
    if (2 == format) {
        xsResult = xsArrayBuffer(data, readCount);
    }
    else if (0 == format) {
        xsResult = xsNew1(xsGlobal, xsID("Chunk"), xsInteger(readCount));
        FskMemMove(xsGetHostData(xsResult), data, readCount);
    }
    else if (1 == format) {
        xsResult = xsNew1(xsGlobal, xsID("Array"), xsInteger(readCount));
        for (i = 0; i < readCount; i++)
            xsSet(xsResult, i, xsInteger(data[i]));
    }
    
bail:
    if (err)
		xsError(err);
}
Exemple #9
0
void
xs_archive_getCode(xsMachine *the)
{
	void *archive = xsGetHostData(xsThis);
	char *path = xsToString(xsArg(0));
	void *addr;
	xsIntegerValue size;

	if (xsGetCode(the, archive, path, &addr, &size))
		xsResult = xsArrayBuffer(addr, size);
}
Exemple #10
0
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);
}
Exemple #11
0
void
xs_i2c_read(xsMachine *the)
{
	wm_i2c *i2c = xsGetHostData(xsThis);
	int nbytes = xsToInteger(xsArg(1));
	int reg;

	switch (xsTypeOf(xsArg(0))) {
	case xsNumberType:
	case xsIntegerType:
		reg = xsToInteger(xsArg(0));
		break;
	default:
		reg = -1;
		break;
	}
	xsResult = xsArrayBuffer(NULL, nbytes);
	if (mc_i2c_read(i2c, reg, xsToArrayBuffer(xsResult), nbytes) != 0)
		xsSetUndefined(xsResult);
}
Exemple #12
0
void xs_i2c_readBlockDataSMB(xsMachine* the)
{
    xsI2C i2c = xsGetHostData(xsThis);
	FskErr err;
	char* formatString;
	int format = 2, i;
	SInt32 dataSize = 0;
    UInt8 command = (UInt8)xsToInteger(xsArg(0));
    UInt8 data[34]; //needs to be 34 because we're using I2C_SMBUS_I2C_BLOCK_BROKEN in i2cdev.c		//@@ WTF - not at this layer, at least
    SInt32 length = (SInt32)xsToInteger(xsArg(1));

    DBG_I2C("xs_i2c_readBlockDataSMB\n");

	xsThrowIfNULL(i2c);

    if ((length < 0) || (length > 32))
        xsThrowDiagnosticIfFskErr(kFskErrInvalidParameter, "I2C readBlockDataSMB bad length %d %s.", length, i2c->diagnosticID);

	FskPinI2CSetAddress(i2c->pin, i2c->address);

    formatString = xsToString(xsArg(2));
    if (!FskStrCompare(formatString, "Buffer")) format = 2;
    else if (!FskStrCompare(formatString, "Chunk")) format = 0;
    else if (!FskStrCompare(formatString, "Array")) format = 1;

	err = FskPinI2CReadDataBytes(i2c->pin, command, length, &dataSize, data);
	xsThrowDiagnosticIfFskErr(err, "I2C readBlockDataSMB register %d failed %s.", (int)command, i2c->diagnosticID);

    if (2 == format) {
		xsResult = xsArrayBuffer(data, dataSize);
	}
    else if (0 == format) {
        xsResult = xsNew1(xsGlobal, xsID("Chunk"), xsInteger(dataSize));
        FskMemMove(xsGetHostData(xsResult), data, dataSize);
    }
    else if (1 == format) {
        xsResult = xsNew1(xsGlobal, xsID("Array"), xsInteger(dataSize));
        for (i = 0; i < dataSize; i++)
            xsSet(xsResult, i, xsInteger(data[i]));
    }
}
Exemple #13
0
void
xs_srp_load_default_modulus(xsMachine *the)
{
	xsResult = xsArrayBuffer((void *)modp_3072, sizeof(modp_3072));
}