Update Files

This commit is contained in:
2025-01-22 16:18:30 +01:00
parent ed4603cf95
commit a36294b518
16718 changed files with 2960346 additions and 0 deletions

View File

@ -0,0 +1,175 @@
set(MINIMP3_INCLUDE_DIR ${INCLUDES_BASE_DIR}/minimp3)
set(MIKKTSPACE_INCLUDE_DIR ${INCLUDES_BASE_DIR}/mikktspace)
if(WIN32)
set(ZLIB_INCLUDE_DIRS ${INCLUDES_BASE_DIR}/zlib)
set(PNG_INCLUDE_DIRS ${INCLUDES_BASE_DIR}/png)
set(VORBIS_INCLUDE_DIR ${INCLUDES_BASE_DIR}/vorbis)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(TurboJPEG_INCLUDE_DIRS ${INCLUDES_BASE_DIR}/turbojpeg ${INCLUDES_BASE_DIR}/turbojpeg/x64)
find_library(TurboJPEG_LIBRARIES simd PATHS ${INCLUDES_BASE_DIR}/turbojpeg/x64)
else()
set(TurboJPEG_INCLUDE_DIRS ${INCLUDES_BASE_DIR}/turbojpeg ${INCLUDES_BASE_DIR}/turbojpeg/x86)
find_library(TurboJPEG_LIBRARIES simd PATHS ${INCLUDES_BASE_DIR}/turbojpeg/x86)
endif()
add_library(fmt.hdll SHARED
${INCLUDES_BASE_DIR}/png/png.c
${INCLUDES_BASE_DIR}/png/pngerror.c
${INCLUDES_BASE_DIR}/png/pngget.c
${INCLUDES_BASE_DIR}/png/pngmem.c
${INCLUDES_BASE_DIR}/png/pngpread.c
${INCLUDES_BASE_DIR}/png/pngread.c
${INCLUDES_BASE_DIR}/png/pngrio.c
${INCLUDES_BASE_DIR}/png/pngrtran.c
${INCLUDES_BASE_DIR}/png/pngrutil.c
${INCLUDES_BASE_DIR}/png/pngset.c
${INCLUDES_BASE_DIR}/png/pngtrans.c
${INCLUDES_BASE_DIR}/png/pngwio.c
${INCLUDES_BASE_DIR}/png/pngwrite.c
${INCLUDES_BASE_DIR}/png/pngwtran.c
${INCLUDES_BASE_DIR}/png/pngwutil.c
${INCLUDES_BASE_DIR}/turbojpeg/jaricom.c
${INCLUDES_BASE_DIR}/turbojpeg/jcapimin.c
${INCLUDES_BASE_DIR}/turbojpeg/jcapistd.c
${INCLUDES_BASE_DIR}/turbojpeg/jcarith.c
${INCLUDES_BASE_DIR}/turbojpeg/jccoefct.c
${INCLUDES_BASE_DIR}/turbojpeg/jccolor.c
${INCLUDES_BASE_DIR}/turbojpeg/jcdctmgr.c
${INCLUDES_BASE_DIR}/turbojpeg/jchuff.c
${INCLUDES_BASE_DIR}/turbojpeg/jcinit.c
${INCLUDES_BASE_DIR}/turbojpeg/jcmainct.c
${INCLUDES_BASE_DIR}/turbojpeg/jcmarker.c
${INCLUDES_BASE_DIR}/turbojpeg/jcmaster.c
${INCLUDES_BASE_DIR}/turbojpeg/jcomapi.c
${INCLUDES_BASE_DIR}/turbojpeg/jcparam.c
${INCLUDES_BASE_DIR}/turbojpeg/jcphuff.c
${INCLUDES_BASE_DIR}/turbojpeg/jcprepct.c
${INCLUDES_BASE_DIR}/turbojpeg/jcsample.c
${INCLUDES_BASE_DIR}/turbojpeg/jctrans.c
${INCLUDES_BASE_DIR}/turbojpeg/jdapimin.c
${INCLUDES_BASE_DIR}/turbojpeg/jdapistd.c
${INCLUDES_BASE_DIR}/turbojpeg/jdarith.c
${INCLUDES_BASE_DIR}/turbojpeg/jdatadst-tj.c
${INCLUDES_BASE_DIR}/turbojpeg/jdatadst.c
${INCLUDES_BASE_DIR}/turbojpeg/jdatasrc-tj.c
${INCLUDES_BASE_DIR}/turbojpeg/jdatasrc.c
${INCLUDES_BASE_DIR}/turbojpeg/jdcoefct.c
${INCLUDES_BASE_DIR}/turbojpeg/jdcolor.c
${INCLUDES_BASE_DIR}/turbojpeg/jddctmgr.c
${INCLUDES_BASE_DIR}/turbojpeg/jdhuff.c
${INCLUDES_BASE_DIR}/turbojpeg/jdinput.c
${INCLUDES_BASE_DIR}/turbojpeg/jdmainct.c
${INCLUDES_BASE_DIR}/turbojpeg/jdmarker.c
${INCLUDES_BASE_DIR}/turbojpeg/jdmaster.c
${INCLUDES_BASE_DIR}/turbojpeg/jdmerge.c
${INCLUDES_BASE_DIR}/turbojpeg/jdphuff.c
${INCLUDES_BASE_DIR}/turbojpeg/jdpostct.c
${INCLUDES_BASE_DIR}/turbojpeg/jdsample.c
${INCLUDES_BASE_DIR}/turbojpeg/jdtrans.c
${INCLUDES_BASE_DIR}/turbojpeg/jerror.c
${INCLUDES_BASE_DIR}/turbojpeg/jfdctflt.c
${INCLUDES_BASE_DIR}/turbojpeg/jfdctfst.c
${INCLUDES_BASE_DIR}/turbojpeg/jfdctint.c
${INCLUDES_BASE_DIR}/turbojpeg/jidctflt.c
${INCLUDES_BASE_DIR}/turbojpeg/jidctfst.c
${INCLUDES_BASE_DIR}/turbojpeg/jidctint.c
${INCLUDES_BASE_DIR}/turbojpeg/jidctred.c
${INCLUDES_BASE_DIR}/turbojpeg/jmemmgr.c
${INCLUDES_BASE_DIR}/turbojpeg/jmemnobs.c
${INCLUDES_BASE_DIR}/turbojpeg/jquant1.c
${INCLUDES_BASE_DIR}/turbojpeg/jquant2.c
${INCLUDES_BASE_DIR}/turbojpeg/jsimd.c
${INCLUDES_BASE_DIR}/turbojpeg/jutils.c
${INCLUDES_BASE_DIR}/turbojpeg/transupp.c
${INCLUDES_BASE_DIR}/turbojpeg/turbojpeg.c
${INCLUDES_BASE_DIR}/zlib/adler32.c
${INCLUDES_BASE_DIR}/zlib/crc32.c
${INCLUDES_BASE_DIR}/zlib/deflate.c
${INCLUDES_BASE_DIR}/zlib/inffast.c
${INCLUDES_BASE_DIR}/zlib/inflate.c
${INCLUDES_BASE_DIR}/zlib/inftrees.c
${INCLUDES_BASE_DIR}/zlib/trees.c
${INCLUDES_BASE_DIR}/zlib/zutil.c
${INCLUDES_BASE_DIR}/vorbis/bitrate.c
${INCLUDES_BASE_DIR}/vorbis/bitwise.c
${INCLUDES_BASE_DIR}/vorbis/block.c
${INCLUDES_BASE_DIR}/vorbis/codebook.c
${INCLUDES_BASE_DIR}/vorbis/envelope.c
${INCLUDES_BASE_DIR}/vorbis/floor0.c
${INCLUDES_BASE_DIR}/vorbis/floor1.c
${INCLUDES_BASE_DIR}/vorbis/framing.c
${INCLUDES_BASE_DIR}/vorbis/info.c
${INCLUDES_BASE_DIR}/vorbis/lookup.c
${INCLUDES_BASE_DIR}/vorbis/lpc.c
${INCLUDES_BASE_DIR}/vorbis/lsp.c
${INCLUDES_BASE_DIR}/vorbis/mapping0.c
${INCLUDES_BASE_DIR}/vorbis/mdct.c
${INCLUDES_BASE_DIR}/vorbis/psy.c
${INCLUDES_BASE_DIR}/vorbis/registry.c
${INCLUDES_BASE_DIR}/vorbis/res0.c
${INCLUDES_BASE_DIR}/vorbis/sharedbook.c
${INCLUDES_BASE_DIR}/vorbis/smallft.c
${INCLUDES_BASE_DIR}/vorbis/synthesis.c
${INCLUDES_BASE_DIR}/vorbis/vorbisfile.c
${INCLUDES_BASE_DIR}/vorbis/window.c
fmt.c
sha1.c
dxt.c
mikkt.c
${MIKKTSPACE_INCLUDE_DIR}/mikktspace.c
)
else()
find_package(ZLIB REQUIRED)
find_package(PNG REQUIRED)
find_package(TurboJPEG QUIET)
if(NOT TurboJPEG_FOUND)
pkg_check_modules(TurboJPEG REQUIRED libjpeg)
endif()
find_package(OggVorbis QUIET)
if(NOT OGGVORBIS_FOUND)
pkg_check_modules(OGGVORBIS REQUIRED vorbis vorbisenc vorbisfile)
endif()
add_library(fmt.hdll SHARED
fmt.c
sha1.c
dxt.c
mikkt.c
${MIKKTSPACE_INCLUDE_DIR}/mikktspace.c
)
endif()
set_as_hdll(fmt)
target_include_directories(fmt.hdll
PRIVATE
${ZLIB_INCLUDE_DIRS}
${PNG_INCLUDE_DIRS}
${TurboJPEG_INCLUDE_DIRS}
${VORBIS_INCLUDE_DIR}
${MINIMP3_INCLUDE_DIR}
${MIKKTSPACE_INCLUDE_DIR}
)
target_link_libraries(fmt.hdll
libhl
${ZLIB_LIBRARIES}
${PNG_LIBRARIES}
${TurboJPEG_LIBRARIES}
${OGGVORBIS_LIBRARIES}
)
target_compile_definitions(fmt.hdll
PRIVATE
${PNG_DEFINITIONS}
)
install(
TARGETS
fmt.hdll
DESTINATION ${HDLL_DESTINATION}
)

View File

@ -0,0 +1,169 @@
#define HL_NAME(n) fmt_##n
#include <hl.h>
static const int BIT5[] = { 0, 8, 16, 25, 33, 41, 49, 58, 66, 74, 82, 90, 99, 107, 115, 123, 132, 140, 148, 156, 165, 173, 181, 189, 197, 206, 214, 222, 230, 239, 247, 255 };
static const int BIT6[] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, 113, 117, 121, 125, 130, 134, 138, 142, 146, 150, 154, 158, 162, 166, 170, 174, 178, 182, 186, 190, 194, 198, 202, 206, 210, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 255 };
#define MK_COLOR(r,g,b,a) (((a)<<24) | ((b)<<16) | ((g)<<8) | (r))
#define DXT_COLOR1(c,a) MK_COLOR( \
BIT5[(c & 0xFC00) >> 11], \
BIT6[(c & 0x07E0) >> 5], \
BIT5[(c & 0x001F)], \
a)
#define DXT_COLOR2(c0,c1,a) MK_COLOR( \
(BIT5[(c0 & 0xFC00) >> 11] + BIT5[(c1 & 0xFC00) >> 11]) / 2, \
(BIT6[(c0 & 0x07E0) >> 5] + BIT6[(c1 & 0x07E0) >> 5]) / 2, \
(BIT5[c0 & 0x001F] + BIT5[c1 & 0x001F]) / 2, \
a)
#define DXT_COLOR3(c0,c1,a) MK_COLOR( \
(2 * BIT5[(c0 & 0xFC00) >> 11] + BIT5[(c1 & 0xFC00) >> 11]) / 3, \
(2 * BIT6[(c0 & 0x07E0) >> 5] + BIT6[(c1 & 0x07E0) >> 5]) / 3, \
(2 * BIT5[c0 & 0x001F] + BIT5[c1 & 0x001F]) / 3, \
a)
static int dxtAlpha(int a0, int a1, int t) {
if (a0 > a1) switch (t) {
case 0: return a0;
case 1: return a1;
case 2: return (6 * a0 + a1) / 7;
case 3: return (5 * a0 + 2 * a1) / 7;
case 4: return (4 * a0 + 3 * a1) / 7;
case 5: return (3 * a0 + 4 * a1) / 7;
case 6: return (2 * a0 + 5 * a1) / 7;
case 7: return (a0 + 6 * a1) / 7;
}
else switch (t) {
case 0: return a0;
case 1: return a1;
case 2: return (4 * a0 + a1) / 5;
case 3: return (3 * a0 + 2 * a1) / 5;
case 4: return (2 * a0 + 3 * a1) / 5;
case 5: return (a0 + 4 * a1) / 5;
case 6: return 0;
case 7: return 255;
}
return 0;
}
static int dxtColor(int c0, int c1, int a, int t) {
switch (t) {
case 0: return DXT_COLOR1(c0, a);
case 1: return DXT_COLOR1(c1, a);
case 2: return (c0 > c1) ? DXT_COLOR3(c0, c1, a) : DXT_COLOR2(c0, c1, a);
case 3: return (c0 > c1) ? DXT_COLOR3(c1, c0, a) : 0;
}
return 0;
}
HL_PRIM bool HL_NAME(dxt_decode)( vbyte *data, int *out, int width, int height, int format ) {
int x,y,k;
int index = 0;
int write = 0;
int alpha[16];
switch( format ) {
case 1:
for(y=0;y<height>>2;y++) {
for(x=0;x<width>>2;x++) {
int c0 = data[index] | (data[index + 1] << 8); index += 2;
int c1 = data[index] | (data[index + 1] << 8); index += 2;
for(k=0;k<4;k++) {
unsigned char c = data[index++];
int t0 = c & 0x03;
int t1 = (c & 0x0C) >> 2;
int t2 = (c & 0x30) >> 4;
int t3 = (c & 0xC0) >> 6;
int w = write + k * width;
out[w++] = dxtColor(c0, c1, 0xFF, t0);
out[w++] = dxtColor(c0, c1, 0xFF, t1);
out[w++] = dxtColor(c0, c1, 0xFF, t2);
out[w++] = dxtColor(c0, c1, 0xFF, t3);
}
write += 4;
}
write += 3 * width;
}
return true;
case 2:
for(y=0;y<height>>2;y++) {
for(x=0;x<width>>2;x++) {
int ap = 0;
for(k=0;k<4;k++) {
int a0 = data[index++];
int a1 = data[index++];
alpha[ap++] = 17 * ((a0 & 0xF0) >> 4);
alpha[ap++] = 17 * (a0 & 0x0F);
alpha[ap++] = 17 * ((a1 & 0xF0) >> 4);
alpha[ap++] = 17 * (a1 & 0x0F);
}
ap = 0;
int c0 = data[index] | (data[index + 1] << 8); index += 2;
int c1 = data[index] | (data[index + 1] << 8); index += 2;
for (int k = 0; k<4; k++) {
int c = data[index++];
int t0 = c & 0x03;
int t1 = (c & 0x0C) >> 2;
int t2 = (c & 0x30) >> 4;
int t3 = (c & 0xC0) >> 6;
int w = write + k * width;
out[w++] = dxtColor(c0, c1, alpha[ap++], t0);
out[w++] = dxtColor(c0, c1, alpha[ap++], t1);
out[w++] = dxtColor(c0, c1, alpha[ap++], t2);
out[w++] = dxtColor(c0, c1, alpha[ap++], t3);
}
write += 4;
}
write += 3 * width;
}
return true;
case 3:
for(y=0;y<height>>2;y++) {
for(x=0;x<width>>2;x++) {
int a0 = data[index++];
int a1 = data[index++];
int b0 = data[index] | (data[index + 1] << 8) | (data[index + 2] << 16); index += 3;
int b1 = data[index] | (data[index + 1] << 8) | (data[index + 2] << 16); index += 3;
alpha[0] = b0 & 0x07;
alpha[1] = (b0 >> 3) & 0x07;
alpha[2] = (b0 >> 6) & 0x07;
alpha[3] = (b0 >> 9) & 0x07;
alpha[4] = (b0 >> 12) & 0x07;
alpha[5] = (b0 >> 15) & 0x07;
alpha[6] = (b0 >> 18) & 0x07;
alpha[7] = (b0 >> 21) & 0x07;
alpha[8] = b1 & 0x07;
alpha[9] = (b1 >> 3) & 0x07;
alpha[10] = (b1 >> 6) & 0x07;
alpha[11] = (b1 >> 9) & 0x07;
alpha[12] = (b1 >> 12) & 0x07;
alpha[13] = (b1 >> 15) & 0x07;
alpha[14] = (b1 >> 18) & 0x07;
alpha[15] = (b1 >> 21) & 0x07;
int c0 = data[index] | (data[index + 1] << 8); index += 2;
int c1 = data[index] | (data[index + 1] << 8); index += 2;
int ap = 0;
for (int k = 0; k<4; k++) {
int c = data[index++];
int t0 = c & 0x03;
int t1 = (c & 0x0C) >> 2;
int t2 = (c & 0x30) >> 4;
int t3 = (c & 0xC0) >> 6;
int w = write + k * width;
out[w++] = dxtColor(c0, c1, dxtAlpha(a0, a1, alpha[ap++]), t0);
out[w++] = dxtColor(c0, c1, dxtAlpha(a0, a1, alpha[ap++]), t1);
out[w++] = dxtColor(c0, c1, dxtAlpha(a0, a1, alpha[ap++]), t2);
out[w++] = dxtColor(c0, c1, dxtAlpha(a0, a1, alpha[ap++]), t3);
}
write += 4;
}
write += 3 * width;
}
return true;
default:
return false;
}
}
DEFINE_PRIM(_BOOL, dxt_decode, _BYTES _BYTES _I32 _I32 _I32);

