mirror of
https://github.com/ipxe/ipxe
synced 2026-05-23 20:00:12 +03:00
05ad7833c5
Almost all image consumers do not need to modify the content of the image. Now that the image data is a pointer type (rather than the opaque userptr_t type), we can rely on the compiler to enforce this at build time. Change the .data field to be a const pointer, so that the compiler can verify that image consumers do not modify the image content. Provide a transparent .rwdata field for consumers who have a legitimate (and now explicit) reason to modify the image content. We do not attempt to impose any runtime restriction on checking whether or not an image is writable. The only existing instances of genuinely read-only images are the various unit test images, and it is acceptable for defective test cases to result in a segfault rather than a runtime error. Signed-off-by: Michael Brown <mcb30@ipxe.org>
96 lines
2.7 KiB
C
96 lines
2.7 KiB
C
/*
|
|
* Copyright (C) 2016 Michael Brown <mbrown@fensystems.co.uk>.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301, USA.
|
|
*
|
|
* You can also choose to distribute this program under the terms of
|
|
* the Unmodified Binary Distribution Licence (as given in the file
|
|
* COPYING.UBDL), provided that you have satisfied its requirements.
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|
|
|
/** @file
|
|
*
|
|
* ASN.1 self-tests
|
|
*
|
|
*/
|
|
|
|
/* Forcibly enable assertions */
|
|
#undef NDEBUG
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
#include <ipxe/image.h>
|
|
#include <ipxe/asn1.h>
|
|
#include <ipxe/test.h>
|
|
#include "asn1_test.h"
|
|
|
|
/**
|
|
* Report ASN.1 test result
|
|
*
|
|
* @v test ASN.1 test
|
|
* @v file Test code file
|
|
* @v line Test code line
|
|
*/
|
|
void asn1_okx ( struct asn1_test *test, const char *file, unsigned int line ) {
|
|
struct digest_algorithm *digest = &asn1_test_digest_algorithm;
|
|
struct asn1_cursor *cursor;
|
|
uint8_t ctx[digest->ctxsize];
|
|
uint8_t out[ASN1_TEST_DIGEST_SIZE];
|
|
unsigned int i;
|
|
size_t offset;
|
|
int next;
|
|
|
|
/* Sanity check */
|
|
assert ( sizeof ( out ) == digest->digestsize );
|
|
|
|
/* Check that image is detected as correct type */
|
|
okx ( register_image ( test->image ) == 0, file, line );
|
|
okx ( test->image->type == test->type, file, line );
|
|
|
|
/* Check that all ASN.1 objects can be extracted */
|
|
for ( offset = 0, i = 0 ; i < test->count ; offset = next, i++ ) {
|
|
|
|
/* Extract ASN.1 object */
|
|
next = image_asn1 ( test->image, offset, &cursor );
|
|
okx ( next >= 0, file, line );
|
|
okx ( ( ( size_t ) next ) > offset, file, line );
|
|
if ( next > 0 ) {
|
|
|
|
/* Calculate digest of ASN.1 object */
|
|
digest_init ( digest, ctx );
|
|
digest_update ( digest, ctx, cursor->data,
|
|
cursor->len );
|
|
digest_final ( digest, ctx, out );
|
|
|
|
/* Compare against expected digest */
|
|
okx ( memcmp ( out, test->expected[i].digest,
|
|
sizeof ( out ) ) == 0, file, line );
|
|
|
|
/* Free ASN.1 object */
|
|
free ( cursor );
|
|
}
|
|
}
|
|
|
|
/* Check that we have reached the end of the image */
|
|
okx ( offset == test->image->len, file, line );
|
|
|
|
/* Unregister image */
|
|
unregister_image ( test->image );
|
|
}
|