static bool check_signed_file(const char *path)
{
- const int metadata_size = sizeof(signed_file.delta_size) + sizeof(signed_file.signature_size) + sizeof(signed_file.certificate_size) + MAGIC_NUMBER_SIZE;
+ const int metadata_size =
+ sizeof(signed_file.metadata.delta_size) +
+ sizeof(signed_file.metadata.signature_size) +
+ sizeof(signed_file.metadata.certificate_size) + MAGIC_NUMBER_SIZE;
int ret = -1;
_CLEANUP_CLOSE_ int signed_file_fd = -1;
long long int offset = (off_t)-1;
ASSERT_RETV(offset != (off_t)-1, false, "Failed to move file offset : %m");
// read also fills other members of signed_file
- ret = read(signed_file_fd, &signed_file.delta_size, metadata_size);
+ ret = read(signed_file_fd, &signed_file.metadata, metadata_size);
ASSERT_RETV(ret == metadata_size, false, "Failed to read metadata : %m");
// Check magic number
- _D("Magic number : %s", signed_file.magic_number);
+ _D("Magic number : %s", signed_file.metadata.magic_number);
- ret = memcmp(signed_file.magic_number, MAGIC_NUMBER, MAGIC_NUMBER_SIZE);
+ ret = memcmp(signed_file.metadata.magic_number, MAGIC_NUMBER, MAGIC_NUMBER_SIZE);
ASSERT_RETV(ret == 0, false, "Invalid magic number");
// Check file size
- _D("Delta size : %d", signed_file.delta_size);
- _D("Signature size : %d", signed_file.signature_size);
- _D("Certificate size : %d", signed_file.certificate_size);
+ _D("Delta size : %d", signed_file.metadata.delta_size);
+ _D("Signature size : %d", signed_file.metadata.signature_size);
+ _D("Certificate size : %d", signed_file.metadata.certificate_size);
- data_size = signed_file.delta_size + signed_file.signature_size + signed_file.certificate_size;
+ data_size = signed_file.metadata.delta_size +
+ signed_file.metadata.signature_size +
+ signed_file.metadata.certificate_size;
offset = lseek(signed_file_fd, -metadata_size, SEEK_END);
ASSERT_RETV(offset == data_size, false, "Invalid file size : Expected(%u), Real(%lld)", data_size, offset);
ASSERT_RETV(signed_file_fd != -1, errno, "Failed to open %s : %m", path);
// Read data
- offset = lseek(signed_file_fd, signed_file.delta_size, SEEK_SET);
+ offset = lseek(signed_file_fd, signed_file.metadata.delta_size, SEEK_SET);
ASSERT_RETV(offset != (off_t)-1, false, "Failed to move file offset : %m");
- signed_file.signature = malloc(signed_file.signature_size);
+ signed_file.signature = malloc(signed_file.metadata.signature_size);
ASSERT_RETV(signed_file.signature, ENOMEM, "Not enough memory");
- ret = read(signed_file_fd, signed_file.signature, signed_file.signature_size);
- ASSERT_RETV(ret >= 0 && (unsigned int)ret == signed_file.signature_size, errno, "Failed to read signature : %m");
+ ret = read(signed_file_fd, signed_file.signature, signed_file.metadata.signature_size);
+ ASSERT_RETV(ret >= 0 && (unsigned int)ret == signed_file.metadata.signature_size,
+ errno, "Failed to read signature : %m");
- signed_file.certificate = malloc(signed_file.certificate_size);
+ signed_file.certificate = malloc(signed_file.metadata.certificate_size);
ASSERT_RETV(signed_file.certificate, ENOMEM, "Not enough memory");
- ret = read(signed_file_fd, signed_file.certificate, signed_file.certificate_size);
- ASSERT_RETV(ret >= 0 && (unsigned int)ret == signed_file.certificate_size, errno, "Failed to read certificate : %m");
+ ret = read(signed_file_fd, signed_file.certificate, signed_file.metadata.certificate_size);
+ ASSERT_RETV(ret >= 0 && (unsigned int)ret == signed_file.metadata.certificate_size,
+ errno, "Failed to read certificate : %m");
return SUCCEED;
}
pcert = signed_file.certificate;
ASSERT_RETV(pcert, EINVAL, "Invalid certificate");
- signed_file_cert = d2i_X509(NULL, (const unsigned char **)&pcert, signed_file.certificate_size);
+ signed_file_cert = d2i_X509(NULL, (const unsigned char **)&pcert,
+ signed_file.metadata.certificate_size);
ASSERT_RETV(signed_file_cert, print_openssl_error(), "d2i_X509 failed");
// Reject the certificate same with CA
signed_file_fd = open(path, O_RDONLY);
ASSERT_RETV(signed_file_fd != -1, false, "Failed to open %s : %m", path);
- while (read_delta_size < signed_file.delta_size) {
+ while (read_delta_size < signed_file.metadata.delta_size) {
memset(delta_block, 0, sizeof(delta_block));
ret = read(signed_file_fd, delta_block, sizeof(delta_block));
ASSERT_RETV(ret != -1, errno, "Failed to read delta : %m");
}
// Decrypt signature and compare with hashed delta
- ret = EVP_DigestVerifyFinal(evp_md_ctx, signed_file.signature, signed_file.signature_size);
+ ret = EVP_DigestVerifyFinal(evp_md_ctx, signed_file.signature, signed_file.metadata.signature_size);
ASSERT_RETV(ret == 1, print_openssl_error(), "EVP_DigestVerifyFinal failed");
_I("Verify result : VALID");