Skip to content

Commit

Permalink
Merge pull request google#8 from kiyoto-suzuki/feature/encryption_ver…
Browse files Browse the repository at this point in the history
…ify_string

add VerifyString for verifying encrypted string
  • Loading branch information
kiyoto-suzuki authored Dec 21, 2016
2 parents 0e05308 + 5b56af4 commit 3bf29d9
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 19 deletions.
22 changes: 15 additions & 7 deletions include/flatbuffers/flatbuffers.h
Original file line number Diff line number Diff line change
Expand Up @@ -1408,12 +1408,8 @@ class Verifier FLATBUFFERS_FINAL_CLASS {
return Verify(reinterpret_cast<const Vector<T> *>(vec));
}

#ifndef FLATBUFFERS_ENCRYPTION
// Verify a pointer (may be NULL) to string.
#ifdef FLATBUFFERS_ENCRYPTION
bool Verify(const std::shared_ptr<String> str) const {
return str != nullptr;
}
#else
bool Verify(const String *str) const {
const uint8_t *end;
return !str ||
Expand Down Expand Up @@ -1446,8 +1442,7 @@ class Verifier FLATBUFFERS_FINAL_CLASS {
for (uoffset_t i = 0; i < vec->size(); i++) {
const uint8_t* p = vec->Data() + sizeof(uoffset_t) * i;
auto v = reinterpret_cast<const Vector<char> *>(p + ReadScalar<uoffset_t>(p));
auto str = Xxtea::DecryptString(v);
if (!Verify(str)) return false;
return (v != nullptr);
}
}
return true;
Expand Down Expand Up @@ -1707,6 +1702,19 @@ class Table {
verifier.Verify<T>(data_ + field_offset);
}

#ifdef FLATBUFFERS_ENCRYPTION
bool VerifyString(const Verifier &verifier, voffset_t field) const {
(void)verifier;
auto field_offset = GetOptionalFieldOffset(field);
auto p = data_ + field_offset;
return ReadScalar<uoffset_t>(p) > 0;
}
#else
bool VerifyString(const Verifier &verifier, voffset_t field) const {
return verifier.Verify(GetString<const String *>(field));
}
#endif

private:
// private constructor & copy constructor: you obtain instances of this
// class by pointing to existing data only
Expand Down
16 changes: 8 additions & 8 deletions include/flatbuffers/reflection_generated.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,9 @@ struct KeyValue FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyFieldRequired<flatbuffers::uoffset_t>(verifier, VT_KEY) &&
verifier.Verify(key()) &&
VerifyString(verifier, VT_KEY) &&
VerifyField<flatbuffers::uoffset_t>(verifier, VT_VALUE) &&
verifier.Verify(value()) &&
VerifyString(verifier, VT_VALUE) &&
verifier.EndTable();
}
};
Expand Down Expand Up @@ -153,7 +153,7 @@ struct EnumVal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyFieldRequired<flatbuffers::uoffset_t>(verifier, VT_NAME) &&
verifier.Verify(name()) &&
VerifyString(verifier, VT_NAME) &&
VerifyField<int64_t>(verifier, VT_VALUE) &&
VerifyField<flatbuffers::uoffset_t>(verifier, VT_OBJECT) &&
verifier.VerifyTable(object()) &&
Expand Down Expand Up @@ -212,7 +212,7 @@ struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyFieldRequired<flatbuffers::uoffset_t>(verifier, VT_NAME) &&
verifier.Verify(name()) &&
VerifyString(verifier, VT_NAME) &&
VerifyFieldRequired<flatbuffers::uoffset_t>(verifier, VT_VALUES) &&
verifier.Verify(values()) &&
verifier.VerifyVectorOfTables(values()) &&
Expand Down Expand Up @@ -297,7 +297,7 @@ struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyFieldRequired<flatbuffers::uoffset_t>(verifier, VT_NAME) &&
verifier.Verify(name()) &&
VerifyString(verifier, VT_NAME) &&
VerifyFieldRequired<flatbuffers::uoffset_t>(verifier, VT_TYPE) &&
verifier.VerifyTable(type()) &&
VerifyField<uint16_t>(verifier, VT_ID) &&
Expand Down Expand Up @@ -396,7 +396,7 @@ struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyFieldRequired<flatbuffers::uoffset_t>(verifier, VT_NAME) &&
verifier.Verify(name()) &&
VerifyString(verifier, VT_NAME) &&
VerifyFieldRequired<flatbuffers::uoffset_t>(verifier, VT_FIELDS) &&
verifier.Verify(fields()) &&
verifier.VerifyVectorOfTables(fields()) &&
Expand Down Expand Up @@ -478,9 +478,9 @@ struct Schema FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
verifier.Verify(enums()) &&
verifier.VerifyVectorOfTables(enums()) &&
VerifyField<flatbuffers::uoffset_t>(verifier, VT_FILE_IDENT) &&
verifier.Verify(file_ident()) &&
VerifyString(verifier, VT_FILE_IDENT) &&
VerifyField<flatbuffers::uoffset_t>(verifier, VT_FILE_EXT) &&
verifier.Verify(file_ext()) &&
VerifyString(verifier, VT_FILE_EXT) &&
VerifyField<flatbuffers::uoffset_t>(verifier, VT_ROOT_TABLE) &&
verifier.VerifyTable(root_table()) &&
verifier.EndTable();
Expand Down
4 changes: 2 additions & 2 deletions samples/monster_generated.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
VerifyField<int16_t>(verifier, VT_MANA) &&
VerifyField<int16_t>(verifier, VT_HP) &&
VerifyField<flatbuffers::uoffset_t>(verifier, VT_NAME) &&
verifier.Verify(name()) &&
VerifyString(verifier, VT_NAME) &&
VerifyField<flatbuffers::uoffset_t>(verifier, VT_INVENTORY) &&
verifier.Verify(inventory()) &&
VerifyField<int8_t>(verifier, VT_COLOR) &&
Expand Down Expand Up @@ -230,7 +230,7 @@ struct Weapon FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<flatbuffers::uoffset_t>(verifier, VT_NAME) &&
verifier.Verify(name()) &&
VerifyString(verifier, VT_NAME) &&
VerifyField<int16_t>(verifier, VT_DAMAGE) &&
verifier.EndTable();
}
Expand Down
4 changes: 4 additions & 0 deletions src/idl_gen_cpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,11 @@ class CppGenerator : public BaseGenerator {
}
break;
case BASE_TYPE_STRING:
#ifdef FLATBUFFERS_ENCRYPTION
code += prefix + "VerifyString(verifier, " + GenFieldOffsetName(field) + ")";
#else
code += prefix + "verifier.Verify(" + field.name + "())";
#endif
break;
case BASE_TYPE_VECTOR:
code += prefix + "verifier.Verify(" + field.name + "())";
Expand Down
4 changes: 2 additions & 2 deletions tests/monster_test_generated.h
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ struct Stat FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<flatbuffers::uoffset_t>(verifier, VT_ID) &&
verifier.Verify(id()) &&
VerifyString(verifier, VT_ID) &&
VerifyField<int64_t>(verifier, VT_VAL) &&
VerifyField<uint16_t>(verifier, VT_COUNT) &&
verifier.EndTable();
Expand Down Expand Up @@ -410,7 +410,7 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
VerifyField<int16_t>(verifier, VT_MANA) &&
VerifyField<int16_t>(verifier, VT_HP) &&
VerifyFieldRequired<flatbuffers::uoffset_t>(verifier, VT_NAME) &&
verifier.Verify(name()) &&
VerifyString(verifier, VT_NAME) &&
VerifyField<flatbuffers::uoffset_t>(verifier, VT_INVENTORY) &&
verifier.Verify(inventory()) &&
VerifyField<int8_t>(verifier, VT_COLOR) &&
Expand Down

0 comments on commit 3bf29d9

Please sign in to comment.