STEP09x: 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)
committerStefan Metzmacher <metze@samba.org>
Mon, 10 Feb 2014 08:05:14 +0000 (09:05 +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>
librpc/rpc/dcerpc_util.c
librpc/rpc/rpc_common.h

index c6c4abd60d5b0f6ce794fe0f7ea46882303fae8c..3ecec6cf80d3be10b8b65add9a30a33814550361 100644 (file)
@@ -648,3 +648,59 @@ struct ndr_syntax_id dcerpc_construct_bind_time_features(uint64_t features)
 
        return s;
 }
+
+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 != v1->ptype) {
+               return false;
+       }
+
+       if (memcmp(v1->drep, v2->drep, sizeof(v1->drep)) != 0) {
+               return false;
+       }
+
+       if (v1->call_id != v1->call_id) {
+               return false;
+       }
+
+       if (v1->context_id != v1->context_id) {
+               return false;
+       }
+
+       if (v1->opnum != v1->opnum) {
+               return false;
+       }
+
+       return true;
+}
index bb73398c9c30327d3d1ca15383b71de711726bc3..2dad67f5abb025a97963f6dc0716e7d3d70e0282 100644 (file)
@@ -386,4 +386,27 @@ bool dcerpc_extract_bind_time_features(struct ndr_syntax_id syntax, uint64_t *fe
  */
 struct ndr_syntax_id dcerpc_construct_bind_time_features(uint64_t features);
 
+/**
+ * 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__ */