vmshortcut.c
3.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include "string.h"
#include "vmcerter.h"
#include "vmsys.h"
#include "vmres.h"
#include "vmgettag.h"
#include "vmcert.h"
#include "vmcermng.h"
VMINT vm_get_appicon( VMWSTR vxp_filename, VMSTR icon_ptr, VMINT size)
{
VMUINT8 * res_buf = NULL;
VMINT res_size = 0;
if( vxp_filename == NULL )
return 0;
if( icon_ptr == NULL )
{
#ifdef __MRE_LIB_APPRES__
res_buf = vm_load_resource_from_file( vxp_filename, "_MREAppLogo.img", &res_size );
#else
res_buf = NULL;
#endif
if( res_buf == NULL )
{
vm_free( res_buf );
return 0;
}
else
return res_size;
}
else
{
#ifdef __MRE_LIB_APPRES__
res_buf = vm_load_resource_from_file( vxp_filename, "_MREAppLogo.img", &res_size );
#else
res_buf = NULL;
#endif
if( res_buf == NULL )
return 0;
else
{
if( res_size > size )
return 0;
else
{
memcpy( icon_ptr, res_buf, res_size );
vm_free( res_buf );
return res_size;
}
}
}
}
VMINT vm_get_appid(VMWSTR vxp_filename)
{
VMINT res = 0, buf_size = sizeof(VMINT), buf = 0;
if( vxp_filename == NULL )
return 0;
res = vm_get_vm_tag( vxp_filename, VM_CE_INFO_APP_ID, (VMCHAR *)&buf, &buf_size );
if( res == GET_TAG_TRUE )
return buf;
else
return 0;
}
/*VMINT vm_app_is_valid(VMWSTR vxp_filename)
{
VMUCHAR* ce_digest_buffer = NULL;
VMINT ce_digest_buffer_len = (10 * 1024);
VMUCHAR appdigest[16];
MRECert* cert = NULL;
VMINT rescode = vm_ce_init();
if( vxp_filename )
{
if( rescode < 0 )
{
vm_ce_finialize();
return rescode;
}
if ((ce_digest_buffer = vm_malloc(ce_digest_buffer_len)) == NULL)
{
vm_ce_finialize();
return VM_CE_VERIFY_BAD_DIGEST;
}
if( vm_parse_exec_format( filename ) == VM_EXEC_ROM )
{
VMUINT8 * rom = vm_get_execrom_ptr( filename );
VMINT size = vm_get_execrom_size( rom - 4 );
vm_log_debug( "size = %d, rom=%x", size, rom );
//caculate the digest and read the cert
vm_ce_get_app_digest_rom( (VMCHAR *)rom, size, appdigest );
apce = vm_ce_load_app_rom( (VMCHAR *)rom, size );
//verify the app
if( apce )
rescode = vm_ce_verify_app( apce, (VMUCHAR *)appdigest, DIG_MAX_LEN, mode );
else
rescode = -1;
vm_ce_unload_app( apce );
vm_ce_finialize( );
return rescode;
}
else
{
if (vm_ce_get_app_digest(vxp_filename, ce_digest_buffer, ce_digest_buffer_len, appdigest) != VM_CE_OP_OK)
{
vm_ce_finialize();
vm_free(ce_digest_buffer);
return VM_CE_VERIFY_BAD_DIGEST;
}
vm_free(ce_digest_buffer);
cert = (MRECert*)vm_ce_load_app(vxp_filename);
if(cert)
{
//ignore the mem check when creating shortcut
cert->checkfunc[VM_CE_INFO_MEM_REQ] = NULL;
rescode = vm_ce_verify_app(cert, (VMUCHAR*)appdigest, 16, VERIFY_FULL);
}
else
{
vm_ce_unload_app(cert);
vm_ce_finialize();
return VM_CE_VERIFY_BAD_DIGEST;
}
vm_ce_unload_app(cert);
vm_ce_finialize();
return rescode;
}
}
else
return VM_CE_VERIFY_BAD_PARAM;
}*/
VMINT vm_app_is_valid(VMWSTR vxp_filename)
{
VMUCHAR* ce_digest_buffer = NULL;
VMINT ce_digest_buffer_len = (10 * 1024);
VMINT rescode = -1;
if( vxp_filename )
{
if ((ce_digest_buffer = vm_malloc(ce_digest_buffer_len)) == NULL)
return VM_CE_VERIFY_BAD_DIGEST;
#ifdef __MRE_CORE_SAFETY__
rescode = vm_ce_auth_app( vxp_filename, ce_digest_buffer, ce_digest_buffer_len );
#else
rescode = VM_CE_VERIFY_OK;
#endif
//vm_per_finalize( );
vm_free( ce_digest_buffer );
return rescode;
}
else
return VM_CE_VERIFY_BAD_PARAM;
}