Rizin
unix-like reverse engineering framework and cli tools
zip_crypto_mbedtls.c
Go to the documentation of this file.
1 /*
2  zip_crypto_mbedtls.c -- mbed TLS wrapper
3  Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner
4 
5  This file is part of libzip, a library to manipulate ZIP archives.
6  The authors can be contacted at <info@libzip.org>
7 
8  Redistribution and use in source and binary forms, with or without
9  modification, are permitted provided that the following conditions
10  are met:
11  1. Redistributions of source code must retain the above copyright
12  notice, this list of conditions and the following disclaimer.
13  2. Redistributions in binary form must reproduce the above copyright
14  notice, this list of conditions and the following disclaimer in
15  the documentation and/or other materials provided with the
16  distribution.
17  3. The names of the authors may not be used to endorse or promote
18  products derived from this software without specific prior
19  written permission.
20 
21  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
22  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
25  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
27  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
29  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
31  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33 
34 #include <stdlib.h>
35 
36 #include "zipint.h"
37 
38 #include "zip_crypto.h"
39 
40 #include <mbedtls/ctr_drbg.h>
41 #include <mbedtls/entropy.h>
42 #include <mbedtls/pkcs5.h>
43 
44 #include <limits.h>
45 
48  _zip_crypto_aes_t *aes;
49 
50  if ((aes = (_zip_crypto_aes_t *)malloc(sizeof(*aes))) == NULL) {
52  return NULL;
53  }
54 
55  mbedtls_aes_init(aes);
56  mbedtls_aes_setkey_enc(aes, (const unsigned char *)key, (unsigned int)key_size);
57 
58  return aes;
59 }
60 
61 void
63  if (aes == NULL) {
64  return;
65  }
66 
67  mbedtls_aes_free(aes);
68  free(aes);
69 }
70 
71 
74  _zip_crypto_hmac_t *hmac;
75 
76  if (secret_length > INT_MAX) {
78  return NULL;
79  }
80 
81  if ((hmac = (_zip_crypto_hmac_t *)malloc(sizeof(*hmac))) == NULL) {
83  return NULL;
84  }
85 
86  mbedtls_md_init(hmac);
87 
88  if (mbedtls_md_setup(hmac, mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), 1) != 0) {
90  free(hmac);
91  return NULL;
92  }
93 
94  if (mbedtls_md_hmac_starts(hmac, (const unsigned char *)secret, (size_t)secret_length) != 0) {
96  free(hmac);
97  return NULL;
98  }
99 
100  return hmac;
101 }
102 
103 
104 void
106  if (hmac == NULL) {
107  return;
108  }
109 
110  mbedtls_md_free(hmac);
111  free(hmac);
112 }
113 
114 
115 bool
116 _zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, int iterations, zip_uint8_t *output, zip_uint64_t output_length) {
117  mbedtls_md_context_t sha1_ctx;
118  bool ok = true;
119 
120  mbedtls_md_init(&sha1_ctx);
121 
122  if (mbedtls_md_setup(&sha1_ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), 1) != 0) {
123  ok = false;
124  }
125 
126  if (ok && mbedtls_pkcs5_pbkdf2_hmac(&sha1_ctx, (const unsigned char *)key, (size_t)key_length, (const unsigned char *)salt, (size_t)salt_length, (unsigned int)iterations, (uint32_t)output_length, (unsigned char *)output) != 0) {
127  ok = false;
128  }
129 
130  mbedtls_md_free(&sha1_ctx);
131  return ok;
132 }
133 
134 
135 typedef struct {
136  mbedtls_entropy_context entropy;
137  mbedtls_ctr_drbg_context ctr_drbg;
139 
140 ZIP_EXTERN bool
142  static zip_random_context_t *ctx = NULL;
143  const unsigned char *pers = "zip_crypto_mbedtls";
144 
145  if (!ctx) {
147  if (!ctx) {
148  return false;
149  }
150  mbedtls_entropy_init(&ctx->entropy);
151  mbedtls_ctr_drbg_init(&ctx->ctr_drbg);
152  if (mbedtls_ctr_drbg_seed(&ctx->ctr_drbg, mbedtls_entropy_func, &ctx->entropy, pers, strlen(pers)) != 0) {
153  mbedtls_ctr_drbg_free(&ctx->ctr_drbg);
154  mbedtls_entropy_free(&ctx->entropy);
155  free(ctx);
156  ctx = NULL;
157  return false;
158  }
159  }
160 
161  return mbedtls_ctr_drbg_random(&ctx->ctr_drbg, (unsigned char *)buffer, (size_t)length) == 0;
162 }
#define INT_MAX
Definition: cp-demangle.c:131
#define NULL
Definition: cris-opc.c:27
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void static offset struct stat static buf void long static basep static whence static length const void static len key
Definition: sflib.h:118
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void static offset struct stat static buf void long static basep static whence static length const void static len static semflg const void static shmflg const struct timespec struct timespec static rem const char static group const void length
Definition: sflib.h:133
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
#define ZIP_ER_INTERNAL
Definition: zip.h:125
ZIP_EXTERN void zip_error_set(zip_error_t *_Nullable, int, int)
Definition: zip_error.c:126
#define ZIP_ER_MEMORY
Definition: zip.h:119
#define ZIP_EXTERN
Definition: zip.h:54
#define ZIP_ER_INVAL
Definition: zip.h:123
void * malloc(size_t size)
Definition: malloc.c:123
@ ok
Definition: lz4.c:1706
unsigned int uint32_t
Definition: sftypes.h:29
Definition: buffer.h:15
Definition: zip.h:284
mbedtls_entropy_context entropy
mbedtls_ctr_drbg_context ctr_drbg
void error(const char *msg)
Definition: untgz.c:593
bool _zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, int iterations, zip_uint8_t *output, zip_uint64_t output_length)
void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac)
void _zip_crypto_aes_free(_zip_crypto_aes_t *aes)
_zip_crypto_aes_t * _zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error)
ZIP_EXTERN bool zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length)
_zip_crypto_hmac_t * _zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error)
diff_output_t output
Definition: zipcmp.c:237
uint64_t zip_uint64_t
Definition: zipconf.h:39
uint8_t zip_uint8_t
Definition: zipconf.h:33
uint16_t zip_uint16_t
Definition: zipconf.h:35