librpc/rpc: add dcerpc_sec_vt_header2_[from_ncacn_packet|equal]()
authorGregor Beck <gbeck@sernet.de>
Mon, 13 Jan 2014 12:33:09 +0000 (13:33 +0100)
committerGünther Deschner <gd@samba.org>
Tue, 11 Feb 2014 15:02:14 +0000 (16:02 +0100)
Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>

Signed-off-by: Gregor Beck <gbeck@sernet.de>
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
librpc/rpc/dcerpc_util.c
librpc/rpc/rpc_common.h

index 575b3a2007e7aedf52c0f7466d97c299771ad628..425e748116a91aada48857e770ba8c1b70bd1c10 100644 (file)
@@ -393,3 +393,59 @@ const char *dcerpc_default_transport_endpoint(TALLOC_CTX *mem_ctx,
        talloc_free(frame);
        return endpoint;
 }
+
+struct dcerpc_sec_vt_header2 dcerpc_sec_vt_header2_from_ncacn_packet(const struct ncacn_packet *pkt)
+{
+       struct dcerpc_sec_vt_header2 ret;
+
+       ZERO_STRUCT(ret);
+       ret.ptype = pkt->ptype;
+       memcpy(&ret.drep, pkt->drep, sizeof(ret.drep));
+       ret.call_id = pkt->call_id;
+
+       switch (pkt->ptype) {
+       case DCERPC_PKT_REQUEST:
+               ret.context_id = pkt->u.request.context_id;
+               ret.opnum      = pkt->u.request.opnum;
+               break;
+
+       case DCERPC_PKT_RESPONSE:
+               ret.context_id = pkt->u.response.context_id;
+               break;
+
+       case DCERPC_PKT_FAULT:
+               ret.context_id = pkt->u.fault.context_id;
+               break;
+
+       default:
+               break;
+       }
+
+       return ret;
+}
+
+bool dcerpc_sec_vt_header2_equal(const struct dcerpc_sec_vt_header2 *v1,
+                                const struct dcerpc_sec_vt_header2 *v2)
+{
+       if (v1->ptype != v2->ptype) {
+               return false;
+       }
+
+       if (memcmp(v1->drep, v2->drep, sizeof(v1->drep)) != 0) {
+               return false;
+       }
+
+       if (v1->call_id != v2->call_id) {
+               return false;
+       }
+
+       if (v1->context_id != v2->context_id) {
+               return false;
+       }
+
+       if (v1->opnum != v2->opnum) {
+               return false;
+       }
+
+       return true;
+}
index 93d3bb493d12776d20d212d5407a35008922a7f7..aab7c1001d2994c769af61a9822fb59a0d2a36ed 100644 (file)
@@ -315,4 +315,27 @@ NTSTATUS dcerpc_binding_handle_call(struct dcerpc_binding_handle *h,
                                    TALLOC_CTX *r_mem,
                                    void *r_ptr);
 
+/**
+ * Extract header information from a ncacn_packet
+ * as a dcerpc_sec_vt_header2 as used by the security verification trailer.
+ *
+ * @param[in] pkt a packet
+ *
+ * @return a dcerpc_sec_vt_header2
+ */
+struct dcerpc_sec_vt_header2 dcerpc_sec_vt_header2_from_ncacn_packet(const struct ncacn_packet *pkt);
+
+
+/**
+ * Test if two dcerpc_sec_vt_header2 structures are equal
+ * without consideration of reserved fields.
+ *
+ * @param v1 a pointer to a dcerpc_sec_vt_header2 structure
+ * @param v2 a pointer to a dcerpc_sec_vt_header2 structure
+ *
+ * @retval true if *v1 equals *v2
+ */
+bool dcerpc_sec_vt_header2_equal(const struct dcerpc_sec_vt_header2 *v1,
+                                const struct dcerpc_sec_vt_header2 *v2);
+
 #endif /* __DEFAULT_LIBRPC_RPCCOMMON_H__ */