33 #undef HAVE_NSS_CONTEXT 36 # include <openssl/md5.h> 37 # include <openssl/sha.h> 38 #elif defined(USE_GNUTLS_NETTLE) 39 # include <nettle/md5.h> 40 # include <nettle/sha.h> 41 # define MD5_CTX struct md5_ctx 42 # define SHA_CTX struct sha1_ctx 43 # define SHA256_CTX struct sha256_ctx 44 #elif defined(USE_GNUTLS) 46 # define MD5_CTX gcry_md_hd_t 47 # define SHA_CTX gcry_md_hd_t 48 # define SHA256_CTX gcry_md_hd_t 49 #elif defined(USE_NSS) 52 # define MD5_CTX void * 53 # define SHA_CTX void * 54 # define SHA256_CTX void * 55 # define HAVE_NSS_CONTEXT 56 static NSSInitContext *nss_context;
57 #elif defined(USE_POLARSSL) 58 # include <polarssl/md5.h> 59 # include <polarssl/sha1.h> 60 # include <polarssl/sha256.h> 61 # define MD5_CTX md5_context 62 # define SHA_CTX sha1_context 63 # define SHA256_CTX sha256_context 64 #elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \ 65 (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1040)) || \ 66 (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \ 67 (__IPHONE_OS_VERSION_MAX_ALLOWED >= 20000)) 74 # define COMMON_DIGEST_FOR_OPENSSL 75 # include <CommonCrypto/CommonDigest.h> 79 # include <wincrypt.h> 81 struct win32_crypto_hash {
82 HCRYPTPROV hCryptProv;
86 # ifndef ALG_SID_SHA_256 87 # define ALG_SID_SHA_256 12 90 # define CALG_SHA_256 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256) 92 # define MD5_CTX struct win32_crypto_hash 93 # define SHA_CTX struct win32_crypto_hash 94 # define SHA256_CTX struct win32_crypto_hash 96 # error "Can't compile METALINK support without a crypto library." 99 #define ENABLE_CURLX_PRINTF 112 #define GetStr(str,val) do { \ 118 *(str) = strdup((val)); \ 120 return PARAM_NO_MEM; \ 123 #if defined(USE_OPENSSL) 125 #elif defined(USE_GNUTLS_NETTLE) 134 const unsigned char *
input,
135 unsigned int inputLen)
137 md5_update(ctx, inputLen, input);
142 md5_digest(ctx, 16, digest);
145 static int SHA1_Init(SHA_CTX *ctx)
151 static void SHA1_Update(SHA_CTX *ctx,
152 const unsigned char *
input,
153 unsigned int inputLen)
155 sha1_update(ctx, inputLen, input);
158 static void SHA1_Final(
unsigned char digest[20], SHA_CTX *ctx)
160 sha1_digest(ctx, 20, digest);
170 const unsigned char *
input,
171 unsigned int inputLen)
173 sha256_update(ctx, inputLen, input);
176 static void SHA256_Final(
unsigned char digest[32], SHA256_CTX *ctx)
178 sha256_digest(ctx, 32, digest);
181 #elif defined(USE_GNUTLS) 185 gcry_md_open(ctx, GCRY_MD_MD5, 0);
190 const unsigned char *
input,
191 unsigned int inputLen)
193 gcry_md_write(*ctx, input, inputLen);
198 memcpy(digest, gcry_md_read(*ctx, 0), 16);
202 static int SHA1_Init(SHA_CTX *ctx)
204 gcry_md_open(ctx, GCRY_MD_SHA1, 0);
208 static void SHA1_Update(SHA_CTX *ctx,
209 const unsigned char *
input,
210 unsigned int inputLen)
212 gcry_md_write(*ctx, input, inputLen);
215 static void SHA1_Final(
unsigned char digest[20], SHA_CTX *ctx)
217 memcpy(digest, gcry_md_read(*ctx, 0), 20);
223 gcry_md_open(ctx, GCRY_MD_SHA256, 0);
228 const unsigned char *
input,
229 unsigned int inputLen)
231 gcry_md_write(*ctx, input, inputLen);
234 static void SHA256_Final(
unsigned char digest[32], SHA256_CTX *ctx)
236 memcpy(digest, gcry_md_read(*ctx, 0), 32);
240 #elif defined(USE_NSS) 242 static int nss_hash_init(
void **pctx, SECOidTag hash_alg)
247 if(!NSS_IsInitialized() && !nss_context) {
248 static NSSInitParameters params;
249 params.length =
sizeof params;
250 nss_context = NSS_InitContext(
"",
"",
"",
"", ¶ms, NSS_INIT_READONLY
251 | NSS_INIT_NOCERTDB | NSS_INIT_NOMODDB | NSS_INIT_FORCEOPEN
252 | NSS_INIT_NOROOTINIT | NSS_INIT_OPTIMIZESPACE | NSS_INIT_PK11RELOAD);
255 ctx = PK11_CreateDigestContext(hash_alg);
259 if(PK11_DigestBegin(ctx) != SECSuccess) {
260 PK11_DestroyContext(ctx, PR_TRUE);
268 static void nss_hash_final(
void **pctx,
unsigned char *out,
unsigned int len)
270 PK11Context *ctx = *pctx;
272 PK11_DigestFinal(ctx, out, &outlen, len);
273 PK11_DestroyContext(ctx, PR_TRUE);
278 return nss_hash_init(pctx, SEC_OID_MD5);
282 const unsigned char *
input,
283 unsigned int input_len)
285 PK11_DigestOp(*pctx, input, input_len);
290 nss_hash_final(pctx, digest, 16);
293 static int SHA1_Init(SHA_CTX *pctx)
295 return nss_hash_init(pctx, SEC_OID_SHA1);
298 static void SHA1_Update(SHA_CTX *pctx,
299 const unsigned char *
input,
300 unsigned int input_len)
302 PK11_DigestOp(*pctx, input, input_len);
305 static void SHA1_Final(
unsigned char digest[20], SHA_CTX *pctx)
307 nss_hash_final(pctx, digest, 20);
312 return nss_hash_init(pctx, SEC_OID_SHA256);
316 const unsigned char *
input,
317 unsigned int input_len)
319 PK11_DigestOp(*pctx, input, input_len);
322 static void SHA256_Final(
unsigned char digest[32], SHA256_CTX *pctx)
324 nss_hash_final(pctx, digest, 32);
327 #elif defined(USE_POLARSSL) 336 const unsigned char *
input,
337 unsigned int inputLen)
339 md5_update(ctx, input, inputLen);
344 md5_finish(ctx, digest);
347 static int SHA1_Init(SHA_CTX *ctx)
353 static void SHA1_Update(SHA_CTX *ctx,
354 const unsigned char *
input,
355 unsigned int inputLen)
357 sha1_update(ctx, input, inputLen);
360 static void SHA1_Final(
unsigned char digest[20], SHA_CTX *ctx)
362 sha1_finish(ctx, digest);
367 sha256_starts(ctx, 0);
372 const unsigned char *
input,
373 unsigned int inputLen)
375 sha256_update(ctx, input, inputLen);
378 static void SHA256_Final(
unsigned char digest[32], SHA256_CTX *ctx)
380 sha256_finish(ctx, digest);
383 #elif defined(_WIN32) 385 static void win32_crypto_final(
struct win32_crypto_hash *ctx,
386 unsigned char *digest,
387 unsigned int digestLen)
390 CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0);
391 if(length == digestLen)
392 CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0);
394 CryptDestroyHash(ctx->hHash);
396 CryptReleaseContext(ctx->hCryptProv, 0);
401 if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL,
402 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
403 CryptCreateHash(ctx->hCryptProv, CALG_MD5, 0, 0, &ctx->hHash);
409 const unsigned char *
input,
410 unsigned int inputLen)
412 CryptHashData(ctx->hHash, (
unsigned char *)input, inputLen, 0);
417 win32_crypto_final(ctx, digest, 16);
420 static int SHA1_Init(SHA_CTX *ctx)
422 if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL,
423 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
424 CryptCreateHash(ctx->hCryptProv, CALG_SHA1, 0, 0, &ctx->hHash);
429 static void SHA1_Update(SHA_CTX *ctx,
430 const unsigned char *
input,
431 unsigned int inputLen)
433 CryptHashData(ctx->hHash, (
unsigned char *)input, inputLen, 0);
436 static void SHA1_Final(
unsigned char digest[20], SHA_CTX *ctx)
438 win32_crypto_final(ctx, digest, 20);
443 if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL,
444 PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {
445 CryptCreateHash(ctx->hCryptProv, CALG_SHA_256, 0, 0, &ctx->hHash);
451 const unsigned char *
input,
452 unsigned int inputLen)
454 CryptHashData(ctx->hHash, (
unsigned char *)input, inputLen, 0);
457 static void SHA256_Final(
unsigned char digest[32], SHA256_CTX *ctx)
459 win32_crypto_final(ctx, digest, 32);
495 {
"sha-256", SHA256_DIGEST_PARAMS}
499 {
"sha-1", SHA1_DIGEST_PARAMS}
503 {
"md5", MD5_DIGEST_PARAMS}
514 {
"sha-256", SHA256_DIGEST_DEF},
515 {
"sha256", SHA256_DIGEST_DEF},
516 {
"sha-1", SHA1_DIGEST_DEF},
517 {
"sha1", SHA1_DIGEST_DEF},
518 {
"md5", MD5_DIGEST_DEF},
527 ctxt =
malloc(
sizeof *ctxt);
550 const unsigned char *
data,
568 static unsigned char hex_to_uint(
const char *s)
575 val = strtoul(buf, NULL, 16);
576 return (
unsigned char)(val&0xff);
593 static int check_hash(
const char *filename,
595 const unsigned char *digest, FILE *error)
599 int check_ok, flags, fd;
607 fd = open(filename, flags);
609 fprintf(error,
"Metalink: validating (%s) [%s] FAILED (%s)\n", filename,
616 fprintf(error,
"Metalink: validating (%s) [%s] FAILED (%s)\n", filename,
617 digest_def->
hash_name,
"failed to initialize hash algorithm");
628 unsigned char buf[4096];
629 ssize_t len = read(fd, buf,
sizeof(buf));
634 fprintf(error,
"Metalink: validating (%s) [%s] FAILED (%s)\n", filename,
643 check_ok = memcmp(result, digest,
647 fprintf(error,
"Metalink: validating (%s) [%s] OK\n", filename,
650 fprintf(error,
"Metalink: validating (%s) [%s] FAILED (digest mismatch)\n",
660 const char *filename)
663 fprintf(config->
errors,
"Metalink: validating (%s)...\n", filename);
666 "Metalink: validating (%s) FAILED (digest missing)\n", filename);
678 unsigned char *digest;
680 size_t len = strlen(hex_digest);
685 for(i = 0; i <
len; i += 2) {
686 digest[i/2] = hex_to_uint(hex_digest + i);
714 static int check_hex_digest(
const char *hex_digest,
718 for(i = 0; hex_digest[
i]; ++
i) {
719 char c = hex_digest[
i];
720 if(!((
'0' <= c && c <=
'9') || (
'a' <= c && c <=
'z') ||
721 (
'A' <= c && c <=
'Z'))) {
743 if(fileinfo->checksums) {
745 for(digest_alias = digest_aliases; digest_alias->
alias_name;
747 metalink_checksum_t **
p;
748 for(p = fileinfo->checksums; *p; ++p) {
750 check_hex_digest((*p)->hash, digest_alias->
digest_def)) {
752 new_metalink_checksum_from_hex_digest(digest_alias->
digest_def,
762 if(fileinfo->resources) {
763 metalink_resource_t **
p;
767 for(p = fileinfo->resources; *p; ++p) {
778 if((*p)->type == NULL ||
783 res = new_metalink_resource((*p)->url);
794 const char *metalink_url)
797 metalink_t* metalink;
798 metalink_file_t **files;
799 bool warnings =
FALSE;
802 r = metalink_parse_final(outs->metalink_parser, NULL, 0, &metalink);
803 outs->metalink_parser = NULL;
807 if(metalink->files == NULL) {
809 "(missing or invalid file name)\n",
811 metalink_delete(metalink);
814 for(files = metalink->files; *files; ++files) {
817 if(!(*files)->resources) {
819 "(missing or invalid resource)\n",
848 "Metalink: parsing (%s) WARNING (digest missing)\n",
866 metalink_delete(metalink);
867 return (warnings) ? -2 : 0;
870 size_t metalink_write_cb(
void *
buffer,
size_t sz,
size_t nmemb,
883 const size_t failure = (sz && nmemb) ? 0 : 1;
888 rv = metalink_parse_update(outs->metalink_parser, buffer, sz * nmemb);
900 static int check_content_type(
const char *content_type,
const char *media_type)
902 const char *
ptr = content_type;
903 size_t media_type_len = strlen(media_type);
904 for(; *ptr && (*ptr ==
' ' || *ptr ==
'\t'); ++
ptr);
909 (*(ptr + media_type_len) ==
'\0' || *(ptr + media_type_len) ==
' ' ||
910 *(ptr + media_type_len) ==
'\t' || *(ptr + media_type_len) ==
';');
913 int check_metalink_content_type(
const char *content_type)
915 return check_content_type(content_type,
"application/metalink+xml");
922 for(res = mlfile->
resource; res; res = res->
next, ++count);
951 delete_metalink_checksum(mlfile->
checksum);
955 delete_metalink_resource(res);
966 delete_metalinkfile(mlfile);
973 #ifdef HAVE_NSS_CONTEXT 975 NSS_ShutdownContext(nss_context);
metalinkfile * metalinkfile_last
unsigned int digest_ctxtsize
unsigned int digest_resultlen
UNITTEST_START char * ptr
Curl_digest_init_func digest_init
struct GlobalConfig * global
UNITTEST_START int result
metalinkfile * metalinkfile_list
memcpy(filename, filename1, strlen(filename1))
Curl_digest_update_func digest_update
Curl_digest_final_func digest_final
struct OperationConfig * config
struct OperationConfig * next
CURL_EXTERN int curl_strequal(const char *s1, const char *s2)
#define Curl_safefree(ptr)
const digest_params * digest_hash
TFSIMD_FORCE_INLINE tfScalar length(const Quaternion &q)
CURL_EXTERN int curl_strnequal(const char *s1, const char *s2, size_t n)