View File

@ -0,0 +1,788 @@
#define HL_NAME(n) fmt_##n
//#include <png.h>
#include <hl.h>
#if defined(HL_CONSOLE) && !defined(HL_XBO)
//extern bool sys_jpg_decode( vbyte *data, int dataLen, vbyte *out, int width, int height, int stride, int format, int flags );
#else
//# include <turbojpeg.h>
#endif
#include <zlib.h>
//#include <vorbis/vorbisfile.h>
//#define MINIMP3_IMPLEMENTATION
//#define MINIMP3_FLOAT_OUTPUT
//#include <minimp3.h>
/* ------------------------------------------------- IMG --------------------------------------------------- */
typedef struct {
unsigned char a,r,g,b;
} pixel;
/*HL_PRIM bool HL_NAME(jpg_decode)( vbyte *data, int dataLen, vbyte *out, int width, int height, int stride, int format, int flags ) {
#if defined(HL_CONSOLE) && !defined(HL_XBO)
hl_blocking(true);
bool b = sys_jpg_decode(data, dataLen, out, width, height, stride, format, flags);
hl_blocking(false);
return b;
#else
hl_blocking(true);
tjhandle h = tjInitDecompress();
int result;
result = tjDecompress2(h,data,dataLen,out,width,stride,height,format,(flags & 1 ? TJFLAG_BOTTOMUP : 0));
tjDestroy(h);
hl_blocking(false);
return result == 0;
#endif
}
HL_PRIM bool HL_NAME(png_decode)( vbyte *data, int dataLen, vbyte *out, int width, int height, int stride, int format, int flags ) {
# ifdef PNG_IMAGE_VERSION
png_image img;
hl_blocking(true);
memset(&img, 0, sizeof(img));
img.version = PNG_IMAGE_VERSION;
if( png_image_begin_read_from_memory(&img,data,dataLen) == 0 ) {
hl_blocking(false);
png_image_free(&img);
return false;
}
switch( format ) {
case 0:
img.format = PNG_FORMAT_RGB;
break;
case 1:
img.format = PNG_FORMAT_BGR;
break;
case 7:
img.format = PNG_FORMAT_RGBA;
break;
case 8:
img.format = PNG_FORMAT_BGRA;
break;
case 9:
img.format = PNG_FORMAT_ABGR;
break;
case 10:
img.format = PNG_FORMAT_ARGB;
break;
case 12:
img.format = PNG_FORMAT_LINEAR_Y;
break;
case 13:
img.format = PNG_FORMAT_LINEAR_RGB;
break;
case 14:
img.format = PNG_FORMAT_LINEAR_RGB_ALPHA;
break;
case 15:
img.format = PNG_FORMAT_LINEAR_Y_ALPHA;
break;
default:
hl_blocking(false);
png_image_free(&img);
hl_error("Unsupported format");
break;
}
if( img.width != width || img.height != height ) {
hl_blocking(false);
png_image_free(&img);
return false;
}
if( png_image_finish_read(&img,NULL,out,stride * (flags & 1 ? -1 : 1),NULL) == 0 ) {
hl_blocking(false);
png_image_free(&img);
return false;
}
hl_blocking(false);
png_image_free(&img);
# else
hl_error("PNG support is missing for this libPNG version");
# endif
return true;
}*/
HL_PRIM void HL_NAME(img_scale)( vbyte *out, int outPos, int outStride, int outWidth, int outHeight, vbyte *in, int inPos, int inStride, int inWidth, int inHeight, int flags ) {
int x, y;
float scaleX = outWidth <= 1 ? 0.0f : (float)((inWidth - 1.001f) / (outWidth - 1));
float scaleY = outHeight <= 1 ? 0.0f : (float)((inHeight - 1.001f) / (outHeight - 1));
out += outPos;
in += inPos;
hl_blocking(true);
for(y=0;y<outHeight;y++) {
for(x=0;x<outWidth;x++) {
float fx = x * scaleX;
float fy = y * scaleY;
int ix = (int)fx;
int iy = (int)fy;
if( (flags & 1) == 0 ) {
// nearest
vbyte *rin = in + iy * inStride;
*(pixel*)out = *(pixel*)(rin + (ix<<2));
out += 4;
} else {
// bilinear
float rx = fx - ix;
float ry = fy - iy;
float rx1 = 1.0f - rx;
float ry1 = 1.0f - ry;
int w1 = (int)(rx1 * ry1 * 256.0f);
int w2 = (int)(rx * ry1 * 256.0f);
int w3 = (int)(rx1 * ry * 256.0f);
int w4 = (int)(rx * ry * 256.0f);
vbyte *rin = in + iy * inStride;
pixel p1 = *(pixel*)(rin + (ix<<2));
pixel p2 = *(pixel*)(rin + ((ix + 1)<<2));
pixel p3 = *(pixel*)(rin + inStride + (ix<<2));
pixel p4 = *(pixel*)(rin + inStride + ((ix + 1)<<2));
*out++ = (unsigned char)((p1.a * w1 + p2.a * w2 + p3.a * w3 + p4.a * w4 + 128)>>8);
*out++ = (unsigned char)((p1.r * w1 + p2.r * w2 + p3.r * w3 + p4.r * w4 + 128)>>8);
*out++ = (unsigned char)((p1.g * w1 + p2.g * w2 + p3.g * w3 + p4.g * w4 + 128)>>8);
*out++ = (unsigned char)((p1.b * w1 + p2.b * w2 + p3.b * w3 + p4.b * w4 + 128)>>8);
}
}
out += outStride - (outWidth << 2);
}
hl_blocking(false);
}
DEFINE_PRIM(_BOOL, jpg_decode, _BYTES _I32 _BYTES _I32 _I32 _I32 _I32 _I32);
DEFINE_PRIM(_BOOL, png_decode, _BYTES _I32 _BYTES _I32 _I32 _I32 _I32 _I32);
DEFINE_PRIM(_VOID, img_scale, _BYTES _I32 _I32 _I32 _I32 _BYTES _I32 _I32 _I32 _I32 _I32);
/* ------------------------------------------------- ZLIB --------------------------------------------------- */
typedef struct _fmt_zip fmt_zip;
struct _fmt_zip {
void (*finalize)( fmt_zip * );
z_stream *z;
int flush;
bool inflate;
};
static void free_stream_inf( fmt_zip *v ) {
if( v->inflate )
inflateEnd(v->z); // no error
else
deflateEnd(v->z);
free(v->z);
v->z = NULL;
v->finalize = NULL;
}
static void zlib_error( z_stream *z, int err ) {
hl_buffer *b = hl_alloc_buffer();
vdynamic *d;
hl_buffer_cstr(b, "ZLib Error : ");
if( z && z->msg ) {
hl_buffer_cstr(b,z->msg);
hl_buffer_cstr(b," (");
}
d = hl_alloc_dynamic(&hlt_i32);
d->v.i = err;
hl_buffer_val(b,d);
if( z && z->msg )
hl_buffer_char(b,')');
d = hl_alloc_dynamic(&hlt_bytes);
d->v.ptr = hl_buffer_content(b,NULL);
hl_throw(d);
}
HL_PRIM fmt_zip *HL_NAME(inflate_init)( int wbits ) {
z_stream *z;
int err;
fmt_zip *s;
if( wbits == 0 )
wbits = MAX_WBITS;
z = (z_stream*)malloc(sizeof(z_stream));
memset(z,0,sizeof(z_stream));
if( (err = inflateInit2(z,wbits)) != Z_OK ) {
free(z);
zlib_error(NULL,err);
}
s = (fmt_zip*)hl_gc_alloc_finalizer(sizeof(fmt_zip));
s->finalize = free_stream_inf;
s->flush = Z_NO_FLUSH;
s->z = z;
s->inflate = true;
return s;
}
HL_PRIM fmt_zip *HL_NAME(deflate_init)( int level ) {
z_stream *z;
int err;
fmt_zip *s;
z = (z_stream*)malloc(sizeof(z_stream));
memset(z,0,sizeof(z_stream));
if( (err = deflateInit(z,level)) != Z_OK ) {
free(z);
zlib_error(NULL,err);
}
s = (fmt_zip*)hl_gc_alloc_finalizer(sizeof(fmt_zip));
s->finalize = free_stream_inf;
s->flush = Z_NO_FLUSH;
s->z = z;
s->inflate = false;
return s;
}
HL_PRIM void HL_NAME(zip_end)( fmt_zip *z ) {
free_stream_inf(z);
}
HL_PRIM void HL_NAME(zip_flush_mode)( fmt_zip *z, int flush ) {
switch( flush ) {
case 0:
z->flush = Z_NO_FLUSH;
break;
case 1:
z->flush = Z_SYNC_FLUSH;
break;
case 2:
z->flush = Z_FULL_FLUSH;
break;
case 3:
z->flush = Z_FINISH;
break;
case 4:
z->flush = Z_BLOCK;
break;
default:
hl_error("Invalid flush mode %d",flush);
break;
}
}
HL_PRIM bool HL_NAME(inflate_buffer)( fmt_zip *zip, vbyte *src, int srcpos, int srclen, vbyte *dst, int dstpos, int dstlen, int *read, int *write ) {
int slen, dlen, err;
z_stream *z = zip->z;
slen = srclen - srcpos;
dlen = dstlen - dstpos;
if( srcpos < 0 || dstpos < 0 || slen < 0 || dlen < 0 )
hl_error("Out of range");
hl_blocking(true);
z->next_in = (Bytef*)(src + srcpos);
z->next_out = (Bytef*)(dst + dstpos);
z->avail_in = slen;
z->avail_out = dlen;
if( (err = inflate(z,zip->flush)) < 0 ) {
hl_blocking(false);
zlib_error(z,err);
}
z->next_in = NULL;
z->next_out = NULL;
*read = slen - z->avail_in;
*write = dlen - z->avail_out;
hl_blocking(false);
return err == Z_STREAM_END;
}
HL_PRIM bool HL_NAME(deflate_buffer)( fmt_zip *zip, vbyte *src, int srcpos, int srclen, vbyte *dst, int dstpos, int dstlen, int *read, int *write ) {
int slen, dlen, err;
z_stream *z = zip->z;
slen = srclen - srcpos;
dlen = dstlen - dstpos;
if( srcpos < 0 || dstpos < 0 || slen < 0 || dlen < 0 )
hl_error("Out of range");
hl_blocking(true);
z->next_in = (Bytef*)(src + srcpos);
z->next_out = (Bytef*)(dst + dstpos);
z->avail_in = slen;
z->avail_out = dlen;
if( (err = deflate(z,zip->flush)) < 0 ) {
hl_blocking(false);
zlib_error(z,err);
}
z->next_in = NULL;
z->next_out = NULL;
*read = slen - z->avail_in;
*write = dlen - z->avail_out;
hl_blocking(false);
return err == Z_STREAM_END;
}
HL_PRIM int HL_NAME(deflate_bound)( fmt_zip *zip, int size ) {
return deflateBound(zip->z,size);
}
#define _ZIP _ABSTRACT(fmt_zip)
DEFINE_PRIM(_ZIP, inflate_init, _I32);
DEFINE_PRIM(_ZIP, deflate_init, _I32);
DEFINE_PRIM(_I32, deflate_bound, _ZIP _I32);
DEFINE_PRIM(_VOID, zip_end, _ZIP);
DEFINE_PRIM(_VOID, zip_flush_mode, _ZIP _I32);
DEFINE_PRIM(_BOOL, inflate_buffer, _ZIP _BYTES _I32 _I32 _BYTES _I32 _I32 _REF(_I32) _REF(_I32));
DEFINE_PRIM(_BOOL, deflate_buffer, _ZIP _BYTES _I32 _I32 _BYTES _I32 _I32 _REF(_I32) _REF(_I32));
/* ----------------------------------------------- SOUND : OGG ------------------------------------------------ */
/*typedef struct _fmt_ogg fmt_ogg;
struct _fmt_ogg {
void (*finalize)( fmt_ogg * );
OggVorbis_File f;
char *bytes;
int pos;
int size;
int section;
};
static void ogg_finalize( fmt_ogg *o ) {
ov_clear(&o->f);
}
static size_t ogg_memread( void *ptr, int size, int count, fmt_ogg *o ) {
int len = size * count;
if( o->pos + len > o->size )
len = o->size - o->pos;
memcpy(ptr, o->bytes + o->pos, len);
o->pos += len;
return len;
}
static int ogg_memseek( fmt_ogg *o, ogg_int64_t _offset, int mode ) {
int offset = (int)_offset;
switch( mode ) {
case SEEK_SET:
if( offset < 0 || offset > o->size ) return 1;
o->pos = offset;
break;
case SEEK_CUR:
if( o->pos + offset < 0 || o->pos + offset > o->size ) return 1;
o->pos += offset;
break;
case SEEK_END:
if( offset < 0 || offset > o->size ) return 1;
o->pos = o->size - offset;
break;
}
return 0;
}
static long ogg_memtell( fmt_ogg *o ) {
return o->pos;
}
static ov_callbacks OV_CALLBACKS_MEMORY = {
(size_t (*)(void *, size_t, size_t, void *)) ogg_memread,
(int (*)(void *, ogg_int64_t, int)) ogg_memseek,
(int (*)(void *)) NULL,
(long (*)(void *)) ogg_memtell
};
HL_PRIM fmt_ogg *HL_NAME(ogg_open)( char *bytes, int size ) {
fmt_ogg *o = (fmt_ogg*)hl_gc_alloc_finalizer(sizeof(fmt_ogg));
o->finalize = NULL;
o->bytes = bytes;
o->size = size;
o->pos = 0;
if( ov_open_callbacks(o,&o->f,NULL,0,OV_CALLBACKS_MEMORY) != 0 )
return NULL;
o->finalize = ogg_finalize;
return o;
}
HL_PRIM void HL_NAME(ogg_info)( fmt_ogg *o, int *bitrate, int *freq, int *samples, int *channels ) {
vorbis_info *i = ov_info(&o->f,-1);
*bitrate = i->bitrate_nominal;
*freq = i->rate;
*channels = i->channels;
*samples = (int)ov_pcm_total(&o->f, -1);
}
HL_PRIM int HL_NAME(ogg_tell)( fmt_ogg *o ) {
return (int)ov_pcm_tell(&o->f); // overflow at 12 hours @48 Khz
}
HL_PRIM bool HL_NAME(ogg_seek)( fmt_ogg *o, int sample ) {
return ov_pcm_seek(&o->f,sample) == 0;
}
#define OGGFMT_I8 1
#define OGGFMT_I16 2
//#define OGGFMT_F32 3
#define OGGFMT_BIGENDIAN 128
#define OGGFMT_UNSIGNED 256
HL_PRIM int HL_NAME(ogg_read)( fmt_ogg *o, char *output, int size, int format ) {
int ret = -1;
hl_blocking(true);
switch( format&127 ) {
case OGGFMT_I8:
case OGGFMT_I16:
ret = ov_read(&o->f, output, size, (format & OGGFMT_BIGENDIAN) != 0, format&3, (format & OGGFMT_UNSIGNED) == 0, &o->section);
break;
// case OGGFMT_F32:
// -- this decodes separates channels instead of mixed single buffer one
// return ov_read_float(&o->f, output, size, (format & OGGFMT_BIGENDIAN) != 0, format&3, (format & OGGFMT_UNSIGNED) == 0, &o->section);
default:
break;
}
hl_blocking(false);
return ret;
}
#define _OGG _ABSTRACT(fmt_ogg)
DEFINE_PRIM(_OGG, ogg_open, _BYTES _I32);
DEFINE_PRIM(_VOID, ogg_info, _OGG _REF(_I32) _REF(_I32) _REF(_I32) _REF(_I32));
DEFINE_PRIM(_I32, ogg_tell, _OGG);
DEFINE_PRIM(_BOOL, ogg_seek, _OGG _I32);
DEFINE_PRIM(_I32, ogg_read, _OGG _BYTES _I32 _I32);*/
/* ----------------------------------------------- SOUND : MP3 ------------------------------------------------ */
/*typedef struct _fmt_mp3 fmt_mp3;
struct _fmt_mp3 {
mp3dec_t dec;
mp3dec_frame_info_t info;
mp3d_sample_t pcm[MINIMP3_MAX_SAMPLES_PER_FRAME];
};*/
// Allocate MP3 reader.
/*HL_PRIM fmt_mp3 *HL_NAME(mp3_open)() {
fmt_mp3 *o = (fmt_mp3*)hl_gc_alloc_noptr(sizeof(fmt_mp3));
mp3dec_init(&o->dec);
return o;
}*/
/**
Retreive last decoded frame information.
@param bitrate_kbps Bitrate of the frame
@param channels Total amount of channels in the frame.
@param frame_bytes The size of the frame in the input stream,
@param hz
@param layer Mpeg Layer index (usually 3).
**/
/*HL_PRIM void HL_NAME(mp3_frame_info)(fmt_mp3 *o, int *bitrate_kbps, int *channels, int *frame_bytes, int *hz, int *layer) {
*bitrate_kbps = o->info.bitrate_kbps;
*channels = o->info.channels;
*frame_bytes = o->info.frame_bytes;
*hz = o->info.hz;
*layer = o->info.layer;
}*/
/**
Decodes a single frame from input stream and writes result to output.
Decoded samples are in Float32 format. Output bytes should contain enough space to fit entire frame in.
To calculate required output size, follow next formula: `samples * channels * 4`.
For Layer 1, amount of frames is 384, MPEG 2 Layer 2 is 576 and 1152 otherwise. Using 1152 samples is the safest.
@param o Allocated MP3 reader.
@param bytes Input stream.
@param size Input stream size.
@param position Input stream offset.
@param output Output stream.
@param outputSize Output stream size.
@param offset Output stream write offset.
@returns 0 if no MP3 data was found (end of stream/invalid data), -1 if either input buffer position invalid or output size is insufficent.
Amount of decoded samples otherwise.
**/
/*HL_PRIM int HL_NAME(mp3_decode_frame)( fmt_mp3 *o, char *bytes, int size, int position, char *output, int outputSize, int offset ) {
// Out of mp3 file bounds.
if ( position < 0 || size <= position )
return -1;
int samples = 0;
hl_blocking(true);
do {
samples = mp3dec_decode_frame(&o->dec, (unsigned char*)bytes + position, size - position, o->pcm, &o->info);
// Try to read until found mp3 data or EOF.
if ( samples != 0 || o->info.frame_bytes == 0 )
break;
position += o->info.frame_bytes;
} while ( size > position );
// No or invalid MP3 data.
if ( samples == 0 || o->info.frame_bytes == 0 ) {
hl_blocking(false);
return 0;
}
int decodedSize = samples * o->info.channels * sizeof(mp3d_sample_t);
// Insufficent output buffer size.
if ( outputSize - offset < decodedSize ) {
hl_blocking(false);
return -1;
}
memcpy( (void *)(output + offset), (void *)o->pcm, decodedSize );
hl_blocking(false);
return samples;
}
#define _MP3 _ABSTRACT(fmt_mp3)
DEFINE_PRIM(_MP3, mp3_open, _BYTES _I32);
DEFINE_PRIM(_VOID, mp3_frame_info, _MP3 _REF(_I32) _REF(_I32) _REF(_I32) _REF(_I32) _REF(_I32))
DEFINE_PRIM(_I32, mp3_decode_frame, _MP3 _BYTES _I32 _I32 _BYTES _I32 _I32);*/
/* ------------------------------------------------- CRYPTO --------------------------------------------------- */
typedef unsigned int uint32;
typedef unsigned char uint8;
typedef struct {
uint32 total[2];
uint32 state[4];
uint8 buffer[64];
} md5_context;
#define GET_UINT32(n,b,i) \
{ \
(n) = ( (uint32) (b)[(i) ] ) \
| ( (uint32) (b)[(i) + 1] << 8 ) \
| ( (uint32) (b)[(i) + 2] << 16 ) \
| ( (uint32) (b)[(i) + 3] << 24 ); \
}
#define PUT_UINT32(n,b,i) \
{ \
(b)[(i) ] = (uint8) ( (n) ); \
(b)[(i) + 1] = (uint8) ( (n) >> 8 ); \
(b)[(i) + 2] = (uint8) ( (n) >> 16 ); \
(b)[(i) + 3] = (uint8) ( (n) >> 24 ); \
}
static void md5_starts( md5_context *ctx ) {
ctx->total[0] = 0;
ctx->total[1] = 0;
ctx->state[0] = 0x67452301;
ctx->state[1] = 0xEFCDAB89;
ctx->state[2] = 0x98BADCFE;
ctx->state[3] = 0x10325476;
}
static void md5_process( md5_context *ctx, uint8 data[64] ) {
uint32 X[16], A, B, C, D;
GET_UINT32( X[0], data, 0 );
GET_UINT32( X[1], data, 4 );
GET_UINT32( X[2], data, 8 );
GET_UINT32( X[3], data, 12 );
GET_UINT32( X[4], data, 16 );
GET_UINT32( X[5], data, 20 );
GET_UINT32( X[6], data, 24 );
GET_UINT32( X[7], data, 28 );
GET_UINT32( X[8], data, 32 );
GET_UINT32( X[9], data, 36 );
GET_UINT32( X[10], data, 40 );
GET_UINT32( X[11], data, 44 );
GET_UINT32( X[12], data, 48 );
GET_UINT32( X[13], data, 52 );
GET_UINT32( X[14], data, 56 );
GET_UINT32( X[15], data, 60 );
#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
#define P(a,b,c,d,k,s,t) \
{ \
a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
}
A = ctx->state[0];
B = ctx->state[1];
C = ctx->state[2];
D = ctx->state[3];
#define F(x,y,z) (z ^ (x & (y ^ z)))
P( A, B, C, D, 0, 7, 0xD76AA478 );
P( D, A, B, C, 1, 12, 0xE8C7B756 );
P( C, D, A, B, 2, 17, 0x242070DB );
P( B, C, D, A, 3, 22, 0xC1BDCEEE );
P( A, B, C, D, 4, 7, 0xF57C0FAF );
P( D, A, B, C, 5, 12, 0x4787C62A );
P( C, D, A, B, 6, 17, 0xA8304613 );
P( B, C, D, A, 7, 22, 0xFD469501 );
P( A, B, C, D, 8, 7, 0x698098D8 );
P( D, A, B, C, 9, 12, 0x8B44F7AF );
P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
P( B, C, D, A, 11, 22, 0x895CD7BE );
P( A, B, C, D, 12, 7, 0x6B901122 );
P( D, A, B, C, 13, 12, 0xFD987193 );
P( C, D, A, B, 14, 17, 0xA679438E );
P( B, C, D, A, 15, 22, 0x49B40821 );
#undef F
#define F(x,y,z) (y ^ (z & (x ^ y)))
P( A, B, C, D, 1, 5, 0xF61E2562 );
P( D, A, B, C, 6, 9, 0xC040B340 );
P( C, D, A, B, 11, 14, 0x265E5A51 );
P( B, C, D, A, 0, 20, 0xE9B6C7AA );
P( A, B, C, D, 5, 5, 0xD62F105D );
P( D, A, B, C, 10, 9, 0x02441453 );
P( C, D, A, B, 15, 14, 0xD8A1E681 );
P( B, C, D, A, 4, 20, 0xE7D3FBC8 );
P( A, B, C, D, 9, 5, 0x21E1CDE6 );
P( D, A, B, C, 14, 9, 0xC33707D6 );
P( C, D, A, B, 3, 14, 0xF4D50D87 );
P( B, C, D, A, 8, 20, 0x455A14ED );
P( A, B, C, D, 13, 5, 0xA9E3E905 );
P( D, A, B, C, 2, 9, 0xFCEFA3F8 );
P( C, D, A, B, 7, 14, 0x676F02D9 );
P( B, C, D, A, 12, 20, 0x8D2A4C8A );
#undef F
#define F(x,y,z) (x ^ y ^ z)
P( A, B, C, D, 5, 4, 0xFFFA3942 );
P( D, A, B, C, 8, 11, 0x8771F681 );
P( C, D, A, B, 11, 16, 0x6D9D6122 );
P( B, C, D, A, 14, 23, 0xFDE5380C );
P( A, B, C, D, 1, 4, 0xA4BEEA44 );
P( D, A, B, C, 4, 11, 0x4BDECFA9 );
P( C, D, A, B, 7, 16, 0xF6BB4B60 );
P( B, C, D, A, 10, 23, 0xBEBFBC70 );
P( A, B, C, D, 13, 4, 0x289B7EC6 );
P( D, A, B, C, 0, 11, 0xEAA127FA );
P( C, D, A, B, 3, 16, 0xD4EF3085 );
P( B, C, D, A, 6, 23, 0x04881D05 );
P( A, B, C, D, 9, 4, 0xD9D4D039 );
P( D, A, B, C, 12, 11, 0xE6DB99E5 );
P( C, D, A, B, 15, 16, 0x1FA27CF8 );
P( B, C, D, A, 2, 23, 0xC4AC5665 );
#undef F
#define F(x,y,z) (y ^ (x | ~z))
P( A, B, C, D, 0, 6, 0xF4292244 );
P( D, A, B, C, 7, 10, 0x432AFF97 );
P( C, D, A, B, 14, 15, 0xAB9423A7 );
P( B, C, D, A, 5, 21, 0xFC93A039 );
P( A, B, C, D, 12, 6, 0x655B59C3 );
P( D, A, B, C, 3, 10, 0x8F0CCC92 );
P( C, D, A, B, 10, 15, 0xFFEFF47D );
P( B, C, D, A, 1, 21, 0x85845DD1 );
P( A, B, C, D, 8, 6, 0x6FA87E4F );
P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
P( C, D, A, B, 6, 15, 0xA3014314 );
P( B, C, D, A, 13, 21, 0x4E0811A1 );
P( A, B, C, D, 4, 6, 0xF7537E82 );
P( D, A, B, C, 11, 10, 0xBD3AF235 );
P( C, D, A, B, 2, 15, 0x2AD7D2BB );
P( B, C, D, A, 9, 21, 0xEB86D391 );
#undef F
ctx->state[0] += A;
ctx->state[1] += B;
ctx->state[2] += C;
ctx->state[3] += D;
}
static void md5_update( md5_context *ctx, uint8 *input, uint32 length ) {
uint32 left, fill;
if( !length )
return;
left = ctx->total[0] & 0x3F;
fill = 64 - left;
ctx->total[0] += length;
ctx->total[0] &= 0xFFFFFFFF;
if( ctx->total[0] < length )
ctx->total[1]++;
if( left && length >= fill ) {
memcpy( (void *) (ctx->buffer + left),
(void *) input, fill );
md5_process( ctx, ctx->buffer );
length -= fill;
input += fill;
left = 0;
}
while( length >= 64 ) {
md5_process( ctx, input );
length -= 64;
input += 64;
}
if( length ) {
memcpy( (void *) (ctx->buffer + left),
(void *) input, length );
}
}
static uint8 md5_padding[64] =
{
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
static void md5_finish( md5_context *ctx, uint8 digest[16] ) {
uint32 last, padn;
uint32 high, low;
uint8 msglen[8];
high = ( ctx->total[0] >> 29 )
| ( ctx->total[1] << 3 );
low = ( ctx->total[0] << 3 );
PUT_UINT32( low, msglen, 0 );
PUT_UINT32( high, msglen, 4 );
last = ctx->total[0] & 0x3F;
padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
md5_update( ctx, md5_padding, padn );
md5_update( ctx, msglen, 8 );
PUT_UINT32( ctx->state[0], digest, 0 );
PUT_UINT32( ctx->state[1], digest, 4 );
PUT_UINT32( ctx->state[2], digest, 8 );
PUT_UINT32( ctx->state[3], digest, 12 );
}
#include "sha1.h"
HL_PRIM void HL_NAME(digest)( vbyte *out, vbyte *in, int length, int format ) {
if( format & 256 ) {
in = (vbyte*)hl_to_utf8((uchar*)in);
length = (int)strlen((char*)in);
}
hl_blocking(true);
switch( format & 0xFF ) {
case 0:
{
md5_context ctx;
md5_starts(&ctx);
md5_update(&ctx,in,(uint32)length);
md5_finish(&ctx,out);
}
break;
case 1:
{
SHA1_CTX ctx;
sha1_init(&ctx);
sha1_update(&ctx,in,length);
sha1_final(&ctx,out);
}
break;
case 2:
*((int*)out) = crc32(*(int*)out, in, length);
break;
case 3:
*((int*)out) = adler32(*(int*)out, in, length);
break;
default:
hl_blocking(false);
hl_error("Unknown digest format %d",format&0xFF);
break;
}
hl_blocking(false);
}
DEFINE_PRIM(_VOID, digest, _BYTES _BYTES _I32 _I32);

View File

@ -0,0 +1,398 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="ReleaseVS2013|Win32">
<Configuration>ReleaseVS2013</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="ReleaseVS2013|x64">
<Configuration>ReleaseVS2013</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\include\mikktspace\mikktspace.c" />
<ClCompile Include="..\..\include\png\png.c" />
<ClCompile Include="..\..\include\png\pngerror.c" />
<ClCompile Include="..\..\include\png\pngget.c" />
<ClCompile Include="..\..\include\png\pngmem.c" />
<ClCompile Include="..\..\include\png\pngpread.c" />
<ClCompile Include="..\..\include\png\pngread.c" />
<ClCompile Include="..\..\include\png\pngrio.c" />
<ClCompile Include="..\..\include\png\pngrtran.c" />
<ClCompile Include="..\..\include\png\pngrutil.c" />
<ClCompile Include="..\..\include\png\pngset.c" />
<ClCompile Include="..\..\include\png\pngtrans.c" />
<ClCompile Include="..\..\include\png\pngwio.c" />
<ClCompile Include="..\..\include\png\pngwrite.c" />
<ClCompile Include="..\..\include\png\pngwtran.c" />
<ClCompile Include="..\..\include\png\pngwutil.c" />
<ClCompile Include="..\..\include\turbojpeg\jaricom.c" />
<ClCompile Include="..\..\include\turbojpeg\jcapimin.c" />
<ClCompile Include="..\..\include\turbojpeg\jcapistd.c" />
<ClCompile Include="..\..\include\turbojpeg\jcarith.c" />
<ClCompile Include="..\..\include\turbojpeg\jccoefct.c" />
<ClCompile Include="..\..\include\turbojpeg\jccolor.c" />
<ClCompile Include="..\..\include\turbojpeg\jcdctmgr.c" />
<ClCompile Include="..\..\include\turbojpeg\jchuff.c" />
<ClCompile Include="..\..\include\turbojpeg\jcinit.c" />
<ClCompile Include="..\..\include\turbojpeg\jcmainct.c" />
<ClCompile Include="..\..\include\turbojpeg\jcmarker.c" />
<ClCompile Include="..\..\include\turbojpeg\jcmaster.c" />
<ClCompile Include="..\..\include\turbojpeg\jcomapi.c" />
<ClCompile Include="..\..\include\turbojpeg\jcparam.c" />
<ClCompile Include="..\..\include\turbojpeg\jcphuff.c" />
<ClCompile Include="..\..\include\turbojpeg\jcprepct.c" />
<ClCompile Include="..\..\include\turbojpeg\jcsample.c" />
<ClCompile Include="..\..\include\turbojpeg\jctrans.c" />
<ClCompile Include="..\..\include\turbojpeg\jdapimin.c" />
<ClCompile Include="..\..\include\turbojpeg\jdapistd.c" />
<ClCompile Include="..\..\include\turbojpeg\jdarith.c" />
<ClCompile Include="..\..\include\turbojpeg\jdatadst-tj.c" />
<ClCompile Include="..\..\include\turbojpeg\jdatadst.c" />
<ClCompile Include="..\..\include\turbojpeg\jdatasrc-tj.c" />
<ClCompile Include="..\..\include\turbojpeg\jdatasrc.c" />
<ClCompile Include="..\..\include\turbojpeg\jdcoefct.c" />
<ClCompile Include="..\..\include\turbojpeg\jdcolor.c" />
<ClCompile Include="..\..\include\turbojpeg\jddctmgr.c" />
<ClCompile Include="..\..\include\turbojpeg\jdhuff.c" />
<ClCompile Include="..\..\include\turbojpeg\jdinput.c" />
<ClCompile Include="..\..\include\turbojpeg\jdmainct.c" />
<ClCompile Include="..\..\include\turbojpeg\jdmarker.c" />
<ClCompile Include="..\..\include\turbojpeg\jdmaster.c" />
<ClCompile Include="..\..\include\turbojpeg\jdmerge.c" />
<ClCompile Include="..\..\include\turbojpeg\jdphuff.c" />
<ClCompile Include="..\..\include\turbojpeg\jdpostct.c" />
<ClCompile Include="..\..\include\turbojpeg\jdsample.c" />
<ClCompile Include="..\..\include\turbojpeg\jdtrans.c" />
<ClCompile Include="..\..\include\turbojpeg\jerror.c" />
<ClCompile Include="..\..\include\turbojpeg\jfdctflt.c" />
<ClCompile Include="..\..\include\turbojpeg\jfdctfst.c" />
<ClCompile Include="..\..\include\turbojpeg\jfdctint.c" />
<ClCompile Include="..\..\include\turbojpeg\jidctflt.c" />
<ClCompile Include="..\..\include\turbojpeg\jidctfst.c" />
<ClCompile Include="..\..\include\turbojpeg\jidctint.c" />
<ClCompile Include="..\..\include\turbojpeg\jidctred.c" />
<ClCompile Include="..\..\include\turbojpeg\jmemmgr.c" />
<ClCompile Include="..\..\include\turbojpeg\jmemnobs.c" />
<ClCompile Include="..\..\include\turbojpeg\jquant1.c" />
<ClCompile Include="..\..\include\turbojpeg\jquant2.c" />
<ClCompile Include="..\..\include\turbojpeg\jsimd.c" />
<ClCompile Include="..\..\include\turbojpeg\jutils.c" />
<ClCompile Include="..\..\include\turbojpeg\transupp.c" />
<ClCompile Include="..\..\include\turbojpeg\turbojpeg.c" />
<ClCompile Include="..\..\include\vorbis\bitrate.c" />
<ClCompile Include="..\..\include\vorbis\bitwise.c" />
<ClCompile Include="..\..\include\vorbis\block.c" />
<ClCompile Include="..\..\include\vorbis\codebook.c" />
<ClCompile Include="..\..\include\vorbis\envelope.c" />
<ClCompile Include="..\..\include\vorbis\floor0.c" />
<ClCompile Include="..\..\include\vorbis\floor1.c" />
<ClCompile Include="..\..\include\vorbis\framing.c" />
<ClCompile Include="..\..\include\vorbis\info.c" />
<ClCompile Include="..\..\include\vorbis\lookup.c" />
<ClCompile Include="..\..\include\vorbis\lpc.c" />
<ClCompile Include="..\..\include\vorbis\lsp.c" />
<ClCompile Include="..\..\include\vorbis\mapping0.c" />
<ClCompile Include="..\..\include\vorbis\mdct.c" />
<ClCompile Include="..\..\include\vorbis\psy.c" />
<ClCompile Include="..\..\include\vorbis\registry.c" />
<ClCompile Include="..\..\include\vorbis\res0.c" />
<ClCompile Include="..\..\include\vorbis\sharedbook.c" />
<ClCompile Include="..\..\include\vorbis\smallft.c" />
<ClCompile Include="..\..\include\vorbis\synthesis.c" />
<ClCompile Include="..\..\include\vorbis\vorbisfile.c" />
<ClCompile Include="..\..\include\vorbis\window.c" />
<ClCompile Include="..\..\include\zlib\adler32.c" />
<ClCompile Include="..\..\include\zlib\crc32.c" />
<ClCompile Include="..\..\include\zlib\deflate.c" />
<ClCompile Include="..\..\include\zlib\inffast.c" />
<ClCompile Include="..\..\include\zlib\inflate.c" />
<ClCompile Include="..\..\include\zlib\inftrees.c" />
<ClCompile Include="..\..\include\zlib\trees.c" />
<ClCompile Include="..\..\include\zlib\zutil.c" />
<ClCompile Include="dxt.c" />
<ClCompile Include="fmt.c" />
<ClCompile Include="mikkt.c" />
<ClCompile Include="sha1.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\include\mikktspace\mikktspace.h" />
<ClInclude Include="..\..\include\png\png.h" />
<ClInclude Include="..\..\include\png\pngconf.h" />
<ClInclude Include="..\..\include\png\pngdebug.h" />
<ClInclude Include="..\..\include\png\pnginfo.h" />
<ClInclude Include="..\..\include\png\pnglibconf.h" />
<ClInclude Include="..\..\include\png\pngpriv.h" />
<ClInclude Include="..\..\include\png\pngstruct.h" />
<ClInclude Include="..\..\include\vorbis\backends.h" />
<ClInclude Include="..\..\include\vorbis\bitrate.h" />
<ClInclude Include="..\..\include\vorbis\codebook.h" />
<ClInclude Include="..\..\include\vorbis\codec_internal.h" />
<ClInclude Include="..\..\include\vorbis\envelope.h" />
<ClInclude Include="..\..\include\vorbis\highlevel.h" />
<ClInclude Include="..\..\include\vorbis\lookup.h" />
<ClInclude Include="..\..\include\vorbis\lookup_data.h" />
<ClInclude Include="..\..\include\vorbis\lpc.h" />
<ClInclude Include="..\..\include\vorbis\lsp.h" />
<ClInclude Include="..\..\include\vorbis\masking.h" />
<ClInclude Include="..\..\include\vorbis\mdct.h" />
<ClInclude Include="..\..\include\vorbis\misc.h" />
<ClInclude Include="..\..\include\vorbis\os.h" />
<ClInclude Include="..\..\include\vorbis\psy.h" />
<ClInclude Include="..\..\include\vorbis\registry.h" />
<ClInclude Include="..\..\include\vorbis\scales.h" />
<ClInclude Include="..\..\include\vorbis\smallft.h" />
<ClInclude Include="..\..\include\vorbis\window.h" />
<ClInclude Include="..\..\include\zlib\crc32.h" />
<ClInclude Include="..\..\include\zlib\deflate.h" />
<ClInclude Include="..\..\include\zlib\inffast.h" />
<ClInclude Include="..\..\include\zlib\inffixed.h" />
<ClInclude Include="..\..\include\zlib\inflate.h" />
<ClInclude Include="..\..\include\zlib\inftrees.h" />
<ClInclude Include="..\..\include\zlib\trees.h" />
<ClInclude Include="..\..\include\zlib\zconf.h" />
<ClInclude Include="..\..\include\zlib\zlib.h" />
<ClInclude Include="..\..\include\minimp3\minimp3.h" />
<ClInclude Include="sha1.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{7DDA1414-6675-45C7-8254-42057901F865}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>jpg</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectName>fmt</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/turbojpeg;../../include/zlib;../../include/png;../../include/vorbis;../../include/mikktspace;../../include/minimp3</IncludePath>
<LibraryPath>$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;../../$(Configuration);../../include/turbojpeg/x86</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/turbojpeg;../../include/zlib;../../include/png;../../include/vorbis;../../include/mikktspace;../../include/minimp3</IncludePath>
<LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;../../x64/$(Configuration);../../include/turbojpeg/x64</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/turbojpeg;../../include/zlib;../../include/png;../../include/vorbis;../../include/mikktspace;../../include/minimp3</IncludePath>
<LibraryPath>$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;../../$(Configuration);../../include/turbojpeg/x86</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/turbojpeg;../../include/zlib;../../include/png;../../include/vorbis;../../include/mikktspace;../../include/minimp3</IncludePath>
<LibraryPath>$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;../../$(Configuration);../../include/turbojpeg/x86</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/turbojpeg;../../include/zlib;../../include/png;../../include/vorbis;../../include/mikktspace;../../include/minimp3</IncludePath>
<LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;../../x64/$(Configuration);../../include/turbojpeg/x64</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/turbojpeg;../../include/zlib;../../include/png;../../include/vorbis;../../include/mikktspace;../../include/minimp3</IncludePath>
<LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;../../x64/$(Configuration);../../include/turbojpeg/x64</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;JPG_EXPORTS;%(PreprocessorDefinitions); _CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<AdditionalOptions>/wd4996 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>../../$(Configuration)/$(TargetName).hdll</OutputFile>
<AdditionalDependencies>libhl.lib;simd.lib</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>LIBCMT</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;JPG_EXPORTS;%(PreprocessorDefinitions); _CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<AdditionalOptions>/wd4996 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>libhl.lib;simd.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;JPG_EXPORTS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<AdditionalOptions>/wd4996 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>../../$(Configuration)/$(TargetName).hdll</OutputFile>
<AdditionalDependencies>libhl.lib;simd.lib</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>LIBCMT</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;JPG_EXPORTS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<AdditionalOptions>/wd4996 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>../../$(Configuration)/$(TargetName).hdll</OutputFile>
<AdditionalDependencies>libhl.lib;simd.lib</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>LIBCMT</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;JPG_EXPORTS;%(PreprocessorDefinitions); _CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<AdditionalOptions>/wd4996 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>libhl.lib;simd.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;JPG_EXPORTS;%(PreprocessorDefinitions); _CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<AdditionalOptions>/wd4996 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>libhl.lib;simd.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,443 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="fmt.c" />
<ClCompile Include="..\..\include\turbojpeg\jaricom.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcapimin.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcapistd.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcarith.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jccoefct.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jccolor.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcdctmgr.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jchuff.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcinit.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcmainct.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcmarker.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcmaster.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcomapi.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcparam.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcphuff.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcprepct.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jcsample.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jctrans.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdapimin.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdapistd.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdarith.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdatadst.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdatadst-tj.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdatasrc.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdatasrc-tj.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdcoefct.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdcolor.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jddctmgr.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdhuff.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdinput.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdmainct.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdmarker.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdmaster.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdmerge.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdphuff.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdpostct.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdsample.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jdtrans.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jerror.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jfdctflt.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jfdctfst.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jfdctint.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jidctflt.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jidctfst.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jidctint.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jidctred.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jmemmgr.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jmemnobs.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jquant1.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jquant2.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jutils.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\transupp.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\jsimd.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\turbojpeg\turbojpeg.c">
<Filter>turbojpeg</Filter>
</ClCompile>
<ClCompile Include="..\..\include\zlib\inflate.c">
<Filter>zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\include\zlib\adler32.c">
<Filter>zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\include\zlib\crc32.c">
<Filter>zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\include\zlib\inffast.c">
<Filter>zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\include\zlib\inftrees.c">
<Filter>zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\include\zlib\zutil.c">
<Filter>zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\include\zlib\deflate.c">
<Filter>zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\include\zlib\trees.c">
<Filter>zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\png.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngerror.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngget.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngmem.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngpread.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngread.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngrio.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngrtran.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngrutil.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngset.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngtrans.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngwio.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngwrite.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngwtran.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\png\pngwutil.c">
<Filter>png</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\bitrate.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\bitwise.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\block.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\codebook.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\envelope.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\floor0.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\floor1.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\framing.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\info.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\lookup.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\lpc.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\lsp.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\mapping0.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\mdct.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\psy.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\registry.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\res0.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\sharedbook.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\smallft.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\synthesis.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\vorbisfile.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="..\..\include\vorbis\window.c">
<Filter>vorbis</Filter>
</ClCompile>
<ClCompile Include="sha1.c" />
<ClCompile Include="mikkt.c" />
<ClCompile Include="..\..\include\mikktspace\mikktspace.c">
<Filter>mikkt</Filter>
</ClCompile>
<ClCompile Include="dxt.c" />
</ItemGroup>
<ItemGroup>
<Filter Include="turbojpeg">
<UniqueIdentifier>{7c911b77-37c7-4ceb-a8ff-e9b3f0c4b21c}</UniqueIdentifier>
</Filter>
<Filter Include="zlib">
<UniqueIdentifier>{cc205701-f7b7-43f9-abac-942df6a44718}</UniqueIdentifier>
</Filter>
<Filter Include="png">
<UniqueIdentifier>{4db0a874-5bbe-47bd-b1ec-e642ab7f5737}</UniqueIdentifier>
</Filter>
<Filter Include="vorbis">
<UniqueIdentifier>{3f330839-1ff8-4160-8d74-6957d97e9e37}</UniqueIdentifier>
</Filter>
<Filter Include="mikkt">
<UniqueIdentifier>{b16da6f5-be29-4433-b595-14badcd2cd06}</UniqueIdentifier>
</Filter>
<Filter Include="minimp3">
<UniqueIdentifier>{1bfe5a7d-6015-497d-936d-1a92e8938ca7}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\include\zlib\zconf.h">
<Filter>zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\include\zlib\zlib.h">
<Filter>zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\include\zlib\inffast.h">
<Filter>zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\include\zlib\inflate.h">
<Filter>zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\include\zlib\inftrees.h">
<Filter>zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\include\zlib\inffixed.h">
<Filter>zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\include\zlib\crc32.h">
<Filter>zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\include\zlib\deflate.h">
<Filter>zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\include\zlib\trees.h">
<Filter>zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\include\png\png.h">
<Filter>png</Filter>
</ClInclude>
<ClInclude Include="..\..\include\png\pngconf.h">
<Filter>png</Filter>
</ClInclude>
<ClInclude Include="..\..\include\png\pngdebug.h">
<Filter>png</Filter>
</ClInclude>
<ClInclude Include="..\..\include\png\pnginfo.h">
<Filter>png</Filter>
</ClInclude>
<ClInclude Include="..\..\include\png\pnglibconf.h">
<Filter>png</Filter>
</ClInclude>
<ClInclude Include="..\..\include\png\pngpriv.h">
<Filter>png</Filter>
</ClInclude>
<ClInclude Include="..\..\include\png\pngstruct.h">
<Filter>png</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\backends.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\bitrate.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\codebook.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\codec_internal.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\envelope.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\highlevel.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\lookup.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\lookup_data.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\lpc.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\lsp.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\masking.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\mdct.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\misc.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\os.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\psy.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\registry.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\scales.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\smallft.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="..\..\include\vorbis\window.h">
<Filter>vorbis</Filter>
</ClInclude>
<ClInclude Include="sha1.h" />
<ClInclude Include="..\..\include\mikktspace\mikktspace.h">
<Filter>mikkt</Filter>
</ClInclude>
<ClInclude Include="..\..\include\minimp3\minimp3.h">
<Filter>minimp3</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -0,0 +1,84 @@
#define HL_NAME(n) fmt_##n
#include <mikktspace.h>
#include <hl.h>
typedef struct {
hl_type *t;
float *buffer;
int stride;
int xpos;
int normalPos;
int uvPos;
float *tangents;
int tangentsStride;
int tangentPos;
int *indexes;
int indices;
} user_info;
typedef const SMikkTSpaceContext Mikkt;
static int get_num_faces( Mikkt *ctx ) {
user_info *i = (user_info*)ctx->m_pUserData;
return i->indices / 3;
}
static int get_num_vertices( Mikkt *ctx, int face ) {
return 3;
}
static void get_position( Mikkt *ctx, float fvPosOut[], const int iFace, const int iVert ) {
user_info *i = (user_info*)ctx->m_pUserData;
int idx = iFace * 3 + iVert;
int v = i->indexes[idx];
int p = v * i->stride + i->xpos;
fvPosOut[0] = i->buffer[p++];
fvPosOut[1] = i->buffer[p++];
fvPosOut[2] = i->buffer[p++];
}
static void get_normal( Mikkt *ctx, float fvPosOut[], const int iFace, const int iVert ) {
user_info *i = (user_info*)ctx->m_pUserData;
int idx = iFace * 3 + iVert;
int v = i->indexes[idx];
int p = v * i->stride + i->normalPos;
fvPosOut[0] = i->buffer[p++];
fvPosOut[1] = i->buffer[p++];
fvPosOut[2] = i->buffer[p++];
}
static void get_tcoord( Mikkt *ctx, float fvPosOut[], const int iFace, const int iVert ) {
user_info *i = (user_info*)ctx->m_pUserData;
int idx = iFace * 3 + iVert;
int v = i->indexes[idx];
int p = v * i->stride + i->uvPos;
fvPosOut[0] = i->buffer[p++];
fvPosOut[1] = i->buffer[p++];
}
static void set_tangent( Mikkt *ctx, const float fvTangent[], const float fSign, const int iFace, const int iVert ) {
user_info *i = (user_info*)ctx->m_pUserData;
int idx = iFace * 3 + iVert;
int p = idx * i->tangentsStride + i->tangentPos;
i->tangents[p++] = fvTangent[0];
i->tangents[p++] = fvTangent[1];
i->tangents[p++] = fvTangent[2];
i->tangents[p++] = fSign;
}
HL_PRIM bool HL_NAME(compute_mikkt_tangents)( user_info *inf, double threshold ) {
SMikkTSpaceContext ctx;
SMikkTSpaceInterface intf;
intf.m_getNumFaces = get_num_faces;
intf.m_getNumVerticesOfFace = get_num_vertices;
intf.m_getPosition = get_position;
intf.m_getNormal = get_normal;
intf.m_getTexCoord = get_tcoord;
intf.m_setTSpaceBasic = set_tangent;
intf.m_setTSpace = NULL;
ctx.m_pInterface = &intf;
ctx.m_pUserData = inf;
return genTangSpace(&ctx, (float)threshold);
}
DEFINE_PRIM(_BOOL, compute_mikkt_tangents, _DYN _F64);

View File

@ -0,0 +1,128 @@
/*
* Copyright (C)2005-2016 Haxe Foundation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include <hl.h>
#include "sha1.h"
#include <stdio.h>
#include <string.h>
// original code by Steve Reid
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
#ifdef HL_BIG_ENDIAN
# define blk0(i) block[i]
#else
# define blk0(i) (block[i] = (rol(block[i],24)&0xFF00FF00) \
|(rol(block[i],8)&0x00FF00FF))
#endif
#define blk(i) (block[i&15] = rol(block[(i+13)&15]^block[(i+8)&15] \
^block[(i+2)&15]^block[i&15],1))
/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
static void sha1_transform( unsigned int state[5], unsigned char buffer[64] ) {
unsigned int a, b, c, d, e;
unsigned int block[16];
memcpy(block, buffer, 64);
/* Copy context->state[] to working vars */
a = state[0];
b = state[1];
c = state[2];
d = state[3];
e = state[4];
/* 4 rounds of 20 operations each. Loop unrolled. */
R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
/* Add the working vars back into context.state[] */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
state[4] += e;
}
void sha1_init( SHA1_CTX *context ) {
/* SHA1 initialization constants */
context->state[0] = 0x67452301;
context->state[1] = 0xEFCDAB89;
context->state[2] = 0x98BADCFE;
context->state[3] = 0x10325476;
context->state[4] = 0xC3D2E1F0;
context->count[0] = context->count[1] = 0;
}
void sha1_update( SHA1_CTX *context, const unsigned char *data, unsigned int len ) {
unsigned int i, j;
j = (context->count[0] >> 3) & 63;
if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++;
context->count[1] += (len >> 29);
if ((j + len) > 63) {
memcpy(&context->buffer[j], data, (i = 64-j));
sha1_transform(context->state, context->buffer);
for ( ; i + 63 < len; i += 64 )
sha1_transform(context->state, (unsigned char *)&data[i]);
j = 0;
} else
i = 0;
memcpy(&context->buffer[j], &data[i], len - i);
}
void sha1_final( SHA1_CTX *context, unsigned char digest[SHA1_SIZE] ) {
unsigned int i;
unsigned char finalcount[8];
for (i = 0; i < 8; i++) {
finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
>> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
}
sha1_update(context, (unsigned char *)"\200", 1);
while ((context->count[0] & 504) != 448) {
sha1_update(context, (unsigned char *)"\0", 1);
}
sha1_update(context, finalcount, 8);
for (i = 0; i < SHA1_SIZE; i++) {
digest[i] = (unsigned char)
((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
}
sha1_transform(context->state, context->buffer);
}

View File

@ -0,0 +1,40 @@
/*
* Copyright (C)2005-2016 Haxe Foundation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SHA1_H
#define SHA1_H
#define SHA1_SIZE 20
typedef unsigned char SHA1_DIGEST[SHA1_SIZE];
typedef struct {
unsigned int state[5];
unsigned int count[2];
unsigned char buffer[64];
} SHA1_CTX;
void sha1_init( SHA1_CTX *c );
void sha1_update( SHA1_CTX *c, const unsigned char *data, unsigned int len );
void sha1_final( SHA1_CTX *c, SHA1_DIGEST digest );
#endif
/* ************************************************************************ */

View File

@ -0,0 +1,108 @@
if (WIN32)
set(MBEDTLS_INCLUDE_DIRS ${INCLUDES_BASE_DIR}/mbedtls/include)
set(MBEDTLS_LIBRARIES crypt32)
add_library(ssl.hdll SHARED
${INCLUDES_BASE_DIR}/mbedtls/library/aes.c
${INCLUDES_BASE_DIR}/mbedtls/library/aesni.c
${INCLUDES_BASE_DIR}/mbedtls/library/arc4.c
${INCLUDES_BASE_DIR}/mbedtls/library/asn1parse.c
${INCLUDES_BASE_DIR}/mbedtls/library/asn1write.c
${INCLUDES_BASE_DIR}/mbedtls/library/base64.c
${INCLUDES_BASE_DIR}/mbedtls/library/bignum.c
${INCLUDES_BASE_DIR}/mbedtls/library/blowfish.c
${INCLUDES_BASE_DIR}/mbedtls/library/camellia.c
${INCLUDES_BASE_DIR}/mbedtls/library/ccm.c
${INCLUDES_BASE_DIR}/mbedtls/library/certs.c
${INCLUDES_BASE_DIR}/mbedtls/library/cipher.c
${INCLUDES_BASE_DIR}/mbedtls/library/cipher_wrap.c
${INCLUDES_BASE_DIR}/mbedtls/library/ctr_drbg.c
${INCLUDES_BASE_DIR}/mbedtls/library/debug.c
${INCLUDES_BASE_DIR}/mbedtls/library/des.c
${INCLUDES_BASE_DIR}/mbedtls/library/dhm.c
${INCLUDES_BASE_DIR}/mbedtls/library/ecdh.c
${INCLUDES_BASE_DIR}/mbedtls/library/ecdsa.c
${INCLUDES_BASE_DIR}/mbedtls/library/ecjpake.c
${INCLUDES_BASE_DIR}/mbedtls/library/ecp.c
${INCLUDES_BASE_DIR}/mbedtls/library/ecp_curves.c
${INCLUDES_BASE_DIR}/mbedtls/library/entropy.c
${INCLUDES_BASE_DIR}/mbedtls/library/entropy_poll.c
${INCLUDES_BASE_DIR}/mbedtls/library/error.c
${INCLUDES_BASE_DIR}/mbedtls/library/gcm.c
${INCLUDES_BASE_DIR}/mbedtls/library/havege.c
${INCLUDES_BASE_DIR}/mbedtls/library/hmac_drbg.c
${INCLUDES_BASE_DIR}/mbedtls/library/md.c
${INCLUDES_BASE_DIR}/mbedtls/library/md2.c
${INCLUDES_BASE_DIR}/mbedtls/library/md4.c
${INCLUDES_BASE_DIR}/mbedtls/library/md5.c
${INCLUDES_BASE_DIR}/mbedtls/library/md_wrap.c
${INCLUDES_BASE_DIR}/mbedtls/library/memory_buffer_alloc.c
${INCLUDES_BASE_DIR}/mbedtls/library/oid.c
${INCLUDES_BASE_DIR}/mbedtls/library/padlock.c
${INCLUDES_BASE_DIR}/mbedtls/library/pem.c
${INCLUDES_BASE_DIR}/mbedtls/library/pk.c
${INCLUDES_BASE_DIR}/mbedtls/library/pkcs11.c
${INCLUDES_BASE_DIR}/mbedtls/library/pkcs12.c
${INCLUDES_BASE_DIR}/mbedtls/library/pkcs5.c
${INCLUDES_BASE_DIR}/mbedtls/library/pkparse.c
${INCLUDES_BASE_DIR}/mbedtls/library/pkwrite.c
${INCLUDES_BASE_DIR}/mbedtls/library/pk_wrap.c
${INCLUDES_BASE_DIR}/mbedtls/library/platform.c
${INCLUDES_BASE_DIR}/mbedtls/library/ripemd160.c
${INCLUDES_BASE_DIR}/mbedtls/library/rsa.c
${INCLUDES_BASE_DIR}/mbedtls/library/rsa_internal.c
${INCLUDES_BASE_DIR}/mbedtls/library/sha1.c
${INCLUDES_BASE_DIR}/mbedtls/library/sha256.c
${INCLUDES_BASE_DIR}/mbedtls/library/sha512.c
${INCLUDES_BASE_DIR}/mbedtls/library/ssl_cache.c
${INCLUDES_BASE_DIR}/mbedtls/library/ssl_ciphersuites.c
${INCLUDES_BASE_DIR}/mbedtls/library/ssl_cli.c
${INCLUDES_BASE_DIR}/mbedtls/library/ssl_cookie.c
${INCLUDES_BASE_DIR}/mbedtls/library/ssl_srv.c
${INCLUDES_BASE_DIR}/mbedtls/library/ssl_ticket.c
${INCLUDES_BASE_DIR}/mbedtls/library/ssl_tls.c
${INCLUDES_BASE_DIR}/mbedtls/library/threading.c
${INCLUDES_BASE_DIR}/mbedtls/library/timing.c
${INCLUDES_BASE_DIR}/mbedtls/library/version.c
${INCLUDES_BASE_DIR}/mbedtls/library/version_features.c
${INCLUDES_BASE_DIR}/mbedtls/library/x509.c
${INCLUDES_BASE_DIR}/mbedtls/library/x509write_crt.c
${INCLUDES_BASE_DIR}/mbedtls/library/x509write_csr.c
${INCLUDES_BASE_DIR}/mbedtls/library/x509_create.c
${INCLUDES_BASE_DIR}/mbedtls/library/x509_crl.c
${INCLUDES_BASE_DIR}/mbedtls/library/x509_crt.c
${INCLUDES_BASE_DIR}/mbedtls/library/x509_csr.c
${INCLUDES_BASE_DIR}/mbedtls/library/xtea.c
ssl.c
)
else()
find_package(MbedTLS REQUIRED)
add_library(ssl.hdll SHARED
ssl.c
)
endif()
set_as_hdll(ssl)
target_include_directories(ssl.hdll
PRIVATE
${MBEDTLS_INCLUDE_DIRS}
)
target_link_libraries(ssl.hdll
libhl
${MBEDTLS_LIBRARIES}
)
if(APPLE)
find_library(SECURITY_LIBRARY Security REQUIRED)
find_library(COREFOUNDATION_LIBRARY CoreFoundation REQUIRED)
target_link_libraries(ssl.hdll ${COREFOUNDATION_LIBRARY} ${SECURITY_LIBRARY})
endif()
install(
TARGETS
ssl.hdll
DESTINATION ${HDLL_DESTINATION}
)

View File

@ -0,0 +1,763 @@
#define HL_NAME(n) ssl_##n
#define _WINSOCKAPI_
#include <hl.h>
#ifdef HL_WIN
#include <winsock2.h>
#include <wincrypt.h>
#else
#include <sys/socket.h>
#include <strings.h>
#include <errno.h>
typedef int SOCKET;
#endif
#include <stdio.h>
#include <string.h>
#ifdef HL_MAC
#include <Security/Security.h>
#endif
#define SOCKET_ERROR (-1)
#define NRETRYS 20
#include "mbedtls/platform.h"
#include "mbedtls/error.h"
#include "mbedtls/entropy.h"
#include "mbedtls/ctr_drbg.h"
#include "mbedtls/md.h"
#include "mbedtls/pk.h"
#include "mbedtls/oid.h"
#include "mbedtls/x509_crt.h"
#include "mbedtls/ssl.h"
#ifdef HL_CONSOLE
mbedtls_x509_crt *hl_init_cert_chain();
#endif
#if defined(HL_WIN) || defined(HL_MAC) || defined(HL_IOS) || defined(HL_TVOS)
# define MSG_NOSIGNAL 0
#endif
// Duplicate from socket.c
typedef struct _hl_socket {
SOCKET sock;
} hl_socket;
typedef struct _hl_ssl_cert hl_ssl_cert;
struct _hl_ssl_cert {
void(*finalize)(hl_ssl_cert *);
mbedtls_x509_crt *c;
};
typedef struct _hl_ssl_pkey hl_ssl_pkey;
struct _hl_ssl_pkey {
void(*finalize)(hl_ssl_pkey *);
mbedtls_pk_context *k;
};
#define _SOCK _ABSTRACT(hl_socket)
#define TSSL _ABSTRACT(mbedtls_ssl_context)
#define TCONF _ABSTRACT(mbedtls_ssl_config)
#define TCERT _ABSTRACT(hl_ssl_cert)
#define TPKEY _ABSTRACT(hl_ssl_pkey)
static bool ssl_init_done = false;
static mbedtls_entropy_context entropy;
static mbedtls_ctr_drbg_context ctr_drbg;
static bool is_ssl_blocking( int r ) {
return r == MBEDTLS_ERR_SSL_WANT_READ || r == MBEDTLS_ERR_SSL_WANT_WRITE;
}
static int ssl_block_error( int r ) {
return is_ssl_blocking(r) ? -1 : -2;
}
static void cert_finalize(hl_ssl_cert *c) {
mbedtls_x509_crt_free(c->c);
free(c->c);
c->c = NULL;
}
static void pkey_finalize(hl_ssl_pkey *k) {
mbedtls_pk_free(k->k);
free(k->k);
k->k = NULL;
}
static int ssl_error(int ret) {
char buf[128];
uchar buf16[128];
mbedtls_strerror(ret, buf, sizeof(buf));
hl_from_utf8(buf16, (int)strlen(buf), buf);
hl_error("%s",buf16);
return ret;
}
HL_PRIM mbedtls_ssl_context *HL_NAME(ssl_new)(mbedtls_ssl_config *config) {
int ret;
mbedtls_ssl_context *ssl;
ssl = (mbedtls_ssl_context *)hl_gc_alloc_noptr(sizeof(mbedtls_ssl_context));
mbedtls_ssl_init(ssl);
if ((ret = mbedtls_ssl_setup(ssl, config)) != 0) {
mbedtls_ssl_free(ssl);
ssl_error(ret);
return NULL;
}
return ssl;
}
HL_PRIM void HL_NAME(ssl_close)(mbedtls_ssl_context *ssl) {
mbedtls_ssl_free(ssl);
}
HL_PRIM int HL_NAME(ssl_handshake)(mbedtls_ssl_context *ssl) {
int r;
r = mbedtls_ssl_handshake(ssl);
if( is_ssl_blocking(r) )
return -1;
if( r == MBEDTLS_ERR_SSL_CONN_EOF )
return -2;
if( r != 0 )
return ssl_error(r);
return 0;
}
static bool is_block_error() {
#ifdef HL_WIN
int err = WSAGetLastError();
if (err == WSAEWOULDBLOCK || err == WSAEALREADY || err == WSAETIMEDOUT)
#else
if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINPROGRESS || errno == EALREADY)
#endif
return true;
return false;
}
static int net_read(void *fd, unsigned char *buf, size_t len) {
int r = recv((SOCKET)(int_val)fd, (char *)buf, (int)len, MSG_NOSIGNAL);
if( r == SOCKET_ERROR && is_block_error() )
return MBEDTLS_ERR_SSL_WANT_READ;
return r;
}
static int net_write(void *fd, const unsigned char *buf, size_t len) {
int r = send((SOCKET)(int_val)fd, (char *)buf, (int)len, MSG_NOSIGNAL);
if( r == SOCKET_ERROR && is_block_error() )
return MBEDTLS_ERR_SSL_WANT_WRITE;
return r;
}
HL_PRIM void HL_NAME(ssl_set_socket)(mbedtls_ssl_context *ssl, hl_socket *socket) {
mbedtls_ssl_set_bio(ssl, (void*)(int_val)socket->sock, net_write, net_read, NULL);
}
static int arr_read( void *arr, unsigned char *buf, size_t len ) {
int r = ((int (*)(vdynamic*,unsigned char*,int))hl_aptr(arr,vclosure*)[1]->fun)( hl_aptr(arr,vdynamic*)[0], buf, (int)len );
if( r == -2 ) return MBEDTLS_ERR_SSL_WANT_READ;
return r;
}
static int arr_write( void *arr, const unsigned char *buf, size_t len ) {
int r = ((int (*)(vdynamic*,const unsigned char*,int))hl_aptr(arr,vclosure*)[2]->fun)( hl_aptr(arr,vdynamic*)[0], buf, (int)len );
if( r == -2 ) return MBEDTLS_ERR_SSL_WANT_WRITE;
return r;
}
HL_PRIM void HL_NAME(ssl_set_bio)( mbedtls_ssl_context *ssl, varray *ctx ) {
mbedtls_ssl_set_bio(ssl, ctx, arr_write, arr_read, NULL);
}
HL_PRIM void HL_NAME(ssl_set_hostname)(mbedtls_ssl_context *ssl, vbyte *hostname) {
int ret;
if ((ret = mbedtls_ssl_set_hostname(ssl, (char*)hostname)) != 0)
ssl_error(ret);
}
HL_PRIM hl_ssl_cert *HL_NAME(ssl_get_peer_certificate)(mbedtls_ssl_context *ssl) {
hl_ssl_cert *cert = (hl_ssl_cert*)hl_gc_alloc_noptr(sizeof(hl_ssl_cert));
cert->c = (mbedtls_x509_crt*)mbedtls_ssl_get_peer_cert(ssl);
return cert;
}
DEFINE_PRIM(TSSL, ssl_new, TCONF);
DEFINE_PRIM(_VOID, ssl_close, TSSL);
DEFINE_PRIM(_I32, ssl_handshake, TSSL);
DEFINE_PRIM(_VOID, ssl_set_bio, TSSL _DYN);
DEFINE_PRIM(_VOID, ssl_set_socket, TSSL _SOCK);
DEFINE_PRIM(_VOID, ssl_set_hostname, TSSL _BYTES);
DEFINE_PRIM(TCERT, ssl_get_peer_certificate, TSSL);
HL_PRIM int HL_NAME(ssl_send_char)(mbedtls_ssl_context *ssl, int c) {
unsigned char cc;
int r;
cc = (unsigned char)c;
r = mbedtls_ssl_write(ssl, &cc, 1);
if( r < 0 )
return ssl_block_error(r);
return 1;
}
HL_PRIM int HL_NAME(ssl_send)(mbedtls_ssl_context *ssl, vbyte *buf, int pos, int len) {
int r = mbedtls_ssl_write(ssl, (const unsigned char *)buf + pos, len);
if( r < 0 )
return ssl_block_error(r);
return r;
}
HL_PRIM int HL_NAME(ssl_recv_char)(mbedtls_ssl_context *ssl) {
unsigned char c;
int ret = mbedtls_ssl_read(ssl, &c, 1);
if( ret != 1 )
return ssl_block_error(ret);
return c;
}
HL_PRIM int HL_NAME(ssl_recv)(mbedtls_ssl_context *ssl, vbyte *buf, int pos, int len) {
int ret = mbedtls_ssl_read(ssl, (unsigned char*)buf+pos, len);
if( ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY )
return 0;
if( ret < 0 )
return ssl_block_error(ret);
return ret;
}
DEFINE_PRIM(_I32, ssl_send_char, TSSL _I32);
DEFINE_PRIM(_I32, ssl_send, TSSL _BYTES _I32 _I32);
DEFINE_PRIM(_I32, ssl_recv_char, TSSL);
DEFINE_PRIM(_I32, ssl_recv, TSSL _BYTES _I32 _I32);
HL_PRIM mbedtls_ssl_config *HL_NAME(conf_new)(bool server) {
int ret;
mbedtls_ssl_config *conf;
conf = (mbedtls_ssl_config *)hl_gc_alloc_noptr(sizeof(mbedtls_ssl_config));
mbedtls_ssl_config_init(conf);
if ((ret = mbedtls_ssl_config_defaults(conf, server ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT,
MBEDTLS_SSL_TRANSPORT_STREAM, 0)) != 0) {
mbedtls_ssl_config_free(conf);
ssl_error(ret);
return NULL;
}
mbedtls_ssl_conf_rng(conf, mbedtls_ctr_drbg_random, &ctr_drbg);
return conf;
}
HL_PRIM void HL_NAME(conf_close)(mbedtls_ssl_config *conf) {
mbedtls_ssl_config_free(conf);
}
HL_PRIM void HL_NAME(conf_set_ca)(mbedtls_ssl_config *conf, hl_ssl_cert *cert) {
mbedtls_ssl_conf_ca_chain(conf, cert->c, NULL);
}
HL_PRIM void HL_NAME(conf_set_verify)(mbedtls_ssl_config *conf, int mode) {
if (mode == 2)
mbedtls_ssl_conf_authmode(conf, MBEDTLS_SSL_VERIFY_OPTIONAL);
else if (mode == 1)
mbedtls_ssl_conf_authmode(conf, MBEDTLS_SSL_VERIFY_REQUIRED);
else
mbedtls_ssl_conf_authmode(conf, MBEDTLS_SSL_VERIFY_NONE);
}
HL_PRIM void HL_NAME(conf_set_cert)(mbedtls_ssl_config *conf, hl_ssl_cert *cert, hl_ssl_pkey *key) {
int r;
if ((r = mbedtls_ssl_conf_own_cert(conf, cert->c, key->k)) != 0)
ssl_error(r);
}
typedef struct {
hl_type *t;
hl_ssl_cert *cert;
hl_ssl_pkey *key;
} sni_callb_ret;
static int sni_callback(void *arg, mbedtls_ssl_context *ctx, const unsigned char *name, size_t len) {
if (name && arg) {
vclosure *c = (vclosure*)arg;
sni_callb_ret *ret;
if( c->hasValue )
ret = ((sni_callb_ret*(*)(void*, vbyte*))c->fun)(c->value, (vbyte*)name);
else
ret = ((sni_callb_ret*(*)(vbyte*))c->fun)((vbyte*)name);
if (ret && ret->cert && ret->key) {
return mbedtls_ssl_set_hs_own_cert(ctx, ret->cert->c, ret->key->k);
}
}
return -1;
}
HL_PRIM void HL_NAME(conf_set_servername_callback)(mbedtls_ssl_config *conf, vclosure *cb) {
mbedtls_ssl_conf_sni(conf, sni_callback, (void *)cb);
}
DEFINE_PRIM(TCONF, conf_new, _BOOL);
DEFINE_PRIM(_VOID, conf_close, TCONF);
DEFINE_PRIM(_VOID, conf_set_ca, TCONF TCERT);
DEFINE_PRIM(_VOID, conf_set_verify, TCONF _I32);
DEFINE_PRIM(_VOID, conf_set_cert, TCONF TCERT TPKEY);
DEFINE_PRIM(_VOID, conf_set_servername_callback, TCONF _FUN(_OBJ(TCERT TPKEY), _BYTES));
HL_PRIM hl_ssl_cert *HL_NAME(cert_load_file)(vbyte *file) {
#ifdef HL_CONSOLE
return NULL;
#else
int r;
hl_ssl_cert *cert;
mbedtls_x509_crt *x = (mbedtls_x509_crt*)malloc(sizeof(mbedtls_x509_crt));
mbedtls_x509_crt_init(x);
if ((r = mbedtls_x509_crt_parse_file(x, (char*)file)) != 0) {
mbedtls_x509_crt_free(x);
free(x);
ssl_error(r);
return NULL;
}
cert = (hl_ssl_cert*)hl_gc_alloc_finalizer(sizeof(hl_ssl_cert));
cert->c = x;
cert->finalize = cert_finalize;
return cert;
#endif
}
HL_PRIM hl_ssl_cert *HL_NAME(cert_load_path)(vbyte *path) {
#ifdef HL_CONSOLE
return NULL;
#else
int r;
hl_ssl_cert *cert;
mbedtls_x509_crt *x = (mbedtls_x509_crt*)malloc(sizeof(mbedtls_x509_crt));
mbedtls_x509_crt_init(x);
if ((r = mbedtls_x509_crt_parse_path(x, (char*)path)) != 0) {
mbedtls_x509_crt_free(x);
free(x);
ssl_error(r);
return NULL;
}
cert = (hl_ssl_cert*)hl_gc_alloc_finalizer(sizeof(hl_ssl_cert));
cert->c = x;
cert->finalize = cert_finalize;
return cert;
#endif
}
HL_PRIM hl_ssl_cert *HL_NAME(cert_load_defaults)() {
hl_ssl_cert *v = NULL;
mbedtls_x509_crt *chain = NULL;
#if defined(HL_WIN)
HCERTSTORE store;
PCCERT_CONTEXT cert;
if (store = CertOpenSystemStore(0, (LPCWSTR)L"Root")) {
cert = NULL;
while (cert = CertEnumCertificatesInStore(store, cert)) {
if (chain == NULL) {
chain = (mbedtls_x509_crt*)malloc(sizeof(mbedtls_x509_crt));
mbedtls_x509_crt_init(chain);
}
mbedtls_x509_crt_parse_der(chain, (unsigned char *)cert->pbCertEncoded, cert->cbCertEncoded);
}
CertCloseStore(store, 0);
}
#elif defined(HL_MAC)
CFMutableDictionaryRef search;
CFArrayRef result;
SecKeychainRef keychain;
SecCertificateRef item;
CFDataRef dat;
// Load keychain
if (SecKeychainOpen("/System/Library/Keychains/SystemRootCertificates.keychain", &keychain) != errSecSuccess)
return NULL;
// Search for certificates
search = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
CFDictionarySetValue(search, kSecClass, kSecClassCertificate);
CFDictionarySetValue(search, kSecMatchLimit, kSecMatchLimitAll);
CFDictionarySetValue(search, kSecReturnRef, kCFBooleanTrue);
CFDictionarySetValue(search, kSecMatchSearchList, CFArrayCreate(NULL, (const void **)&keychain, 1, NULL));
if (SecItemCopyMatching(search, (CFTypeRef *)&result) == errSecSuccess) {
CFIndex n = CFArrayGetCount(result);
for (CFIndex i = 0; i < n; i++) {
item = (SecCertificateRef)CFArrayGetValueAtIndex(result, i);
// Get certificate in DER format
dat = SecCertificateCopyData(item);
if (dat) {
if (chain == NULL) {
chain = (mbedtls_x509_crt*)malloc(sizeof(mbedtls_x509_crt));
mbedtls_x509_crt_init(chain);
}
mbedtls_x509_crt_parse_der(chain, (unsigned char *)CFDataGetBytePtr(dat), CFDataGetLength(dat));
CFRelease(dat);
}
}
}
CFRelease(keychain);
#elif defined(HL_CONSOLE)
chain = hl_init_cert_chain();
#endif
if (chain != NULL) {
v = (hl_ssl_cert*)hl_gc_alloc_finalizer(sizeof(hl_ssl_cert));
v->c = chain;
v->finalize = cert_finalize;
}
return v;
}
static vbyte *asn1_buf_to_string(mbedtls_asn1_buf *dat) {
unsigned int i, c;
hl_buffer *buf = hl_alloc_buffer();
for (i = 0; i < dat->len; i++) {
c = dat->p[i];
if (c < 32 || c == 127 || (c > 128 && c < 160))
hl_buffer_char(buf, '?');
else
hl_buffer_char(buf, c);
}
return (vbyte*)hl_buffer_content(buf,NULL);
}
HL_PRIM vbyte *HL_NAME(cert_get_subject)(hl_ssl_cert *cert, vbyte *objname) {
mbedtls_x509_name *obj;
int r;
const char *oname, *rname;
obj = &cert->c->subject;
if (obj == NULL)
hl_error("Invalid subject");
rname = (char*)objname;
while (obj != NULL) {
r = mbedtls_oid_get_attr_short_name(&obj->oid, &oname);
if (r == 0 && strcmp(oname, rname) == 0)
return asn1_buf_to_string(&obj->val);
obj = obj->next;
}
return NULL;
}
HL_PRIM vbyte *HL_NAME(cert_get_issuer)(hl_ssl_cert *cert, vbyte *objname) {
mbedtls_x509_name *obj;
int r;
const char *oname, *rname;
obj = &cert->c->issuer;
if (obj == NULL)
hl_error("Invalid issuer");
rname = (char*)objname;
while (obj != NULL) {
r = mbedtls_oid_get_attr_short_name(&obj->oid, &oname);
if (r == 0 && strcmp(oname, rname) == 0)
return asn1_buf_to_string(&obj->val);
obj = obj->next;
}
return NULL;
}
HL_PRIM varray *HL_NAME(cert_get_altnames)(hl_ssl_cert *cert) {
mbedtls_asn1_sequence *cur;
int count = 0;
int pos = 0;
varray *a = NULL;
vbyte **current = NULL;
mbedtls_x509_crt *crt = cert->c;
if (crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME) {
cur = &crt->subject_alt_names;
while (cur != NULL) {
if (pos == count) {
int ncount = count == 0 ? 16 : count * 2;
varray *narr = hl_alloc_array(&hlt_bytes, ncount);
vbyte **ncur = hl_aptr(narr, vbyte*);
memcpy(ncur, current, count * sizeof(void*));
current = ncur;
a = narr;
count = ncount;
}
current[pos++] = asn1_buf_to_string(&cur->buf);
cur = cur->next;
}
}
if (a == NULL) a = hl_alloc_array(&hlt_bytes, 0);
a->size = pos;
return a;
}
static varray *x509_time_to_array(mbedtls_x509_time *t) {
varray *a = NULL;
int *p;
if (!t)
hl_error("Invalid x509 time");
a = hl_alloc_array(&hlt_i32, 6);
p = hl_aptr(a, int);
p[0] = t->year;
p[1] = t->mon;
p[2] = t->day;
p[3] = t->hour;
p[4] = t->min;
p[5] = t->sec;
return a;
}
HL_PRIM varray *HL_NAME(cert_get_notbefore)(hl_ssl_cert *cert) {
return x509_time_to_array(&cert->c->valid_from);
}
HL_PRIM varray *HL_NAME(cert_get_notafter)(hl_ssl_cert *cert) {
return x509_time_to_array(&cert->c->valid_to);
}
HL_PRIM hl_ssl_cert *HL_NAME(cert_get_next)(hl_ssl_cert *cert) {
hl_ssl_cert *ncert;
if (cert->c->next == NULL)
return NULL;
ncert = (hl_ssl_cert*)hl_gc_alloc_noptr(sizeof(hl_ssl_cert));
ncert->c = cert->c->next;
return ncert;
}
HL_PRIM hl_ssl_cert *HL_NAME(cert_add_pem)(hl_ssl_cert *cert, vbyte *data) {
mbedtls_x509_crt *crt;
int r, len;
unsigned char *buf;
if (cert != NULL)
crt = cert->c;
else{
crt = (mbedtls_x509_crt*)malloc(sizeof(mbedtls_x509_crt));
mbedtls_x509_crt_init(crt);
}
len = (int)strlen((char*)data) + 1;
buf = (unsigned char *)malloc(len);
memcpy(buf, (char*)data, len - 1);
buf[len - 1] = '\0';
r = mbedtls_x509_crt_parse(crt, buf, len);
free(buf);
if (r < 0) {
if (cert == NULL) {
mbedtls_x509_crt_free(crt);
free(crt);
}
ssl_error(r);
return NULL;
}
if (cert == NULL) {
cert = (hl_ssl_cert*)hl_gc_alloc_finalizer(sizeof(hl_ssl_cert));
cert->c = crt;
cert->finalize = cert_finalize;
}
return cert;
}
HL_PRIM hl_ssl_cert *HL_NAME(cert_add_der)(hl_ssl_cert *cert, vbyte *data, int len) {
mbedtls_x509_crt *crt;
int r;
if (cert != NULL)
crt = cert->c;
else {
crt = (mbedtls_x509_crt*)malloc(sizeof(mbedtls_x509_crt));
mbedtls_x509_crt_init(crt);
}
if ((r = mbedtls_x509_crt_parse_der(crt, (const unsigned char*)data, len)) < 0) {
if (cert == NULL) {
mbedtls_x509_crt_free(crt);
free(crt);
}
ssl_error(r);
return NULL;
}
if (cert == NULL) {
cert = (hl_ssl_cert*)hl_gc_alloc_finalizer(sizeof(hl_ssl_cert));
cert->c = crt;
cert->finalize = cert_finalize;
}
return cert;
}
DEFINE_PRIM(TCERT, cert_load_defaults, _NO_ARG);
DEFINE_PRIM(TCERT, cert_load_file, _BYTES);
DEFINE_PRIM(TCERT, cert_load_path, _BYTES);
DEFINE_PRIM(_BYTES, cert_get_subject, TCERT _BYTES);
DEFINE_PRIM(_BYTES, cert_get_issuer, TCERT _BYTES);
DEFINE_PRIM(_ARR, cert_get_altnames, TCERT);
DEFINE_PRIM(_ARR, cert_get_notbefore, TCERT);
DEFINE_PRIM(_ARR, cert_get_notafter, TCERT);
DEFINE_PRIM(TCERT, cert_get_next, TCERT);
DEFINE_PRIM(TCERT, cert_add_pem, TCERT _BYTES);
DEFINE_PRIM(TCERT, cert_add_der, TCERT _BYTES _I32);
HL_PRIM hl_ssl_pkey *HL_NAME(key_from_der)(vbyte *data, int len, bool pub) {
int r;
hl_ssl_pkey *key;
mbedtls_pk_context *pk = (mbedtls_pk_context *)malloc(sizeof(mbedtls_pk_context));
mbedtls_pk_init(pk);
if (pub)
r = mbedtls_pk_parse_public_key(pk, (const unsigned char*)data, len);
else
r = mbedtls_pk_parse_key(pk, (const unsigned char*)data, len, NULL, 0);
if (r != 0) {
mbedtls_pk_free(pk);
free(pk);
ssl_error(r);
return NULL;
}
key = (hl_ssl_pkey*)hl_gc_alloc_finalizer(sizeof(hl_ssl_pkey));
key->k = pk;
key->finalize = pkey_finalize;
return key;
}
HL_PRIM hl_ssl_pkey *HL_NAME(key_from_pem)(vbyte *data, bool pub, vbyte *pass) {
int r, len;
hl_ssl_pkey *key;
unsigned char *buf;
mbedtls_pk_context *pk = (mbedtls_pk_context *)malloc(sizeof(mbedtls_pk_context));
mbedtls_pk_init(pk);
len = (int)strlen((char*)data) + 1;
buf = (unsigned char *)malloc(len);
memcpy(buf, (char*)data, len - 1);
buf[len - 1] = '\0';
if (pub)
r = mbedtls_pk_parse_public_key(pk, buf, len);
else if (pass == NULL)
r = mbedtls_pk_parse_key(pk, buf, len, NULL, 0);
else
r = mbedtls_pk_parse_key(pk, buf, len, (const unsigned char*)pass, strlen((char*)pass));
free(buf);
if (r != 0) {
mbedtls_pk_free(pk);
free(pk);
ssl_error(r);
return NULL;
}
key = (hl_ssl_pkey*)hl_gc_alloc_finalizer(sizeof(hl_ssl_pkey));
key->k = pk;
key->finalize = pkey_finalize;
return key;
}
DEFINE_PRIM(TPKEY, key_from_der, _BYTES _I32 _BOOL);
DEFINE_PRIM(TPKEY, key_from_pem, _BYTES _BOOL _BYTES);
HL_PRIM vbyte *HL_NAME(dgst_make)(vbyte *data, int len, vbyte *alg, int *size) {
const mbedtls_md_info_t *md;
int mdlen, r = -1;
vbyte *out;
md = mbedtls_md_info_from_string((char*)alg);
if (md == NULL) {
hl_error("Invalid hash algorithm");
return NULL;
}
mdlen = mbedtls_md_get_size(md);
*size = mdlen;
out = hl_gc_alloc_noptr(mdlen);
if ((r = mbedtls_md(md, (const unsigned char *)data, len, out)) != 0){
ssl_error(r);
return NULL;
}
return out;
}
HL_PRIM vbyte *HL_NAME(dgst_sign)(vbyte *data, int len, hl_ssl_pkey *key, vbyte *alg, int *size) {
const mbedtls_md_info_t *md;
int r = -1;
vbyte *out;
unsigned char hash[MBEDTLS_MD_MAX_SIZE];
size_t ssize = size ? *size : 0;
md = mbedtls_md_info_from_string((char*)alg);
if (md == NULL) {
hl_error("Invalid hash algorithm");
return NULL;
}
if ((r = mbedtls_md(md, (unsigned char *)data, len, hash)) != 0){
ssl_error(r);
return NULL;
}
out = hl_gc_alloc_noptr(MBEDTLS_MPI_MAX_SIZE);
if ((r = mbedtls_pk_sign(key->k, mbedtls_md_get_type(md), hash, 0, out, (size ? &ssize : NULL), mbedtls_ctr_drbg_random, &ctr_drbg)) != 0){
ssl_error(r);
return NULL;
}
if( size ) *size = (int)ssize;
return out;
}
HL_PRIM bool HL_NAME(dgst_verify)(vbyte *data, int dlen, vbyte *sign, int slen, hl_ssl_pkey *key, vbyte *alg) {
const mbedtls_md_info_t *md;
int r = -1;
unsigned char hash[MBEDTLS_MD_MAX_SIZE];
md = mbedtls_md_info_from_string((char*)alg);
if (md == NULL) {
hl_error("Invalid hash algorithm");
return false;
}
if ((r = mbedtls_md(md, (const unsigned char *)data, dlen, hash)) != 0)
return ssl_error(r);
if ((r = mbedtls_pk_verify(key->k, mbedtls_md_get_type(md), hash, 0, (unsigned char *)sign, slen)) != 0)
return false;
return true;
}
DEFINE_PRIM(_BYTES, dgst_make, _BYTES _I32 _BYTES _REF(_I32));
DEFINE_PRIM(_BYTES, dgst_sign, _BYTES _I32 TPKEY _BYTES _REF(_I32));
DEFINE_PRIM(_BOOL, dgst_verify, _BYTES _I32 _BYTES _I32 TPKEY _BYTES);
#if _MSC_VER
static void threading_mutex_init_alt(mbedtls_threading_mutex_t *mutex) {
if (mutex == NULL)
return;
InitializeCriticalSection(&mutex->cs);
mutex->is_valid = 1;
}
static void threading_mutex_free_alt(mbedtls_threading_mutex_t *mutex) {
if (mutex == NULL || !mutex->is_valid)
return;
DeleteCriticalSection(&mutex->cs);
mutex->is_valid = 0;
}
static int threading_mutex_lock_alt(mbedtls_threading_mutex_t *mutex) {
if (mutex == NULL || !mutex->is_valid)
return(MBEDTLS_ERR_THREADING_BAD_INPUT_DATA);
EnterCriticalSection(&mutex->cs);
return(0);
}
static int threading_mutex_unlock_alt(mbedtls_threading_mutex_t *mutex) {
if (mutex == NULL || !mutex->is_valid)
return(MBEDTLS_ERR_THREADING_BAD_INPUT_DATA);
LeaveCriticalSection(&mutex->cs);
return(0);
}
#endif
HL_PRIM void HL_NAME(ssl_init)() {
if (ssl_init_done)
return;
ssl_init_done = true;
#if _MSC_VER
mbedtls_threading_set_alt(threading_mutex_init_alt, threading_mutex_free_alt,
threading_mutex_lock_alt, threading_mutex_unlock_alt);
#endif
// Init RNG
mbedtls_entropy_init(&entropy);
mbedtls_ctr_drbg_init(&ctr_drbg);
mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0);
}
DEFINE_PRIM(_VOID, ssl_init, _NO_ARG);

