+void
+NULL_free(const asn_TYPE_descriptor_t *td, void *ptr,
+ enum asn_struct_free_method method) {
+ if(td && ptr) {
+ switch(method) {
+ case ASFM_FREE_EVERYTHING:
+ FREEMEM(ptr);
+ break;
+ case ASFM_FREE_UNDERLYING:
+ break;
+ case ASFM_FREE_UNDERLYING_AND_RESET:
+ memset(ptr, 0, sizeof(NULL_t));
+ break;
+ }
+ }
+}
+
+/*
+ * Decode NULL type.
+ */
+asn_dec_rval_t
+NULL_decode_ber(const asn_codec_ctx_t *opt_codec_ctx,
+ const asn_TYPE_descriptor_t *td, void **bool_value,
+ const void *buf_ptr, size_t size, int tag_mode) {
+ NULL_t *st = (NULL_t *)*bool_value;
+ asn_dec_rval_t rval;
+ ber_tlv_len_t length;
+
+ if(st == NULL) {
+ st = (NULL_t *)(*bool_value = CALLOC(1, sizeof(*st)));
+ if(st == NULL) {
+ rval.code = RC_FAIL;
+ rval.consumed = 0;
+ return rval;
+ }
+ }
+
+ ASN_DEBUG("Decoding %s as NULL (tm=%d)", td->name, tag_mode);
+
+ /*
+ * Check tags.
+ */
+ rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, tag_mode, 0,
+ &length, 0);
+ if(rval.code != RC_OK) {
+ return rval;
+ }
+
+ // X.690-201508, #8.8.2, length shall be zero.
+ if(length != 0) {
+ ASN_DEBUG("Decoding %s as NULL failed: too much data", td->name);
+ rval.code = RC_FAIL;
+ rval.consumed = 0;
+ return rval;
+ }
+
+ return rval;
+}
+