Codebase list tlsh / 38008f31-f19b-45c2-8d46-1c214a6594d0/main test / simple_unittest.cpp
38008f31-f19b-45c2-8d46-1c214a6594d0/main

Tree @38008f31-f19b-45c2-8d46-1c214a6594d0/main (Download .tar.gz)

simple_unittest.cpp @38008f31-f19b-45c2-8d46-1c214a6594d0/mainraw · history · blame

/*
 * Copyright 2013 Trend Micro Incorporated
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

//////////////////////////////////////////////////////////////////////////
//
// (C) Trend Micro
// written Jon Oliver 2009 and 2010

//////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#include "tlsh.h"

int main(int argc, char *argv[])
{
	Tlsh t1;
	Tlsh t2;

	const char *str1 = "This is a test for Lili Diao. This is a string. Hello Hello Hello ";
	const char *str2 = "This is a test for Jon Oliver. This is a string. Hello Hello Hello ";
	int len1 = strlen(str1);
	int len2 = strlen(str2);

	char minSizeBuffer1[512];
	for (int i = 0; i < 511; i++) {
		minSizeBuffer1[i] = i % 26 + 'A';
	}
	minSizeBuffer1[511] = 0;
	strncpy(minSizeBuffer1, str1, len1);
	t1.final( (const unsigned char*) minSizeBuffer1, 512);

	char minSizeBuffer2[1024];
	for (int i = 0; i < 1023; i++) {
		minSizeBuffer2[i] = i % 26 + 'A';
	}
	minSizeBuffer2[1023] = 0;
	strncpy(minSizeBuffer2, str2, len2);
	t2.final( (const unsigned char*) minSizeBuffer2, 1024);

	printf("str1 = '%s'\n", minSizeBuffer1 );
	printf("str2 = '%s'\n", minSizeBuffer2 );

	printf("hash1 = %s\n", t1.getHash() );
	printf("hash2 = %s\n", t2.getHash() );

	printf("difference (same strings) = %d\n", t1.totalDiff(&t1) );
	printf("difference (with len) = %d\n", t1.totalDiff(&t2) );
	printf("difference (without len) = %d\n", t1.totalDiff(&t2, false) );

	printf("Testing Tlsh with multiple update calls\n");
    Tlsh t3, t4;
    snprintf(minSizeBuffer1, sizeof(minSizeBuffer1), "%s", str1);
	t3.update( (const unsigned char*) minSizeBuffer1, len1);
	for (int i = 0; i < 511; i++) {
		minSizeBuffer1[i] = i % 26 + 'A';
	}
	minSizeBuffer1[511] = 0;
	t3.update( (const unsigned char*) minSizeBuffer1+len1, 512-len1);
	t3.final();
	assert(strcmp(t1.getHash(), t3.getHash()) == 0);

    snprintf(minSizeBuffer2, sizeof(minSizeBuffer2), "%s", str2);
	t4.update( (const unsigned char*) minSizeBuffer2, len2);
	for (int i = 0; i < 1023; i++) {
		minSizeBuffer2[i] = i % 26 + 'A';
	}
	minSizeBuffer2[1023] = 0;
	t4.final( (const unsigned char*) minSizeBuffer2+len2, 1024-len2);
	assert(strcmp(t2.getHash(), t4.getHash()) == 0);

	printf("hash3 = %s\n", t3.getHash() );
	printf("hash4 = %s\n", t4.getHash() );

	printf("Testing Tlsh.fromTlshStr()\n");
	printf("Recreating tlsh3 from %s\n", t1.getHash(minSizeBuffer1, sizeof(minSizeBuffer1)));
	t3.reset();
	t3.fromTlshStr(minSizeBuffer1);
	printf("hash3 = %s\n", t3.getHash(minSizeBuffer2, sizeof(minSizeBuffer2)));
	assert(strcmp(minSizeBuffer1, minSizeBuffer2) == 0);
	
	printf("Recreating tlsh4 from %s\n", t2.getHash(minSizeBuffer1, sizeof(minSizeBuffer1)));
	t4.reset();
	t4.fromTlshStr(minSizeBuffer1);
	printf("hash4 = %s\n", t4.getHash(minSizeBuffer2, sizeof(minSizeBuffer2)));
	assert(strcmp(minSizeBuffer1, minSizeBuffer2) == 0);
	printf("difference (same strings) = %d\n", t3.totalDiff(&t3) );
	printf("difference (with len) = %d\n", t3.totalDiff(&t4) );
	printf("difference (without len) = %d\n", t3.totalDiff(&t4, false) );
}