david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[crypto] Provide asn1_built() to construct a cursor from a builder

Our ASN.1 parsing code uses a struct asn1_cursor, while the object
construction code uses a struct asn1_builder.  These structures are
identical apart from the const modifier applied to the data pointer in
struct asn1_cursor.

Provide asn1_built() to safely typecast a struct asn1_builder to a
struct asn1_cursor, allowing constructed objects to be passed to
functions expecting a struct asn1_cursor.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2017-06-13 12:12:11 +01:00
parent e5bfa107ba
commit b506528c1e
1 changed files with 24 additions and 0 deletions

View File

@ -9,7 +9,9 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <stddef.h>
#include <stdint.h>
#include <assert.h>
#include <time.h>
#include <ipxe/tables.h>
@ -337,6 +339,28 @@ asn1_type ( const struct asn1_cursor *cursor ) {
return ( ( cursor->len >= sizeof ( *type ) ) ? *type : ASN1_END );
}
/**
* Get cursor for built object
*
* @v builder ASN.1 object builder
* @ret cursor ASN.1 object cursor
*/
static inline __attribute__ (( always_inline )) struct asn1_cursor *
asn1_built ( struct asn1_builder *builder ) {
union {
struct asn1_builder builder;
struct asn1_cursor cursor;
} *u = container_of ( builder, typeof ( *u ), builder );
/* Sanity check */
linker_assert ( ( ( const void * ) &u->builder.data ) ==
&u->cursor.data, asn1_builder_cursor_data_mismatch );
linker_assert ( &u->builder.len == &u->cursor.len,
asn1_builder_cursor_len_mismatch );
return &u->cursor;
}
extern int asn1_start ( struct asn1_cursor *cursor, unsigned int type,
size_t extra );
extern int asn1_enter ( struct asn1_cursor *cursor, unsigned int type );