Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
Practical-Cryptdb
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Zhaozhen
Practical-Cryptdb
Commits
8a676116
Commit
8a676116
authored
Feb 27, 2018
by
yiwenshao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add comments
parent
d5b01d7f
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
19 additions
and
86 deletions
+19
-86
rewrite_const.cc
main/rewrite_const.cc
+4
-3
rewrite_field.cc
main/rewrite_field.cc
+3
-2
rewrite_func.cc
main/rewrite_func.cc
+1
-1
rewrite_main.hh
main/rewrite_main.hh
+1
-1
rewrite_sum.cc
main/rewrite_sum.cc
+1
-0
rewrite_util.cc
main/rewrite_util.cc
+9
-17
test_insertHandler.cc
test_main/test_insertHandler.cc
+0
-62
No files found.
main/rewrite_const.cc
View file @
8a676116
...
@@ -70,7 +70,7 @@ static class ANON : public CItemSubtypeIT<Item_string,
...
@@ -70,7 +70,7 @@ static class ANON : public CItemSubtypeIT<Item_string,
LOG
(
cdb_v
)
<<
"do_rewrite_type String item "
<<
i
<<
std
::
endl
;
LOG
(
cdb_v
)
<<
"do_rewrite_type String item "
<<
i
<<
std
::
endl
;
return
encrypt_item
(
i
,
constr
,
a
);
return
encrypt_item
(
i
,
constr
,
a
);
}
}
//Rewrite item_string in insert query.
virtual
void
virtual
void
do_rewrite_insert_type
(
const
Item_string
&
i
,
const
FieldMeta
&
fm
,
do_rewrite_insert_type
(
const
Item_string
&
i
,
const
FieldMeta
&
fm
,
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
...
@@ -97,7 +97,7 @@ static class ANON : public CItemSubtypeIT<Item_float,
...
@@ -97,7 +97,7 @@ static class ANON : public CItemSubtypeIT<Item_float,
LOG
(
cdb_v
)
<<
"do_rewrite_type Float item "
<<
i
<<
std
::
endl
;
LOG
(
cdb_v
)
<<
"do_rewrite_type Float item "
<<
i
<<
std
::
endl
;
return
encrypt_item
(
i
,
constr
,
a
);
return
encrypt_item
(
i
,
constr
,
a
);
}
}
//Rewrite item_float in insert query.
virtual
void
virtual
void
do_rewrite_insert_type
(
const
Item_float
&
i
,
const
FieldMeta
&
fm
,
do_rewrite_insert_type
(
const
Item_float
&
i
,
const
FieldMeta
&
fm
,
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
...
@@ -132,6 +132,7 @@ static class ANON : public CItemSubtypeIT<Item_int, Item::Type::INT_ITEM> {
...
@@ -132,6 +132,7 @@ static class ANON : public CItemSubtypeIT<Item_int, Item::Type::INT_ITEM> {
return
encrypt_item
(
i
,
constr
,
a
);
return
encrypt_item
(
i
,
constr
,
a
);
}
}
//Rewrite item_int in insert query.
virtual
void
virtual
void
do_rewrite_insert_type
(
const
Item_int
&
i
,
const
FieldMeta
&
fm
,
do_rewrite_insert_type
(
const
Item_int
&
i
,
const
FieldMeta
&
fm
,
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
...
@@ -166,7 +167,7 @@ static class ANON : public CItemSubtypeIT<Item_decimal,
...
@@ -166,7 +167,7 @@ static class ANON : public CItemSubtypeIT<Item_decimal,
return
encrypt_item
(
i
,
constr
,
a
);
return
encrypt_item
(
i
,
constr
,
a
);
}
}
//Rewrite item_decimal in insert query.
virtual
void
virtual
void
do_rewrite_insert_type
(
const
Item_decimal
&
i
,
const
FieldMeta
&
fm
,
do_rewrite_insert_type
(
const
Item_decimal
&
i
,
const
FieldMeta
&
fm
,
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
...
...
main/rewrite_field.cc
View file @
8a676116
...
@@ -59,7 +59,7 @@ deductPlainTableName(const std::string &field_name,
...
@@ -59,7 +59,7 @@ deductPlainTableName(const std::string &field_name,
return
deductPlainTableName
(
field_name
,
context
->
outer_context
,
a
);
return
deductPlainTableName
(
field_name
,
context
->
outer_context
,
a
);
}
}
//
对于select的选择域, 由于是FIELD_ITEM类型, 会使用到这个类的
.
//
In 'select fields from table', fields has the type FIELD_ITEM, which can be rewritten by this class
.
class
ANON
:
public
CItemSubtypeIT
<
Item_field
,
Item
::
Type
::
FIELD_ITEM
>
{
class
ANON
:
public
CItemSubtypeIT
<
Item_field
,
Item
::
Type
::
FIELD_ITEM
>
{
virtual
RewritePlan
*
virtual
RewritePlan
*
do_gather_type
(
const
Item_field
&
i
,
Analysis
&
a
)
const
do_gather_type
(
const
Item_field
&
i
,
Analysis
&
a
)
const
...
@@ -79,7 +79,7 @@ class ANON : public CItemSubtypeIT<Item_field, Item::Type::FIELD_ITEM> {
...
@@ -79,7 +79,7 @@ class ANON : public CItemSubtypeIT<Item_field, Item::Type::FIELD_ITEM> {
return
new
RewritePlan
(
es
,
rsn
);
return
new
RewritePlan
(
es
,
rsn
);
}
}
//
select的选择域rewrite的时候会用到, 从全局的rewrite调用
.
//
'select fields from table.'; fields can be rewritten by this function
.
virtual
Item
*
virtual
Item
*
do_rewrite_type
(
const
Item_field
&
i
,
const
OLK
&
constr
,
do_rewrite_type
(
const
Item_field
&
i
,
const
OLK
&
constr
,
const
RewritePlan
&
rp
,
Analysis
&
a
)
const
RewritePlan
&
rp
,
Analysis
&
a
)
...
@@ -137,6 +137,7 @@ class ANON : public CItemSubtypeIT<Item_field, Item::Type::FIELD_ITEM> {
...
@@ -137,6 +137,7 @@ class ANON : public CItemSubtypeIT<Item_field, Item::Type::FIELD_ITEM> {
return
res
;
return
res
;
}
}
//'insert into fields values xxx'; fields can be rewritten by this function.
virtual
void
virtual
void
do_rewrite_insert_type
(
const
Item_field
&
i
,
const
FieldMeta
&
fm
,
do_rewrite_insert_type
(
const
Item_field
&
i
,
const
FieldMeta
&
fm
,
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
...
...
main/rewrite_func.cc
View file @
8a676116
...
@@ -203,7 +203,7 @@ static class ANON : public CItemSubtypeFT<Item_func_neg, Item_func::Functype::NE
...
@@ -203,7 +203,7 @@ static class ANON : public CItemSubtypeFT<Item_func_neg, Item_func::Functype::NE
{
{
return
do_optimize_type_self_and_args
(
i
,
a
);
return
do_optimize_type_self_and_args
(
i
,
a
);
}
}
//Rewrite item_func_neg in insert query.
virtual
void
virtual
void
do_rewrite_insert_type
(
const
Item_func_neg
&
i
,
const
FieldMeta
&
fm
,
do_rewrite_insert_type
(
const
Item_func_neg
&
i
,
const
FieldMeta
&
fm
,
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
...
...
main/rewrite_main.hh
View file @
8a676116
...
@@ -135,7 +135,7 @@ class CItemSubtype : public CItemType {
...
@@ -135,7 +135,7 @@ class CItemSubtype : public CItemType {
{
{
return
do_rewrite_type
(
static_cast
<
const
T
&>
(
i
),
constr
,
rp
,
a
);
return
do_rewrite_type
(
static_cast
<
const
T
&>
(
i
),
constr
,
rp
,
a
);
}
}
//Rewrite item. If the item is item_field, then rewrite the name and add salt if needed.
virtual
void
do_rewrite_insert
(
const
Item
&
i
,
const
FieldMeta
&
fm
,
virtual
void
do_rewrite_insert
(
const
Item
&
i
,
const
FieldMeta
&
fm
,
Analysis
&
a
,
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
std
::
vector
<
Item
*>
*
l
)
const
...
...
main/rewrite_sum.cc
View file @
8a676116
...
@@ -378,6 +378,7 @@ static class ANON : public CItemSubtypeIT<Item_null, Item::Type::NULL_ITEM> {
...
@@ -378,6 +378,7 @@ static class ANON : public CItemSubtypeIT<Item_null, Item::Type::NULL_ITEM> {
return
RiboldMYSQL
::
clone_item
(
i
);
return
RiboldMYSQL
::
clone_item
(
i
);
}
}
//rewrite item null in insert query.
virtual
void
virtual
void
do_rewrite_insert_type
(
const
Item_null
&
i
,
const
FieldMeta
&
fm
,
do_rewrite_insert_type
(
const
Item_null
&
i
,
const
FieldMeta
&
fm
,
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
const
...
...
main/rewrite_util.cc
View file @
8a676116
...
@@ -634,14 +634,12 @@ Item *
...
@@ -634,14 +634,12 @@ Item *
encrypt_item_layers
(
const
Item
&
i
,
onion
o
,
const
OnionMeta
&
om
,
encrypt_item_layers
(
const
Item
&
i
,
onion
o
,
const
OnionMeta
&
om
,
const
Analysis
&
a
,
uint64_t
IV
)
{
const
Analysis
&
a
,
uint64_t
IV
)
{
assert
(
!
RiboldMYSQL
::
is_null
(
i
));
assert
(
!
RiboldMYSQL
::
is_null
(
i
));
//这里是onionMeta中的vector, enclayers.也就是洋葱不同层次的加解密通过Onionmeta以及
//enc_layers is stored in onionMeta actually.
//encLary中的加解密算法来完成.
const
auto
&
enc_layers
=
a
.
getEncLayers
(
om
);
const
auto
&
enc_layers
=
a
.
getEncLayers
(
om
);
assert_s
(
enc_layers
.
size
()
>
0
,
"onion must have at least one layer"
);
assert_s
(
enc_layers
.
size
()
>
0
,
"onion must have at least one layer"
);
const
Item
*
enc
=
&
i
;
const
Item
*
enc
=
&
i
;
Item
*
new_enc
=
NULL
;
Item
*
new_enc
=
NULL
;
//这段代码体现了层次加密,也就是说, 通过IV,每个洋葱的层次通过enclayer来表示
//This is layers of encryption
//直接调用其加密和解密函数, 就可以完成加密工作. 加密以后获得的是Item,最后返回加密以后的结果
for
(
const
auto
&
it
:
enc_layers
)
{
for
(
const
auto
&
it
:
enc_layers
)
{
LOG
(
encl
)
<<
"encrypt layer "
LOG
(
encl
)
<<
"encrypt layer "
<<
TypeText
<
SECLEVEL
>::
toText
(
it
->
level
())
<<
"
\n
"
;
<<
TypeText
<
SECLEVEL
>::
toText
(
it
->
level
())
<<
"
\n
"
;
...
@@ -671,31 +669,25 @@ void
...
@@ -671,31 +669,25 @@ void
encrypt_item_all_onions
(
const
Item
&
i
,
const
FieldMeta
&
fm
,
encrypt_item_all_onions
(
const
Item
&
i
,
const
FieldMeta
&
fm
,
uint64_t
IV
,
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
uint64_t
IV
,
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
{
{
for
(
auto
it
:
fm
.
orderedOnionMetas
())
{
//each fieldmeta represents a field, which contains many onions. The onions are stored as
//kv pairs in the form <onionmetekey,onoinmeta>. onionmetakey is the enum type of the onion,
//and the value is the onionmeta.
for
(
auto
it
:
fm
.
orderedOnionMetas
())
{
const
onion
o
=
it
.
first
->
getValue
();
const
onion
o
=
it
.
first
->
getValue
();
OnionMeta
*
const
om
=
it
.
second
;
OnionMeta
*
const
om
=
it
.
second
;
//一个fieldmeta表示一个field, 内部的不同洋葱表现在onionMeta,每个onionMeta的不同层次表现
//om can be NULL for backup workload
//在enclyer. 而保持的时候, 是onometekey,onoinmeta这种pair来让我们知道这个onionMeta是哪种
if
(
om
!=
NULL
)
//枚举的洋葱类型.
if
(
om
!=
NULL
)
//om could be NULL for backup workload
l
->
push_back
(
encrypt_item_layers
(
i
,
o
,
*
om
,
a
,
IV
));
l
->
push_back
(
encrypt_item_layers
(
i
,
o
,
*
om
,
a
,
IV
));
else
l
->
push_back
(
NULL
);
else
l
->
push_back
(
NULL
);
}
}
}
}
//Called by do_rewrite_insert_type
void
void
typical_rewrite_insert_type
(
const
Item
&
i
,
const
FieldMeta
&
fm
,
typical_rewrite_insert_type
(
const
Item
&
i
,
const
FieldMeta
&
fm
,
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
{
Analysis
&
a
,
std
::
vector
<
Item
*>
*
l
)
{
const
uint64_t
salt
=
fm
.
getHasSalt
()
?
randomValue
()
:
0
;
const
uint64_t
salt
=
fm
.
getHasSalt
()
?
randomValue
()
:
0
;
encrypt_item_all_onions
(
i
,
fm
,
salt
,
a
,
l
);
encrypt_item_all_onions
(
i
,
fm
,
salt
,
a
,
l
);
//对于每种类型, 除了保存加密的洋葱, 还把fm中的salt也变成Int类型保存起来了, 所以会出现奇怪的多了一组数据的情况, 就看
//这个东西是什么时候应用.
if
(
fm
.
getHasSalt
())
{
if
(
fm
.
getHasSalt
())
{
l
->
push_back
(
new
Item_int
(
static_cast
<
ulonglong
>
(
salt
)));
l
->
push_back
(
new
Item_int
(
static_cast
<
ulonglong
>
(
salt
)));
}
}
...
...
test_main/test_insertHandler.cc
deleted
100644 → 0
View file @
d5b01d7f
#include <iostream>
#include <vector>
#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <main/Connect.hh>
#include <main/rewrite_util.hh>
#include <main/sql_handler.hh>
#include <main/dml_handler.hh>
#include <main/ddl_handler.hh>
#include <main/CryptoHandlers.hh>
static
std
::
string
embeddedDir
=
"/t/cryt/shadow"
;
static
void
testInsertHandler
(
std
::
string
query
){
std
::
unique_ptr
<
Connect
>
e_conn
(
Connect
::
getEmbedded
(
embeddedDir
));
std
::
unique_ptr
<
SchemaInfo
>
schema
(
new
SchemaInfo
());
std
::
function
<
DBMeta
*
(
DBMeta
*
const
)
>
loadChildren
=
[
&
loadChildren
,
&
e_conn
](
DBMeta
*
const
parent
)
{
auto
kids
=
parent
->
fetchChildren
(
e_conn
);
for
(
auto
it
:
kids
)
{
loadChildren
(
it
);
}
return
parent
;
};
//load all metadata and then store it in schema
loadChildren
(
schema
.
get
());
const
std
::
unique_ptr
<
AES_KEY
>
&
TK
=
std
::
unique_ptr
<
AES_KEY
>
(
getKey
(
std
::
string
(
"113341234"
)));
//just like what we do in Rewrite::rewrite,dispatchOnLex
Analysis
analysis
(
std
::
string
(
"tdb"
),
*
schema
,
TK
,
SECURITY_RATING
::
SENSITIVE
);
DMLHandler
*
h
=
new
InsertHandler
();
std
::
unique_ptr
<
query_parse
>
p
;
p
=
std
::
unique_ptr
<
query_parse
>
(
new
query_parse
(
"tdb"
,
query
));
LEX
*
const
lex
=
p
->
lex
();
auto
executor
=
h
->
transformLex
(
analysis
,
lex
);
std
::
cout
<<
((
DMLQueryExecutor
*
)
executor
)
->
getQuery
()
<<
std
::
endl
;
}
int
main
()
{
char
*
buffer
;
if
((
buffer
=
getcwd
(
NULL
,
0
))
==
NULL
){
perror
(
"getcwd error"
);
}
embeddedDir
=
std
::
string
(
buffer
)
+
"/shadow"
;
const
std
::
string
master_key
=
"113341234"
;
ConnectionInfo
ci
(
"localhost"
,
"root"
,
"letmein"
,
3306
);
SharedProxyState
*
shared_ps
=
new
SharedProxyState
(
ci
,
embeddedDir
,
master_key
,
determineSecurityRating
());
assert
(
shared_ps
!=
NULL
);
std
::
string
query1
=
"insert into student values(NULL)"
;
std
::
vector
<
std
::
string
>
querys
{
query1
};
for
(
auto
item
:
querys
){
std
::
cout
<<
item
<<
std
::
endl
;
testInsertHandler
(
item
);
std
::
cout
<<
std
::
endl
;
}
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment