}
#endif /* CURL_HAS_WEBSOCKETS */
+/*
+ This function checks if the digests match (if set up)
+*/
+static int pakfire_xfer_verify(struct pakfire_xfer* self) {
+ char* computed_hexdigest = NULL;
+ char* expected_hexdigest = NULL;
+ int r;
+
+ // Nothing to do if there is no EVP
+ if (!self->evp)
+ return 0;
+
+ // Finish message digest computation
+ r = EVP_DigestFinal_ex(self->evp, self->computed_digest, &self->computed_digest_length);
+ if (r != 1) {
+ ERROR(self->ctx, "Could not finish message digest computation: %s\n",
+ ERR_error_string(ERR_get_error(), NULL));
+ r = -EBADMSG;
+ goto ERROR;
+ }
+
+ // Compare the hexdigests
+ r = CRYPTO_memcmp(self->computed_digest, self->expected_digest, self->computed_digest_length);
+
+ // If they don't match, log the error
+ if (r) {
+ // Format the expected hexdigest
+ computed_hexdigest = __pakfire_hexlify(self->computed_digest, self->computed_digest_length);
+ expected_hexdigest = __pakfire_hexlify(self->expected_digest, self->expected_digest_length);
+
+ ERROR(self->ctx, "Download checksum for %s didn't match:\n", self->effective_url);
+ ERROR(self->ctx, " Expected: %s\n", expected_hexdigest);
+ ERROR(self->ctx, " Computed: %s\n", computed_hexdigest);
+
+ // Make this download fail
+ r = pakfire_xfer_fail(self, PAKFIRE_XFER_DIGEST_MISMATCH);
+ if (r < 0)
+ goto ERROR;
+ }
+
+ERROR:
+ if (computed_hexdigest)
+ free(computed_hexdigest);
+ if (expected_hexdigest)
+ free(expected_hexdigest);
+
+ return r;
+}
+
static int pakfire_xfer_save(struct pakfire_xfer* xfer) {
int fd = -EBADF;
int r;
if (upload_speed)
DEBUG(xfer->ctx, " Upload Speed: %ld bps\n", upload_speed);
- // Check if digests match
- if (xfer->evp) {
- // Finish message digest computation
- r = EVP_DigestFinal_ex(xfer->evp, xfer->computed_digest, &xfer->computed_digest_length);
- if (r != 1) {
- ERROR(xfer->ctx, "Could not finish message digest computation: %s\n",
- ERR_error_string(ERR_get_error(), NULL));
- r = -EBADMSG;
- goto ERROR;
- }
-
- // Message Digest
- char* hexdigest = __pakfire_hexlify(xfer->computed_digest, xfer->computed_digest_length);
- if (hexdigest) {
- DEBUG(xfer->ctx, " Message Digest: %s\n", hexdigest);
- free(hexdigest);
- }
-
- r = CRYPTO_memcmp(xfer->computed_digest, xfer->expected_digest,
- xfer->computed_digest_length);
-
- // If they don't match, log the error
- if (r) {
- char* computed_hexdigest = __pakfire_hexlify(xfer->computed_digest,
- xfer->computed_digest_length);
- char* expected_hexdigest = __pakfire_hexlify(xfer->expected_digest,
- xfer->expected_digest_length);
-
- ERROR(xfer->ctx, "Download checksum for %s didn't match:\n", xfer->effective_url);
- ERROR(xfer->ctx, " Expected: %s\n", expected_hexdigest);
- ERROR(xfer->ctx, " Computed: %s\n", computed_hexdigest);
-
- if (computed_hexdigest)
- free(computed_hexdigest);
- if (expected_hexdigest)
- free(expected_hexdigest);
-
- // Make this download fail
- r = pakfire_xfer_fail(xfer, PAKFIRE_XFER_DIGEST_MISMATCH);
- if (r)
- goto ERROR;
- }
- }
-
// All okay?
if (code == CURLE_OK) {
- // Handle actions for different transfer types
switch (xfer->direction) {
case PAKFIRE_XFER_DOWNLOAD:
+ // Verify the received payload
+ r = pakfire_xfer_verify(xfer);
+ if (r < 0)
+ goto ERROR;
+
+ // Save the payload
r = pakfire_xfer_save(xfer);
- if (r)
+ if (r < 0)
goto ERROR;
break;
#ifdef CURL_HAS_WEBSOCKETS
case PAKFIRE_XFER_SOCKET:
r = pakfire_xfer_done_socket(xfer, code);
- if (r)
+ if (r < 0)
goto ERROR;
#endif /* CURL_HAS_WEBSOCKETS */
// Report that something went wrong
r = pakfire_xfer_fail(xfer, code);
- if (r)
+ if (r < 0)
goto ERROR;
}