View File

@ -0,0 +1,315 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="ReleaseVS2013|Win32">
<Configuration>ReleaseVS2013</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="ReleaseVS2013|x64">
<Configuration>ReleaseVS2013</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\include\mbedtls\library\aes.c" />
<ClCompile Include="..\..\include\mbedtls\library\aesni.c" />
<ClCompile Include="..\..\include\mbedtls\library\arc4.c" />
<ClCompile Include="..\..\include\mbedtls\library\asn1parse.c" />
<ClCompile Include="..\..\include\mbedtls\library\asn1write.c" />
<ClCompile Include="..\..\include\mbedtls\library\base64.c" />
<ClCompile Include="..\..\include\mbedtls\library\bignum.c" />
<ClCompile Include="..\..\include\mbedtls\library\blowfish.c" />
<ClCompile Include="..\..\include\mbedtls\library\camellia.c" />
<ClCompile Include="..\..\include\mbedtls\library\ccm.c" />
<ClCompile Include="..\..\include\mbedtls\library\certs.c" />
<ClCompile Include="..\..\include\mbedtls\library\cipher.c" />
<ClCompile Include="..\..\include\mbedtls\library\cipher_wrap.c" />
<ClCompile Include="..\..\include\mbedtls\library\ctr_drbg.c" />
<ClCompile Include="..\..\include\mbedtls\library\debug.c" />
<ClCompile Include="..\..\include\mbedtls\library\des.c" />
<ClCompile Include="..\..\include\mbedtls\library\dhm.c" />
<ClCompile Include="..\..\include\mbedtls\library\ecdh.c" />
<ClCompile Include="..\..\include\mbedtls\library\ecdsa.c" />
<ClCompile Include="..\..\include\mbedtls\library\ecjpake.c" />
<ClCompile Include="..\..\include\mbedtls\library\ecp.c" />
<ClCompile Include="..\..\include\mbedtls\library\ecp_curves.c" />
<ClCompile Include="..\..\include\mbedtls\library\entropy.c" />
<ClCompile Include="..\..\include\mbedtls\library\entropy_poll.c" />
<ClCompile Include="..\..\include\mbedtls\library\error.c" />
<ClCompile Include="..\..\include\mbedtls\library\gcm.c" />
<ClCompile Include="..\..\include\mbedtls\library\havege.c" />
<ClCompile Include="..\..\include\mbedtls\library\hmac_drbg.c" />
<ClCompile Include="..\..\include\mbedtls\library\md.c" />
<ClCompile Include="..\..\include\mbedtls\library\md2.c" />
<ClCompile Include="..\..\include\mbedtls\library\md4.c" />
<ClCompile Include="..\..\include\mbedtls\library\md5.c" />
<ClCompile Include="..\..\include\mbedtls\library\md_wrap.c" />
<ClCompile Include="..\..\include\mbedtls\library\memory_buffer_alloc.c" />
<ClCompile Include="..\..\include\mbedtls\library\oid.c" />
<ClCompile Include="..\..\include\mbedtls\library\padlock.c" />
<ClCompile Include="..\..\include\mbedtls\library\pem.c" />
<ClCompile Include="..\..\include\mbedtls\library\pk.c" />
<ClCompile Include="..\..\include\mbedtls\library\pkcs11.c" />
<ClCompile Include="..\..\include\mbedtls\library\pkcs12.c" />
<ClCompile Include="..\..\include\mbedtls\library\pkcs5.c" />
<ClCompile Include="..\..\include\mbedtls\library\pkparse.c" />
<ClCompile Include="..\..\include\mbedtls\library\pkwrite.c" />
<ClCompile Include="..\..\include\mbedtls\library\pk_wrap.c" />
<ClCompile Include="..\..\include\mbedtls\library\platform.c" />
<ClCompile Include="..\..\include\mbedtls\library\ripemd160.c" />
<ClCompile Include="..\..\include\mbedtls\library\rsa.c" />
<ClCompile Include="..\..\include\mbedtls\library\rsa_internal.c" />
<ClCompile Include="..\..\include\mbedtls\library\sha1.c" />
<ClCompile Include="..\..\include\mbedtls\library\sha256.c" />
<ClCompile Include="..\..\include\mbedtls\library\sha512.c" />
<ClCompile Include="..\..\include\mbedtls\library\ssl_cache.c" />
<ClCompile Include="..\..\include\mbedtls\library\ssl_ciphersuites.c" />
<ClCompile Include="..\..\include\mbedtls\library\ssl_cli.c" />
<ClCompile Include="..\..\include\mbedtls\library\ssl_cookie.c" />
<ClCompile Include="..\..\include\mbedtls\library\ssl_srv.c" />
<ClCompile Include="..\..\include\mbedtls\library\ssl_ticket.c" />
<ClCompile Include="..\..\include\mbedtls\library\ssl_tls.c" />
<ClCompile Include="..\..\include\mbedtls\library\threading.c" />
<ClCompile Include="..\..\include\mbedtls\library\timing.c" />
<ClCompile Include="..\..\include\mbedtls\library\version.c" />
<ClCompile Include="..\..\include\mbedtls\library\version_features.c" />
<ClCompile Include="..\..\include\mbedtls\library\x509.c" />
<ClCompile Include="..\..\include\mbedtls\library\x509write_crt.c" />
<ClCompile Include="..\..\include\mbedtls\library\x509write_csr.c" />
<ClCompile Include="..\..\include\mbedtls\library\x509_create.c" />
<ClCompile Include="..\..\include\mbedtls\library\x509_crl.c" />
<ClCompile Include="..\..\include\mbedtls\library\x509_crt.c" />
<ClCompile Include="..\..\include\mbedtls\library\x509_csr.c" />
<ClCompile Include="..\..\include\mbedtls\library\xtea.c" />
<ClCompile Include="ssl.c" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{F4D939D6-88D6-4FF2-874A-7BECF75A01C2}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>ui</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<LibraryPath>$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;../../$(Configuration)</LibraryPath>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/mbedtls/include</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;../../x64/$(Configuration)</LibraryPath>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/mbedtls/include</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<LibraryPath>$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;../../$(Configuration)</LibraryPath>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/mbedtls/include</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<LibraryPath>$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;../../$(Configuration)</LibraryPath>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/mbedtls/include</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;../../x64/$(Configuration)</LibraryPath>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/mbedtls/include</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetExt>.hdll</TargetExt>
<LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;../../x64/$(Configuration)</LibraryPath>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);../../src;../../include/mbedtls/include</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;UI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>../../$(Configuration)/$(TargetName).hdll</OutputFile>
<AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;ws2_32.lib;advapi32.lib;crypt32.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;UI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;ws2_32.lib;advapi32.lib;crypt32.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;UI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>../../$(Configuration)/$(TargetName).hdll</OutputFile>
<AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;ws2_32.lib;advapi32.lib;crypt32.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;UI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>../../$(Configuration)/$(TargetName).hdll</OutputFile>
<AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;ws2_32.lib;advapi32.lib;crypt32.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;UI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;ws2_32.lib;advapi32.lib;crypt32.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;UI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;ws2_32.lib;advapi32.lib;crypt32.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,221 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="ssl.c" />
<ClCompile Include="..\..\include\mbedtls\library\ecdsa.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ecjpake.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ecp.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ecp_curves.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\entropy.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\entropy_poll.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\error.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\gcm.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\havege.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\hmac_drbg.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\md.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\md_wrap.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\md2.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\md4.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\md5.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\memory_buffer_alloc.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\oid.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\padlock.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\pem.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\pk.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\pk_wrap.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\pkcs5.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\pkcs11.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\pkcs12.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\pkparse.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\pkwrite.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\platform.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ripemd160.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\rsa.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\sha1.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\sha256.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\sha512.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ssl_cache.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ssl_ciphersuites.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ssl_cli.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ssl_cookie.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ssl_srv.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ssl_ticket.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ssl_tls.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\threading.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\timing.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\version.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\version_features.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\x509.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\x509_create.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\x509_crl.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\x509_crt.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\x509_csr.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\x509write_crt.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\x509write_csr.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\xtea.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\aes.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\aesni.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\arc4.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\asn1parse.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\asn1write.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\base64.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\bignum.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\blowfish.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\camellia.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ccm.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\certs.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\cipher.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\cipher_wrap.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ctr_drbg.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\debug.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\des.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\dhm.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\ecdh.c">
<Filter>mbedtls</Filter>
</ClCompile>
<ClCompile Include="..\..\include\mbedtls\library\rsa_internal.c">
<Filter>mbedtls</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="mbedtls">
<UniqueIdentifier>{e52fcee9-bcc2-42d7-b57c-c0773a23d2d9}</UniqueIdentifier>
</Filter>
</ItemGroup>
</Project>