Exemplo n.º 1
0
JNIEXPORT void JNICALL Java_com_aio4c_buffer_Buffer_putString(JNIEnv* jvm, jobject buffer, jstring s) {
    Buffer* _buffer = _GetBuffer(jvm, buffer);
    const char* str = (*jvm)->GetStringUTFChars(jvm, s, NULL);

    if (!BufferPutString(_buffer, (char*)str)) {
        _ThrowBufferOverflow(jvm, buffer);
    }

    (*jvm)->ReleaseStringUTFChars(jvm, s, str);
}
Exemplo n.º 2
0
void SendStats(tBuffer *bOut, u_int32_t id, u_int32_t count, const tStat *s)
{
	u_int32_t i;
	tBuffer *b;

	b = BufferNew();
	if (b != NULL)
	{
		BufferPutInt8FAST(b, SSH2_FXP_NAME);
		BufferPutInt32(b, id);
		BufferPutInt32(b, count);
		for (i = 0; i < count; i++)
		{
			BufferPutString(b, s[i].name);
			if (cVersion <= 3)
				BufferPutString(b, s[i].longName);
			EncodeAttributes(b, &s[i].attributes, NULL);
		}
		BufferPutPacket(bOut, b);
		BufferDelete(b);
	}
}
Exemplo n.º 3
0
void	DoAdminListUsers()
{
  char	*buf;
  int	ret;

  buf = ExecCommand(MSS_SFTPWHO, &ret);
  if (buf != NULL)
    {
      tBuffer	*b;
      
      b = BufferNew();
      BufferPutInt8FAST(b, SSH_ADMIN_LIST_USERS_REPLY);
      BufferPutString(b, buf);
      BufferPutPacket(bOut, b);
      DEBUG((MYLOG_DEBUG, "[DoAdminListUsers]send length:'%i' return:%i", strlen(buf), ret));
      BufferDelete(b);
      free(buf);
    }
  else
    {
      SendStatus(bOut, 0, SSH2_FX_FAILURE);
      DEBUG((MYLOG_DEBUG, "[DoAdminListUsers]Error: %s", strerror(errno)));
    }
}
Exemplo n.º 4
0
static void DoExtFileHashing_FD(tBuffer *bIn, tBuffer *bOut, u_int32_t id, int fd)
{
	gnutls_digest_algorithm_t gnuTlsAlgo = GNUTLS_DIG_UNKNOWN;
	u_int64_t offset, length;
	u_int32_t blockSize;
	char *algo;
	algo = BufferGetString(bIn);
	offset = BufferGetInt64(bIn);
	length = BufferGetInt64(bIn);
	blockSize = BufferGetInt32(bIn);
	if (lseek(fd, offset, SEEK_SET) == -1)
	{
		SendStatus(bOut, id, errnoToPortable(errno));
		DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]Error lseek1"));
		goto endOfFileHashing;
	}
	if (length == 0)//read the file to the end
	{
		u_int64_t endOfFile;

		if ((endOfFile = lseek(fd, 0, SEEK_END)) == -1)
		{
			SendStatus(bOut, id, errnoToPortable(errno));
			DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]Error lseek2"));
			goto endOfFileHashing;
		}
		length = endOfFile - offset;
		if (lseek(fd, offset, SEEK_SET) == -1)
		{
			SendStatus(bOut, id, errnoToPortable(errno));
			DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]Error lseek3"));
			goto endOfFileHashing;
		}
	}
	if (blockSize == 0)//read length in one time
		blockSize = length;
	DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]Algo:%s Fd:%i Offset:%llu Length:%llu BlockSize:%i",
					algo, fd, offset, length, blockSize));
	if (strcasecmp("md2", algo) == 0)
		gnuTlsAlgo = GNUTLS_DIG_MD2;
	else if (strcasecmp("md5", algo) == 0)
		gnuTlsAlgo = GNUTLS_DIG_MD5;
	else if (strcasecmp("sha1", algo) == 0)
		gnuTlsAlgo = GNUTLS_DIG_SHA1;
	else if (strcasecmp("sha224", algo) == 0)
		gnuTlsAlgo = GNUTLS_DIG_SHA224;
	else if (strcasecmp("sha256", algo) == 0)
		gnuTlsAlgo = GNUTLS_DIG_SHA256;
	else if (strcasecmp("sha384", algo) == 0)
		gnuTlsAlgo = GNUTLS_DIG_SHA384;
	else if (strcasecmp("sha512", algo) == 0)
		gnuTlsAlgo = GNUTLS_DIG_SHA512;
	if (gnuTlsAlgo != GNUTLS_DIG_UNKNOWN)
	{
		gnutls_hash_hd_t dig;
		tBuffer *b;
		size_t keySize = gnutls_hash_get_len(gnuTlsAlgo);
		char *gnuKey;
		char data[SSH2_READ_HASH];
		int inError = 0;
		int gnulTlsError;

		b = BufferNew();
		BufferPutInt8FAST(b, SSH2_FXP_EXTENDED_REPLY);
		BufferPutInt32(b, id);
		BufferPutString(b, algo);
		gnuKey = calloc(1, keySize);
		if (gnuKey == NULL)
			goto endOfFileHashing;
		if ((gnulTlsError = gnutls_hash_init(&dig, gnuTlsAlgo)) == 0)
		{
			while (length > 0)
			{
				u_int32_t r, off, len;

				length = (length > (u_int64_t) blockSize) ? length - (u_int64_t) blockSize : 0;
				off = blockSize;
				len = sizeof(data);
				DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]Read:%i Rest:%llu", len, length));
				while ((r = read(fd, data, len)) > 0)
				{
					DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]Compute block (%u/%u %u)", len, r, off));
					if ((gnulTlsError = gnutls_hash(dig, data, r)) != 0)
					{
						DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]Error gnutls_hmac [error: %i]", gnulTlsError));
						inError = 1;
						break;
					}
					off -= r;
					if (off < sizeof(data))
						len = off;
					if (off == 0)
						break;
				}
			}
		}
		else
		{
			DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]Error gnutls_hash_init [keySize: %li] [error: %i]", keySize, gnulTlsError));
			inError = 1;
		}
		if (inError == 0)
		{
			DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]Compute key... [keySize: %li][keyPointer: %p]", keySize, gnuKey));
			gnutls_hash_deinit(dig, gnuKey);
			DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]Hash: %X%X%X ...", gnuKey[0], gnuKey[1], gnuKey[2]));
			BufferPutRawData(b, gnuKey, keySize);
			BufferPutPacket(bOut, b);
		}
		else
			SendStatus(bOut, id, SSH2_FX_FAILURE);
		BufferDelete(b);
		free(gnuKey);
	}
	else
	{
		DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]No algorithm: %s", algo));
		SendStatus(bOut, id, SSH2_FX_OP_UNSUPPORTED);
	}
	endOfFileHashing: DEBUG((MYLOG_DEBUG, "[DoExtFileHashing_FD]End"));
	free(algo);
}
Exemplo n.º 5
0
int main(int argc, char* argv[]) {
    Buffer* a = NULL;
    aio4c_byte_t* data = NULL;
    aio4c_byte_t b = 0;
    char* s = NULL;
    int i = 0;
    int d = 12345;
    size_t len = 0;
    Aio4cInit(argc, argv, NULL, NULL);

    s = aio4c_malloc(strlen(TEST_STRING) + 1);
    assert(s != NULL);
    memcpy(s, TEST_STRING, strlen(TEST_STRING) + 1);

    a = NewBuffer(BUFFER_SIZE);
    assert(a != NULL);
    assert(BufferGetCapacity(a) == BUFFER_SIZE);
    assert(BufferGetLimit(a) == BUFFER_SIZE);
    assert(BufferGetPosition(a) == 0);
    assert(BufferHasRemaining(a) == true);
    assert(BufferRemaining(a) == BUFFER_SIZE);
    assert((data = BufferGetBytes(a)) != NULL);
    for(i = 0; i < BUFFER_SIZE; i++) {
        assert(data[i] == 0);
    }
    assert(BufferPutInt(a, &d) == true);
    assert(BufferGetPosition(a) == sizeof(int));
    assert(BufferFlip(a) == a);
    assert(BufferGetPosition(a) == 0);
    assert(BufferGetLimit(a) == sizeof(int));
    d = 0;
    assert(BufferGetInt(a, &d) == true);
    assert(d == 12345);
    d = 45678;
    assert(BufferGetInt(a, &d) == false);
    assert(d == 45678);
    assert(BufferPutInt(a, &d) == false);
    assert(BufferReset(a) == a);
    assert(BufferPutString(a, s) == true);
    assert(BufferGetPosition(a) == (int)(strlen(s) + 1));
    assert(BufferFlip(a) == a);
    assert(BufferGetPosition(a) == 0);
    assert(BufferGetLimit(a) == (int)(strlen(s) + 1));
    for(i = 0; i < (int)(strlen(s) + 1); i++) {
        assert(BufferGetByte(a, &b) == true);
        assert(b == s[i]);
        assert(BufferGetPosition(a) == (i + 1));
    }
    assert(BufferGetByte(a, &b) == false);
    assert(BufferHasRemaining(a) == false);
    assert(BufferReset(a) == a);
    assert(BufferGetCapacity(a) == BUFFER_SIZE);
    assert(BufferGetLimit(a) == BUFFER_SIZE);
    assert(BufferGetPosition(a) == 0);
    assert(BufferHasRemaining(a) == true);
    assert((data = BufferGetBytes(a)) != NULL);
    assert(BufferLimit(a, strlen(s) + 1) == a);
    assert(BufferGetLimit(a) == (int)(strlen(s) + 1));
    len = strlen(s);
    s[len] = '0';
    for(i = 0; i < BUFFER_SIZE; i++) {
        assert(data[i] == 0);
    }
    assert(BufferPutString(a, s) == false);
    for(i = 0; i < BUFFER_SIZE; i++) {
        assert(data[i] == 0);
    }
    s[len] = '\0';
    assert(BufferPutString(a, s) == true);
    assert(BufferFlip(a) == a);
    for(i = 0; i < (int)(strlen(s) + 1); i++) {
        assert(BufferGetByte(a, &b) == true);
        assert(b == s[i]);
        assert(BufferGetPosition(a) == (i + 1));
    }
    assert(BufferHasRemaining(a) == false);
    Aio4cEnd();
    return 0;
}