summaryrefslogtreecommitdiff
path: root/transform.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2015-02-12 14:34:50 -0500
committerRusty Wagner <rusty@vector35.com>2015-02-12 14:34:50 -0500
commit83b01dd50407731d14938ac96894c3a4d9065295 (patch)
tree2e3ded7103b51aef0d5cd22434e35f4461aeaeba /transform.cpp
parent6b431b32e32f00f9203ba2a4ca07cc962cdb22aa (diff)
Place API code with the associated class
Diffstat (limited to 'transform.cpp')
-rw-r--r--transform.cpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/transform.cpp b/transform.cpp
new file mode 100644
index 00000000..4f8fe71d
--- /dev/null
+++ b/transform.cpp
@@ -0,0 +1,242 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+Transform::Transform(BNTransform* xform): m_xform(xform)
+{
+}
+
+
+Transform::Transform(BNTransformType type, const string& name, const string& longName):
+ m_xform(nullptr), m_typeForRegister(type), m_nameForRegister(name), m_longNameForRegister(longName)
+{
+}
+
+
+BNTransformParameterInfo* Transform::GetParametersCallback(void* ctxt, size_t* count)
+{
+ Transform* xform = (Transform*)ctxt;
+ vector<TransformParameter> params = xform->GetParameters();
+ *count = params.size();
+ BNTransformParameterInfo* result = new BNTransformParameterInfo[params.size()];
+
+ for (size_t i = 0; i < params.size(); i++)
+ {
+ result[i].name = BNAllocString(params[i].name.c_str());
+ result[i].longName = BNAllocString(params[i].longName.c_str());
+ result[i].fixedLength = params[i].fixedLength;
+ }
+
+ return result;
+}
+
+
+void Transform::FreeParametersCallback(BNTransformParameterInfo* params, size_t count)
+{
+ for (size_t i = 0; i < count; i++)
+ {
+ BNFreeString(params[i].name);
+ BNFreeString(params[i].longName);
+ }
+ delete[] params;
+}
+
+
+bool Transform::DecodeCallback(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount)
+{
+ map<string, DataBuffer> paramMap;
+ for (size_t i = 0; i < paramCount; i++)
+ paramMap[params[i].name] = DataBuffer(BNDuplicateDataBuffer(params[i].value));
+
+ DataBuffer inputBuf(BNDuplicateDataBuffer(input));
+ DataBuffer outputBuf;
+
+ Transform* xform = (Transform*)ctxt;
+ bool result = xform->Decode(inputBuf, outputBuf, paramMap);
+ BNAssignDataBuffer(output, outputBuf.GetBufferObject());
+ return result;
+}
+
+
+bool Transform::EncodeCallback(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount)
+{
+ map<string, DataBuffer> paramMap;
+ for (size_t i = 0; i < paramCount; i++)
+ paramMap[params[i].name] = DataBuffer(BNDuplicateDataBuffer(params[i].value));
+
+ DataBuffer inputBuf(BNDuplicateDataBuffer(input));
+ DataBuffer outputBuf;
+
+ Transform* xform = (Transform*)ctxt;
+ bool result = xform->Encode(inputBuf, outputBuf, paramMap);
+ BNAssignDataBuffer(output, outputBuf.GetBufferObject());
+ return result;
+}
+
+
+vector<TransformParameter> Transform::EncryptionKeyParameters(size_t fixedKeyLength)
+{
+ vector<TransformParameter> params;
+ TransformParameter key;
+ key.name = "key";
+ key.longName = "Encryption key";
+ key.fixedLength = fixedKeyLength;
+ params.push_back(key);
+ return params;
+}
+
+
+vector<TransformParameter> Transform::EncryptionKeyAndIVParameters(size_t fixedKeyLength, size_t fixedIVLength)
+{
+ vector<TransformParameter> params;
+ TransformParameter key, iv;
+ key.name = "key";
+ key.longName = "Encryption key";
+ key.fixedLength = fixedKeyLength;
+ iv.name = "iv";
+ iv.longName = "Initialization vector";
+ iv.fixedLength = fixedIVLength;
+ params.push_back(key);
+ params.push_back(iv);
+ return params;
+}
+
+
+void Transform::Register(Transform* xform)
+{
+ BNCustomTransform callbacks;
+ callbacks.context = xform;
+ callbacks.getParameters = GetParametersCallback;
+ callbacks.freeParameters = FreeParametersCallback;
+ callbacks.decode = DecodeCallback;
+ callbacks.encode = EncodeCallback;
+ xform->m_xform = BNRegisterTransformType(xform->m_typeForRegister, xform->m_nameForRegister.c_str(),
+ xform->m_longNameForRegister.c_str(), &callbacks);
+}
+
+
+Ref<Transform> Transform::GetByName(const string& name)
+{
+ BNTransform* result = BNGetTransformByName(name.c_str());
+ if (!result)
+ return nullptr;
+ return new CoreTransform(result);
+}
+
+
+vector<Ref<Transform>> Transform::GetTransformTypes()
+{
+ size_t count;
+ BNTransform** list = BNGetTransformTypeList(&count);
+
+ vector<Ref<Transform>> result;
+ for (size_t i = 0; i < count; i++)
+ result.push_back(new CoreTransform(BNNewTransformReference(list[i])));
+
+ BNFreeTransformTypeList(list, count);
+ return result;
+}
+
+
+BNTransformType Transform::GetType() const
+{
+ return BNGetTransformType(m_xform);
+}
+
+
+string Transform::GetName() const
+{
+ char* name = BNGetTransformName(m_xform);
+ string result = name;
+ BNFreeString(name);
+ return result;
+}
+
+
+string Transform::GetLongName() const
+{
+ char* name = BNGetTransformLongName(m_xform);
+ string result = name;
+ BNFreeString(name);
+ return result;
+}
+
+
+vector<TransformParameter> Transform::GetParameters() const
+{
+ return vector<TransformParameter>();
+}
+
+
+bool Transform::Decode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params)
+{
+ if (GetType() == InvertingTransform)
+ return Encode(input, output, params);
+ return false;
+}
+
+
+bool Transform::Encode(const DataBuffer&, DataBuffer&, const map<string, DataBuffer>&)
+{
+ return false;
+}
+
+
+CoreTransform::CoreTransform(BNTransform* xform): Transform(xform)
+{
+}
+
+
+vector<TransformParameter> CoreTransform::GetParameters() const
+{
+ size_t count;
+ BNTransformParameterInfo* list = BNGetTransformParameterList(m_xform, &count);
+
+ vector<TransformParameter> result;
+ for (size_t i = 0; i < count; i++)
+ {
+ TransformParameter param;
+ param.name = list[i].name;
+ param.longName = list[i].longName;
+ param.fixedLength = list[i].fixedLength;
+ }
+
+ BNFreeTransformParameterList(list, count);
+ return result;
+}
+
+
+bool CoreTransform::Decode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params)
+{
+ BNTransformParameter* list = new BNTransformParameter[params.size()];
+ size_t idx = 0;
+ for (auto i : params)
+ {
+ list[idx].name = i.first.c_str();
+ list[idx].value = i.second.GetBufferObject();
+ }
+
+ bool result = BNDecode(m_xform, input.GetBufferObject(), output.GetBufferObject(), list, idx);
+
+ delete[] list;
+ return result;
+}
+
+
+bool CoreTransform::Encode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params)
+{
+ BNTransformParameter* list = new BNTransformParameter[params.size()];
+ size_t idx = 0;
+ for (auto i : params)
+ {
+ list[idx].name = i.first.c_str();
+ list[idx].value = i.second.GetBufferObject();
+ }
+
+ bool result = BNEncode(m_xform, input.GetBufferObject(), output.GetBufferObject(), list, idx);
+
+ delete[] list;
+ return result;
+}