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); }
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); } }
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))); } }
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); }
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; }