6
6
7
7
#pragma pack(push, 1)
8
8
typedef struct {
9
+ uint8_t magic_number ;
9
10
uint16_t crc16 ;
10
- uint16_t date ;
11
+ uint32_t date ;
11
12
uint8_t random_bytes [MTSD_RANDOM_BYTES ];
12
13
uint8_t is_compressed ;
13
14
} mtsd_header ;
14
15
#pragma pack(pop)
15
16
16
17
static uint16_t crc16 (uint8_t * data , size_t size );
17
- static uint16_t get_date_now ();
18
+ static mtsd_res get_date_now (uint32_t * out );
19
+ static void derive_salt (const uint8_t * data , size_t data_size , const uint8_t * pass , size_t pass_len , uint8_t * salt );
18
20
19
21
mtsd_res mtsd_encrypt (mtsd_document * doc ,
20
22
uint8_t * password ,
@@ -42,10 +44,16 @@ mtsd_res mtsd_encrypt(mtsd_document* doc,
42
44
}
43
45
MTSD_FREE (encoded );
44
46
45
- MTSD_CHECK_GOTO (mtsd_encrypt_payload ( out + sizeof ( mtsd_header ), * size , password , password_len , (( mtsd_header * )out )-> random_bytes ), error );
47
+ MTSD_CHECK_GOTO (get_date_now ( & (( mtsd_header * )out )-> date ), error );
46
48
47
- ((mtsd_header * )out )-> date = get_date_now ();
48
- ((mtsd_header * )out )-> crc16 = crc16 (out + 2 , sizeof (mtsd_header ) + * size - 2 );
49
+ MTSD_CHECK_GOTO (mtsd_random_bytes (((mtsd_header * )out )-> random_bytes , MTSD_RANDOM_BYTES ), error );
50
+
51
+ uint8_t salt [MTSD_SALT_SIZE ];
52
+ derive_salt (out , (sizeof (mtsd_header ) + * size ), password , password_len , salt );
53
+ MTSD_CHECK_GOTO (mtsd_encrypt_payload (out + sizeof (mtsd_header ), * size , password , password_len , salt ), error );
54
+
55
+ ((mtsd_header * )out )-> magic_number = 0x7D ;
56
+ ((mtsd_header * )out )-> crc16 = crc16 (out + 3 , sizeof (mtsd_header ) + * size - 3 );
49
57
50
58
* encrypted = (uint8_t * )out ;
51
59
* size = (sizeof (mtsd_header ) + * size );
@@ -68,7 +76,9 @@ mtsd_res mtsd_decrypt(uint8_t* encrypted,
68
76
MTSD_MALLOC (cloned , size - sizeof (mtsd_header ));
69
77
memcpy (cloned , encrypted + sizeof (mtsd_header ), size - sizeof (mtsd_header ));
70
78
71
- MTSD_CHECK_GOTO (mtsd_decrypt_payload (cloned , size - sizeof (mtsd_header ), password , password_len , ((mtsd_header * )encrypted )-> random_bytes ), error );
79
+ uint8_t salt [MTSD_SALT_SIZE ];
80
+ derive_salt (encrypted , size , password , password_len , salt );
81
+ MTSD_CHECK_GOTO (mtsd_decrypt_payload (cloned , size - sizeof (mtsd_header ), password , password_len , salt ), error );
72
82
73
83
if (((mtsd_header * )encrypted )-> is_compressed ) {
74
84
encoded = mtsd_malloc (MTSD_PAYLOAD_MAX_SIZE );
@@ -119,10 +129,43 @@ static uint16_t crc16 (uint8_t* data, size_t size) {
119
129
return crc ;
120
130
}
121
131
122
- static uint16_t get_date_now () {
132
+ static mtsd_res get_date_now (uint32_t * out ) {
123
133
time_t t = time (NULL );
124
- struct tm * local = localtime (& t );
125
- uint16_t delta_y = local -> tm_year + 1900 - MTSD_DATE_FROM ;
126
- uint16_t delta_d = (delta_y * 366 ) + (local -> tm_yday + 1 );
127
- return delta_d ;
134
+ if (t == (time_t )- 1 ) {
135
+ mtsd_error (MTSD_ESELF , MTSD_ETIME , "cannot get system time" );
136
+ return MTSD_ERR ;
137
+ }
138
+ * out = (uint32_t )((uint64_t )t - MTSD_DATE_FROM );
139
+ return MTSD_OK ;
140
+ }
141
+
142
+ static void derive_salt (const uint8_t * data , size_t data_size , const uint8_t * pass , size_t pass_len , uint8_t * salt ) {
143
+ #ifndef DEBUG
144
+ mtsd_header * header = (mtsd_header * )data ;
145
+ salt [0 ] = (data_size >> (8 * 0 )) & 0xFF ;
146
+ salt [1 ] = (data_size >> (8 * 1 )) & 0xFF ;
147
+ salt [2 ] = (header -> date >> (8 * 0 )) & 0xFF ;
148
+ salt [3 ] = (header -> date >> (8 * 1 )) & 0xFF ;
149
+ salt [4 ] = (header -> date >> (8 * 2 )) & 0xFF ;
150
+ salt [5 ] = (header -> date >> (8 * 3 )) & 0xFF ;
151
+ salt [6 ] = header -> random_bytes [0 ];
152
+ salt [7 ] = header -> random_bytes [1 ];
153
+ salt [8 ] = header -> random_bytes [2 ];
154
+ salt [9 ] = header -> random_bytes [3 ];
155
+ salt [10 ] = (pass_len >> (8 * 0 )) & 0xFF ;
156
+ salt [11 ] = 0x42 ;
157
+ salt [12 ] = 0xf0 ;
158
+ salt [13 ] = 0xe1 ;
159
+ salt [14 ] = 0xeb ;
160
+ salt [15 ] = 0xa9 ;
161
+
162
+ for (size_t pi = 0 , si = 11 ; pi < pass_len && si < MTSD_SALT_SIZE ; pi += 1 , si += 1 ) {
163
+ salt [si ] ^= pass [pi ];
164
+ }
165
+ #else
166
+ salt [0 ] = 0x0 ; salt [1 ] = 0x1 ; salt [2 ] = 0x2 ; salt [3 ] = 0x3 ;
167
+ salt [4 ] = 0x4 ; salt [5 ] = 0x5 ; salt [6 ] = 0x6 ; salt [7 ] = 0x7 ;
168
+ salt [8 ] = 0xF ; salt [9 ] = 0xE ; salt [10 ] = 0xD ; salt [11 ] = 0xC ;
169
+ salt [12 ] = 0xB ; salt [13 ] = 0xA ; salt [14 ] = 0x9 ; salt [15 ] = 0x8 ;
170
+ #endif
128
171
}
0 commit comments