mirror of https://github.com/ipxe/ipxe.git
[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>pull/64/head
parent
e5bfa107ba
commit
b506528c1e
|
@ -9,7 +9,9 @@
|
||||||
|
|
||||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <assert.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <ipxe/tables.h>
|
#include <ipxe/tables.h>
|
||||||
|
|
||||||
|
@ -337,6 +339,28 @@ asn1_type ( const struct asn1_cursor *cursor ) {
|
||||||
return ( ( cursor->len >= sizeof ( *type ) ) ? *type : ASN1_END );
|
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,
|
extern int asn1_start ( struct asn1_cursor *cursor, unsigned int type,
|
||||||
size_t extra );
|
size_t extra );
|
||||||
extern int asn1_enter ( struct asn1_cursor *cursor, unsigned int type );
|
extern int asn1_enter ( struct asn1_cursor *cursor, unsigned int type );
|
||||||
|
|
Loading…
Reference in New Issue