+/* Return the ID directly from the raw payload data. */
+
+void *silc_id_payload_parse_id(unsigned char *data, uint32 len)
+{
+ SilcBufferStruct buffer;
+ SilcIdType type;
+ uint16 idlen;
+ unsigned char *id_data = NULL;
+ int ret;
+ void *id;
+
+ silc_buffer_set(&buffer, data, len);
+
+ ret = silc_buffer_unformat(&buffer,
+ SILC_STR_UI_SHORT(&type),
+ SILC_STR_UI_SHORT(&idlen),
+ SILC_STR_END);
+ if (ret == -1)
+ goto err;
+
+ silc_buffer_pull(&buffer, 4);
+
+ if (idlen > buffer.len)
+ goto err;
+
+ ret = silc_buffer_unformat(&buffer,
+ SILC_STR_UI_XNSTRING_ALLOC(&id_data, idlen),
+ SILC_STR_END);
+ if (ret == -1)
+ goto err;
+
+ id = silc_id_str2id(id_data, idlen, type);
+ silc_free(id_data);
+ return id;
+
+ err:
+ return NULL;
+}
+