Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
libdap-crypto
Manage
Activity
Members
Labels
Plan
Issues
0
Issue boards
Milestones
Wiki
Code
Merge requests
2
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
cellframe
libdap-crypto
Commits
5337a6cb
Commit
5337a6cb
authored
4 years ago
by
Roman Khlopkov
🔜
Committed by
dmitriy.gerasimov
4 years ago
Browse files
Options
Downloads
Patches
Plain Diff
support-3409
parent
e012b3aa
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
include/dap_sign.h
+10
-9
10 additions, 9 deletions
include/dap_sign.h
src/dap_sign.c
+297
-155
297 additions, 155 deletions
src/dap_sign.c
test/crypto/dap_enc_sign_multi_test.c
+10
-1
10 additions, 1 deletion
test/crypto/dap_enc_sign_multi_test.c
with
317 additions
and
165 deletions
include/dap_sign.h
+
10
−
9
View file @
5337a6cb
...
...
@@ -67,7 +67,7 @@ typedef struct dap_sign
#define MULTI_SIGN_MAX_COUNT 255
typedef
struct
_dap_multi_sign_params_t
{
dap_sign_type_
enum_
t
type
;
// Multi-signature type
dap_sign_type_t
type
;
// Multi-signature type
uint8_t
total_count
;
// Total key count
uint8_t
sign_count
;
// Signatures count
uint8_t
*
key_seq
;
// Signing key sequence
...
...
@@ -82,11 +82,11 @@ typedef struct _dap_multi_sign_meta_t {
typedef
struct
_dap_multi_sign_keys_t
{
uint8_t
num
;
dap_sign_type_t
type
;
}
dap_multi_sign_keys_t
;
}
DAP_ALIGN_PACKED
dap_multi_sign_keys_t
;
typedef
struct
_dap_multi_sign_t
{
/*** Hashed metadata ***/
dap_sign_type_
enum_
t
type
;
// Multi-signature type
dap_sign_type_t
type
;
// Multi-signature type
uint8_t
total_count
;
// Total key count
uint8_t
sign_count
;
// Signatures count
dap_multi_sign_keys_t
*
key_seq
;
// Signing key sequence
...
...
@@ -128,12 +128,13 @@ dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign);
const
char
*
dap_sign_type_to_str
(
dap_sign_type_t
a_chain_sign_type
);
dap_sign_type_t
dap_sign_type_from_str
(
const
char
*
a_type_str
);
dap_multi_sign_params_t
*
dap_multi_sign_params_make
(
dap_sign_type_enum_t
type
,
uint8_t
total_count
,
uint8_t
sign_count
,
dap_enc_key_t
*
key1
,
...);
void
dap_multi_sign_params_delete
(
dap_multi_sign_params_t
*
params
);
dap_multi_sign_t
*
dap_multi_sign_create
(
dap_multi_sign_params_t
*
params
,
const
void
*
data
,
const
size_t
data_size
);
int
dap_multi_sign_verify
(
dap_multi_sign_t
*
sign
,
const
void
*
data
,
const
size_t
data_size
);
void
dap_multi_sign_delete
(
dap_multi_sign_t
*
sign
);
uint8_t
*
dap_multi_sign_serialize
(
dap_multi_sign_t
*
a_sign
,
size_t
*
a_out_len
);
dap_multi_sign_t
*
dap_multi_sign_deserialize
(
dap_sign_type_enum_t
a_type
,
uint8_t
*
a_sign
,
size_t
a_sign_len
);
dap_multi_sign_params_t
*
dap_multi_sign_params_make
(
dap_sign_type_enum_t
a_type
,
uint8_t
a_total_count
,
uint8_t
a_sign_count
,
dap_enc_key_t
*
a_key1
,
...);
void
dap_multi_sign_params_delete
(
dap_multi_sign_params_t
*
a_params
);
dap_multi_sign_t
*
dap_multi_sign_create
(
dap_multi_sign_params_t
*
a_params
,
const
void
*
a_data
,
const
size_t
a_data_size
);
int
dap_multi_sign_verify
(
dap_multi_sign_t
*
a_sign
,
const
void
*
a_data
,
const
size_t
a_data_size
);
void
dap_multi_sign_delete
(
dap_multi_sign_t
*
a_sign
);
#ifdef __cplusplus
}
...
...
This diff is collapsed.
Click to expand it.
src/dap_sign.c
+
297
−
155
View file @
5337a6cb
...
...
@@ -377,263 +377,405 @@ size_t dap_sign_get_size(dap_sign_t * a_chain_sign)
return
(
sizeof
(
dap_sign_t
)
+
a_chain_sign
->
header
.
sign_size
+
a_chain_sign
->
header
.
sign_pkey_size
);
}
/**
* @brief dap_multi_sign_calc_size Auxiliary function to calculate multi-signature strucrutre size
* @param a_sign The multi-signature
* @return Multi-signature size
*/
size_t
dap_multi_sign_calc_size
(
dap_multi_sign_t
*
a_sign
)
{
if
(
!
a_sign
)
return
0
;
size_t
l_meta_data_size
=
sizeof
(
dap_sign_type_t
)
+
2
*
sizeof
(
uint8_t
)
+
a_sign
->
sign_count
*
(
sizeof
(
dap_multi_sign_keys_t
)
+
sizeof
(
dap_multi_sign_meta_t
));
size_t
l_pkeys_hashes_size
=
a_sign
->
total_count
*
sizeof
(
dap_chain_hash_fast_t
);
size_t
l_pkeys_size
=
0
,
l_signes_size
=
0
;
for
(
int
i
=
0
;
i
<
a_sign
->
sign_count
;
i
++
)
{
l_pkeys_size
+=
a_sign
->
meta
[
i
].
pkey_size
;
l_signes_size
+=
a_sign
->
meta
[
i
].
sign_size
;
}
return
l_meta_data_size
+
l_pkeys_hashes_size
+
l_pkeys_size
+
l_signes_size
;
}
/**
* @brief dap_multi_sign_serialize Makes a serialization for multi-signature structure
* @param a_sign Pointer to multi-signature
* @param a_out_len OUT Output data lenght
* @return Pointer to serialized data
*/
uint8_t
*
dap_multi_sign_serialize
(
dap_multi_sign_t
*
a_sign
,
size_t
*
a_out_len
)
{
if
(
a_sign
->
type
.
type
!=
SIG_TYPE_MULTI_CHAINED
)
{
log_it
(
L_ERROR
,
"Unsupported multi-signature type"
);
return
NULL
;
}
*
a_out_len
=
dap_multi_sign_calc_size
(
a_sign
)
+
sizeof
(
size_t
);
uint8_t
*
l_ret
=
DAP_NEW_SIZE
(
uint8_t
,
*
a_out_len
);
size_t
l_mem_shift
=
0
;
memcpy
(
l_ret
,
a_out_len
,
sizeof
(
size_t
));
l_mem_shift
+=
sizeof
(
size_t
);
memcpy
(
&
l_ret
[
l_mem_shift
],
&
a_sign
->
type
,
sizeof
(
dap_sign_type_t
));
l_mem_shift
+=
sizeof
(
dap_sign_type_t
);
memcpy
(
&
l_ret
[
l_mem_shift
],
&
a_sign
->
total_count
,
1
);
l_mem_shift
++
;
memcpy
(
&
l_ret
[
l_mem_shift
],
&
a_sign
->
sign_count
,
1
);
l_mem_shift
++
;
for
(
int
i
=
0
;
i
<
a_sign
->
sign_count
;
i
++
)
{
memcpy
(
&
l_ret
[
l_mem_shift
],
&
a_sign
->
key_seq
[
i
].
num
,
1
);
l_mem_shift
++
;
memcpy
(
&
l_ret
[
l_mem_shift
],
&
a_sign
->
key_seq
[
i
].
type
,
sizeof
(
dap_sign_type_t
));
l_mem_shift
+=
sizeof
(
dap_sign_type_t
);
}
for
(
int
i
=
0
;
i
<
a_sign
->
sign_count
;
i
++
)
{
memcpy
(
&
l_ret
[
l_mem_shift
],
&
a_sign
->
meta
[
i
].
pkey_size
,
sizeof
(
uint32_t
));
l_mem_shift
+=
sizeof
(
uint32_t
);
memcpy
(
&
l_ret
[
l_mem_shift
],
&
a_sign
->
meta
[
i
].
sign_size
,
sizeof
(
uint32_t
));
l_mem_shift
+=
sizeof
(
uint32_t
);
}
for
(
int
i
=
0
;
i
<
a_sign
->
total_count
;
i
++
)
{
memcpy
(
&
l_ret
[
l_mem_shift
],
&
a_sign
->
key_hashes
[
i
],
sizeof
(
dap_chain_hash_fast_t
));
l_mem_shift
+=
sizeof
(
dap_chain_hash_fast_t
);
}
uint32_t
l_data_shift
=
0
,
l_data_size
=
0
;
for
(
int
i
=
0
;
i
<
a_sign
->
sign_count
;
i
++
)
{
l_data_size
=
a_sign
->
meta
[
i
].
pkey_size
;
memcpy
(
&
l_ret
[
l_mem_shift
],
&
a_sign
->
pub_keys
[
l_data_shift
],
l_data_size
);
l_mem_shift
+=
l_data_size
;
l_data_shift
+=
l_data_size
;
}
l_data_shift
=
l_data_size
=
0
;
for
(
int
i
=
0
;
i
<
a_sign
->
sign_count
;
i
++
)
{
l_data_size
=
a_sign
->
meta
[
i
].
sign_size
;
memcpy
(
&
l_ret
[
l_mem_shift
],
&
a_sign
->
sign_data
[
l_data_shift
],
l_data_size
);
l_mem_shift
+=
l_data_size
;
l_data_shift
+=
l_data_size
;
}
return
l_ret
;
}
/**
* @brief dap_multi_sign_deserialize Makes a deserialization for multi-signature structure
* @param a_sign Pointer to serialized data
* @param a_sign_len Input data lenght
* @return Pointer to multi-signature
*/
dap_multi_sign_t
*
dap_multi_sign_deserialize
(
dap_sign_type_enum_t
a_type
,
uint8_t
*
a_sign
,
size_t
a_sign_len
)
{
if
(
a_type
!=
SIG_TYPE_MULTI_CHAINED
)
{
log_it
(
L_ERROR
,
"Unsupported multi-signature type"
);
return
NULL
;
}
size_t
l_sign_len
=
*
(
size_t
*
)
a_sign
;
if
(
l_sign_len
!=
a_sign_len
)
{
return
NULL
;
}
dap_multi_sign_t
*
l_sign
=
DAP_NEW
(
dap_multi_sign_t
);
size_t
l_mem_shift
=
sizeof
(
size_t
);
memcpy
(
&
l_sign
->
type
,
&
a_sign
[
l_mem_shift
],
sizeof
(
dap_sign_type_t
));
l_mem_shift
+=
sizeof
(
dap_sign_type_t
);
memcpy
(
&
l_sign
->
total_count
,
&
a_sign
[
l_mem_shift
],
1
);
l_mem_shift
++
;
memcpy
(
&
l_sign
->
sign_count
,
&
a_sign
[
l_mem_shift
],
1
);
l_mem_shift
++
;
l_sign
->
key_seq
=
DAP_NEW_SIZE
(
dap_multi_sign_keys_t
,
l_sign
->
sign_count
*
sizeof
(
dap_multi_sign_keys_t
));
for
(
int
i
=
0
;
i
<
l_sign
->
sign_count
;
i
++
)
{
memcpy
(
&
l_sign
->
key_seq
[
i
].
num
,
&
a_sign
[
l_mem_shift
],
1
);
l_mem_shift
++
;
memcpy
(
&
l_sign
->
key_seq
[
i
].
type
,
&
a_sign
[
l_mem_shift
],
sizeof
(
dap_sign_type_t
));
l_mem_shift
+=
sizeof
(
dap_sign_type_t
);
}
l_sign
->
meta
=
DAP_NEW_SIZE
(
dap_multi_sign_meta_t
,
l_sign
->
sign_count
*
sizeof
(
dap_multi_sign_meta_t
));
size_t
l_pkeys_size
=
0
,
l_signes_size
=
0
;
for
(
int
i
=
0
;
i
<
l_sign
->
sign_count
;
i
++
)
{
memcpy
(
&
l_sign
->
meta
[
i
].
pkey_size
,
&
a_sign
[
l_mem_shift
],
sizeof
(
uint32_t
));
l_mem_shift
+=
sizeof
(
uint32_t
);
l_pkeys_size
+=
l_sign
->
meta
[
i
].
pkey_size
;
memcpy
(
&
l_sign
->
meta
[
i
].
sign_size
,
&
a_sign
[
l_mem_shift
],
sizeof
(
uint32_t
));
l_mem_shift
+=
sizeof
(
uint32_t
);
l_signes_size
+=
l_sign
->
meta
[
i
].
sign_size
;
}
l_sign
->
key_hashes
=
DAP_NEW_SIZE
(
dap_chain_hash_fast_t
,
l_sign
->
total_count
*
sizeof
(
dap_chain_hash_fast_t
));
for
(
int
i
=
0
;
i
<
l_sign
->
total_count
;
i
++
)
{
memcpy
(
&
l_sign
->
key_hashes
[
i
],
&
a_sign
[
l_mem_shift
],
sizeof
(
dap_chain_hash_fast_t
));
l_mem_shift
+=
sizeof
(
dap_chain_hash_fast_t
);
}
uint32_t
l_data_shift
=
0
,
l_data_size
=
0
;
l_sign
->
pub_keys
=
DAP_NEW_SIZE
(
uint8_t
,
l_pkeys_size
);
for
(
int
i
=
0
;
i
<
l_sign
->
sign_count
;
i
++
)
{
l_data_size
=
l_sign
->
meta
[
i
].
pkey_size
;
memcpy
(
&
l_sign
->
pub_keys
[
l_data_shift
],
&
a_sign
[
l_mem_shift
],
l_data_size
);
l_mem_shift
+=
l_data_size
;
l_data_shift
+=
l_data_size
;
}
l_data_shift
=
l_data_size
=
0
;
l_sign
->
sign_data
=
DAP_NEW_SIZE
(
uint8_t
,
l_signes_size
);
for
(
int
i
=
0
;
i
<
l_sign
->
sign_count
;
i
++
)
{
l_data_size
=
l_sign
->
meta
[
i
].
sign_size
;
memcpy
(
&
l_sign
->
sign_data
[
l_data_shift
],
&
a_sign
[
l_mem_shift
],
l_data_size
);
l_mem_shift
+=
l_data_size
;
l_data_shift
+=
l_data_size
;
}
return
l_sign
;
}
/**
* @brief dap_multi_sign_params_make Auxiliary function which helps fill multi-signature params structure
* @param type Type of multi-signature
* @param total_count Number of total key count
* @param sign_count Number of keys participating in multi-signing algorithm
* @param key[1 .. total_count] Set of keys
* @param num[1 .. sign_count] Signing keys sequence
* @param
a_
type Type of multi-signature
* @param
a_
total_count Number of total key count
* @param
a_
sign_count Number of keys participating in multi-signing algorithm
* @param
a_
key[1 .. total_count] Set of keys
* @param
a_
num[1 .. sign_count] Signing keys sequence
* @return Pointer to multi-signature params structure
*/
dap_multi_sign_params_t
*
dap_multi_sign_params_make
(
dap_sign_type_enum_t
type
,
uint8_t
total_count
,
uint8_t
sign_count
,
dap_enc_key_t
*
key1
,
...)
dap_multi_sign_params_t
*
dap_multi_sign_params_make
(
dap_sign_type_enum_t
a_
type
,
uint8_t
a_
total_count
,
uint8_t
a_
sign_count
,
dap_enc_key_t
*
a_
key1
,
...)
{
dap_multi_sign_params_t
*
params
=
DAP_NEW
(
dap_multi_sign_params_t
);
params
->
type
=
type
;
params
->
total_count
=
total_count
;
params
->
keys
=
DAP_NEW_SIZE
(
dap_enc_key_t
*
,
total_count
*
sizeof
(
dap_enc_key_t
*
));
params
->
sign_count
=
sign_count
;
params
->
key_seq
=
DAP_NEW_SIZE
(
uint8_t
,
sign_count
);
params
->
keys
[
0
]
=
key1
;
dap_multi_sign_params_t
*
l_
params
=
DAP_NEW
(
dap_multi_sign_params_t
);
l_
params
->
type
.
type
=
a_
type
;
l_
params
->
total_count
=
a_
total_count
;
l_
params
->
keys
=
DAP_NEW_SIZE
(
dap_enc_key_t
*
,
a_
total_count
*
sizeof
(
dap_enc_key_t
*
));
l_
params
->
sign_count
=
a_
sign_count
;
l_
params
->
key_seq
=
DAP_NEW_SIZE
(
uint8_t
,
a_
sign_count
);
l_
params
->
keys
[
0
]
=
a_
key1
;
va_list
list
;
va_start
(
list
,
key1
);
for
(
int
i
=
1
;
i
<
total_count
;
i
++
)
{
params
->
keys
[
i
]
=
va_arg
(
list
,
dap_enc_key_t
*
);
va_start
(
list
,
a_
key1
);
for
(
int
i
=
1
;
i
<
a_
total_count
;
i
++
)
{
l_
params
->
keys
[
i
]
=
va_arg
(
list
,
dap_enc_key_t
*
);
}
for
(
int
i
=
0
;
i
<
sign_count
;
i
++
)
{
params
->
key_seq
[
i
]
=
va_arg
(
list
,
int
)
-
1
;
for
(
int
i
=
0
;
i
<
a_
sign_count
;
i
++
)
{
l_
params
->
key_seq
[
i
]
=
va_arg
(
list
,
int
)
-
1
;
}
va_end
(
list
);
return
params
;
return
l_
params
;
}
/**
* @brief dap_multi_sign_delete Destroy multi-signature params structure
* @param sign Pointer to multi-signature params structure to destroy
* @param
a_
sign Pointer to multi-signature params structure to destroy
* @return None
*/
void
dap_multi_sign_params_delete
(
dap_multi_sign_params_t
*
params
)
void
dap_multi_sign_params_delete
(
dap_multi_sign_params_t
*
a_
params
)
{
if
(
!
params
)
if
(
!
a_
params
)
return
;
if
(
params
->
key_seq
)
{
DAP_DELETE
(
params
->
key_seq
);
if
(
a_
params
->
key_seq
)
{
DAP_DELETE
(
a_
params
->
key_seq
);
}
if
(
params
->
keys
)
{
DAP_DELETE
(
params
->
keys
);
if
(
a_
params
->
keys
)
{
DAP_DELETE
(
a_
params
->
keys
);
}
DAP_DELETE
(
params
);
DAP_DELETE
(
a_
params
);
}
/**
* @brief dap_multi_sign_hash_data Make multi-signature hash for specified message
* @param sign Pointer to multi-signature structure
* @param data Pointer to message to be signed with this multi-signature
* @param data_size Message size
* @param hash OUT Pointer to calculated hash
* @param
a_
sign Pointer to multi-signature structure
* @param
a_
data Pointer to message to be signed with this multi-signature
* @param
a_
data_size Message size
* @param
a_
hash OUT Pointer to calculated hash
* @return True if success, overwise return false
*/
bool
dap_multi_sign_hash_data
(
dap_multi_sign_t
*
sign
,
const
void
*
data
,
const
size_t
data_size
,
dap_chain_hash_fast_t
*
hash
)
bool
dap_multi_sign_hash_data
(
dap_multi_sign_t
*
a_
sign
,
const
void
*
a_
data
,
const
size_t
a_
data_size
,
dap_chain_hash_fast_t
*
a_
hash
)
{
uint8_t
*
concatenated_hash
=
DAP_NEW_SIZE
(
uint8_t
,
3
*
sizeof
(
dap_chain_hash_fast_t
));
if
(
!
dap_hash_fast
(
data
,
data_size
,
hash
))
{
DAP_DELETE
(
concatenated_hash
);
uint8_t
*
l_
concatenated_hash
=
DAP_NEW_SIZE
(
uint8_t
,
3
*
sizeof
(
dap_chain_hash_fast_t
));
if
(
!
dap_hash_fast
(
a_
data
,
a_
data_size
,
a_
hash
))
{
DAP_DELETE
(
l_
concatenated_hash
);
return
false
;
}
memcpy
(
concatenated_hash
,
hash
,
sizeof
(
dap_chain_hash_fast_t
));
uint32_t
meta_data_size
=
sizeof
(
dap_sign_type_
enum_
t
)
+
2
*
sizeof
(
uint8_t
)
+
sign
->
sign_count
*
sizeof
(
dap_multi_sign_keys_t
);
uint8_t
*
meta_data
=
DAP_NEW_SIZE
(
uint8_t
,
meta_data_size
);
int
meta_data_mem_shift
=
0
;
memcpy
(
meta_data
,
&
sign
->
type
,
sizeof
(
dap_sign_type_
enum_
t
));
meta_data_mem_shift
+=
sizeof
(
dap_sign_type_
enum_
t
);
meta_data
[
meta_data_mem_shift
++
]
=
sign
->
total_count
;
meta_data
[
meta_data_mem_shift
++
]
=
sign
->
sign_count
;
memcpy
(
&
meta_data
[
meta_data_mem_shift
],
sign
->
key_seq
,
sign
->
sign_count
*
sizeof
(
dap_multi_sign_keys_t
));
if
(
!
dap_hash_fast
(
meta_data
,
meta_data_size
,
hash
))
{
DAP_DELETE
(
meta_data
);
DAP_DELETE
(
concatenated_hash
);
memcpy
(
l_
concatenated_hash
,
a_
hash
,
sizeof
(
dap_chain_hash_fast_t
));
uint32_t
l_
meta_data_size
=
sizeof
(
dap_sign_type_t
)
+
2
*
sizeof
(
uint8_t
)
+
a_
sign
->
sign_count
*
sizeof
(
dap_multi_sign_keys_t
);
uint8_t
*
l_
meta_data
=
DAP_NEW_SIZE
(
uint8_t
,
l_
meta_data_size
);
int
l_
meta_data_mem_shift
=
0
;
memcpy
(
l_
meta_data
,
&
a_
sign
->
type
,
sizeof
(
dap_sign_type_t
));
l_
meta_data_mem_shift
+=
sizeof
(
dap_sign_type_t
);
l_
meta_data
[
l_
meta_data_mem_shift
++
]
=
a_
sign
->
total_count
;
l_
meta_data
[
l_
meta_data_mem_shift
++
]
=
a_
sign
->
sign_count
;
memcpy
(
&
l_
meta_data
[
l_
meta_data_mem_shift
],
a_
sign
->
key_seq
,
a_
sign
->
sign_count
*
sizeof
(
dap_multi_sign_keys_t
));
if
(
!
dap_hash_fast
(
l_
meta_data
,
l_
meta_data_size
,
a_
hash
))
{
DAP_DELETE
(
l_
meta_data
);
DAP_DELETE
(
l_
concatenated_hash
);
return
false
;
}
DAP_DELETE
(
meta_data
);
memcpy
(
concatenated_hash
+
sizeof
(
dap_chain_hash_fast_t
),
hash
,
sizeof
(
dap_chain_hash_fast_t
));
if
(
!
dap_hash_fast
(
sign
->
key_hashes
,
sign
->
total_count
*
sizeof
(
dap_chain_hash_fast_t
),
hash
))
{
DAP_DELETE
(
concatenated_hash
);
DAP_DELETE
(
l_
meta_data
);
memcpy
(
l_
concatenated_hash
+
sizeof
(
dap_chain_hash_fast_t
),
a_
hash
,
sizeof
(
dap_chain_hash_fast_t
));
if
(
!
dap_hash_fast
(
a_
sign
->
key_hashes
,
a_
sign
->
total_count
*
sizeof
(
dap_chain_hash_fast_t
),
a_
hash
))
{
DAP_DELETE
(
l_
concatenated_hash
);
return
false
;
}
memcpy
(
concatenated_hash
+
2
*
sizeof
(
dap_chain_hash_fast_t
),
hash
,
sizeof
(
dap_chain_hash_fast_t
));
if
(
!
dap_hash_fast
(
concatenated_hash
,
3
*
sizeof
(
dap_chain_hash_fast_t
),
hash
))
{
DAP_DELETE
(
concatenated_hash
);
memcpy
(
l_
concatenated_hash
+
2
*
sizeof
(
dap_chain_hash_fast_t
),
a_
hash
,
sizeof
(
dap_chain_hash_fast_t
));
if
(
!
dap_hash_fast
(
l_
concatenated_hash
,
3
*
sizeof
(
dap_chain_hash_fast_t
),
a_
hash
))
{
DAP_DELETE
(
l_
concatenated_hash
);
return
false
;
}
DAP_DELETE
(
concatenated_hash
);
DAP_DELETE
(
l_
concatenated_hash
);
return
true
;
}
/**
* @brief dap_multi_sign_create Make multi-signature for specified message
* @param params Pointer to multi-signature params structure
* @param data Pointer to message to be signed with this multi-signature
* @param data_size Message size
* @param
a_
params Pointer to multi-signature params structure
* @param
a_
data Pointer to message to be signed with this multi-signature
* @param
a_
data_size Message size
* @return Pointer to multi-signature structure for specified message
*/
dap_multi_sign_t
*
dap_multi_sign_create
(
dap_multi_sign_params_t
*
params
,
const
void
*
data
,
const
size_t
data_size
)
dap_multi_sign_t
*
dap_multi_sign_create
(
dap_multi_sign_params_t
*
a_
params
,
const
void
*
a_
data
,
const
size_t
a_
data_size
)
{
if
(
params
->
type
!=
SIG_TYPE_MULTI_CHAINED
)
{
if
(
a_
params
->
type
.
type
!=
SIG_TYPE_MULTI_CHAINED
)
{
log_it
(
L_ERROR
,
"Unsupported multi-signature type"
);
return
NULL
;
}
if
(
!
params
||
!
params
->
total_count
)
{
log_it
(
L_ERROR
,
"
Can't create
multi-signature"
);
if
(
!
a_
params
||
!
a_
params
->
total_count
)
{
log_it
(
L_ERROR
,
"
Wrong parameters of
multi-signature"
);
return
NULL
;
}
dap_multi_sign_t
*
sign
=
DAP_NEW_Z
(
dap_multi_sign_t
);
sign
->
type
=
params
->
type
;
sign
->
total_count
=
params
->
total_count
;
sign
->
key_hashes
=
DAP_NEW_SIZE
(
dap_chain_hash_fast_t
,
params
->
total_count
*
sizeof
(
dap_chain_hash_fast_t
));
for
(
int
i
=
0
;
i
<
params
->
total_count
;
i
++
)
{
if
(
!
dap_hash_fast
(
params
->
keys
[
i
]
->
pub_key_data
,
params
->
keys
[
i
]
->
pub_key_data_size
,
&
sign
->
key_hashes
[
i
]))
{
dap_multi_sign_t
*
l_
sign
=
DAP_NEW_Z
(
dap_multi_sign_t
);
l_
sign
->
type
=
a_
params
->
type
;
l_
sign
->
total_count
=
a_
params
->
total_count
;
l_
sign
->
key_hashes
=
DAP_NEW_SIZE
(
dap_chain_hash_fast_t
,
a_
params
->
total_count
*
sizeof
(
dap_chain_hash_fast_t
));
for
(
int
i
=
0
;
i
<
a_
params
->
total_count
;
i
++
)
{
if
(
!
dap_hash_fast
(
a_
params
->
keys
[
i
]
->
pub_key_data
,
a_
params
->
keys
[
i
]
->
pub_key_data_size
,
&
l_
sign
->
key_hashes
[
i
]))
{
log_it
(
L_ERROR
,
"Can't create multi-signature hash"
);
dap_multi_sign_delete
(
sign
);
dap_multi_sign_delete
(
l_
sign
);
return
NULL
;
}
}
sign
->
sign_count
=
params
->
sign_count
;
sign
->
key_seq
=
DAP_NEW_SIZE
(
dap_multi_sign_keys_t
,
params
->
sign_count
*
sizeof
(
dap_multi_sign_keys_t
));
sign
->
meta
=
DAP_NEW_SIZE
(
dap_multi_sign_meta_t
,
params
->
sign_count
*
sizeof
(
dap_multi_sign_meta_t
));
for
(
int
i
=
0
;
i
<
sign
->
sign_count
;
i
++
)
{
uint8_t
num
=
params
->
key_seq
[
i
];
sign
->
key_seq
[
i
].
num
=
num
;
sign
->
key_seq
[
i
].
type
=
dap_sign_type_from_key_type
(
params
->
keys
[
num
]
->
type
);
}
uint32_t
pkeys_mem_shift
=
0
,
signs_mem_shift
=
0
;
size_t
pkey_size
,
sign_size
;
dap_chain_hash_fast_t
data_hash
;
bool
hashed
;
for
(
int
i
=
0
;
i
<
sign
->
sign_count
;
i
++
)
{
l_
sign
->
sign_count
=
a_
params
->
sign_count
;
l_
sign
->
key_seq
=
DAP_NEW_SIZE
(
dap_multi_sign_keys_t
,
a_
params
->
sign_count
*
sizeof
(
dap_multi_sign_keys_t
));
l_
sign
->
meta
=
DAP_NEW_SIZE
(
dap_multi_sign_meta_t
,
a_
params
->
sign_count
*
sizeof
(
dap_multi_sign_meta_t
));
for
(
int
i
=
0
;
i
<
l_
sign
->
sign_count
;
i
++
)
{
uint8_t
l_
num
=
a_
params
->
key_seq
[
i
];
l_
sign
->
key_seq
[
i
].
num
=
l_
num
;
l_
sign
->
key_seq
[
i
].
type
=
dap_sign_type_from_key_type
(
a_
params
->
keys
[
l_
num
]
->
type
);
}
uint32_t
l_
pkeys_mem_shift
=
0
,
l_
signs_mem_shift
=
0
;
size_t
l_
pkey_size
,
l_
sign_size
;
dap_chain_hash_fast_t
l_
data_hash
;
bool
l_
hashed
;
for
(
int
i
=
0
;
i
<
l_
sign
->
sign_count
;
i
++
)
{
if
(
i
==
0
)
{
hashed
=
dap_multi_sign_hash_data
(
sign
,
data
,
data_size
,
&
data_hash
);
l_
hashed
=
dap_multi_sign_hash_data
(
l_
sign
,
a_
data
,
a_
data_size
,
&
l_
data_hash
);
}
else
{
hashed
=
dap_hash_fast
(
&
sign
->
sign_data
[
signs_mem_shift
],
sign_size
,
&
data_hash
);
signs_mem_shift
+=
sign_size
;
l_
hashed
=
dap_hash_fast
(
&
l_
sign
->
sign_data
[
l_
signs_mem_shift
],
l_
sign_size
,
&
l_
data_hash
);
l_
signs_mem_shift
+=
l_
sign_size
;
}
if
(
!
hashed
)
{
if
(
!
l_
hashed
)
{
log_it
(
L_ERROR
,
"Can't create multi-signature hash"
);
dap_multi_sign_delete
(
sign
);
dap_multi_sign_delete
(
l_
sign
);
return
NULL
;
}
int
num
=
sign
->
key_seq
[
i
].
num
;
dap_sign_t
*
dap_sign_step
=
dap_sign_create
(
params
->
keys
[
num
],
&
data_hash
,
sizeof
(
dap_chain_hash_fast_t
),
0
);
if
(
!
dap_sign_step
)
{
int
l_
num
=
l_
sign
->
key_seq
[
i
].
num
;
dap_sign_t
*
l_
dap_sign_step
=
dap_sign_create
(
a_
params
->
keys
[
l_
num
],
&
l_
data_hash
,
sizeof
(
dap_chain_hash_fast_t
),
0
);
if
(
!
l_
dap_sign_step
)
{
log_it
(
L_ERROR
,
"Can't create multi-signature step signature"
);
dap_multi_sign_delete
(
sign
);
dap_multi_sign_delete
(
l_
sign
);
return
NULL
;
}
uint8_t
*
pkey
=
dap_sign_get_pkey
(
dap_sign_step
,
&
pkey_size
);
sign
->
meta
[
i
].
pkey_size
=
pkey_size
;
if
(
pkeys_mem_shift
==
0
)
{
sign
->
pub_keys
=
DAP_NEW_SIZE
(
uint8_t
,
pkey_size
);
uint8_t
*
l_
pkey
=
dap_sign_get_pkey
(
l_
dap_sign_step
,
&
l_
pkey_size
);
l_
sign
->
meta
[
i
].
pkey_size
=
l_
pkey_size
;
if
(
l_
pkeys_mem_shift
==
0
)
{
l_
sign
->
pub_keys
=
DAP_NEW_SIZE
(
uint8_t
,
l_
pkey_size
);
}
else
{
sign
->
pub_keys
=
DAP_REALLOC
(
sign
->
pub_keys
,
pkeys_mem_shift
+
pkey_size
);
l_
sign
->
pub_keys
=
DAP_REALLOC
(
l_
sign
->
pub_keys
,
l_
pkeys_mem_shift
+
l_
pkey_size
);
}
memcpy
(
&
sign
->
pub_keys
[
pkeys_mem_shift
],
pkey
,
pkey_size
);
pkeys_mem_shift
+=
pkey_size
;
uint8_t
*
sign_step
=
dap_sign_get_sign
(
dap_sign_step
,
&
sign_size
);
sign
->
meta
[
i
].
sign_size
=
sign_size
;
if
(
signs_mem_shift
==
0
)
{
sign
->
sign_data
=
DAP_NEW_SIZE
(
uint8_t
,
sign_size
);
memcpy
(
&
l_
sign
->
pub_keys
[
l_
pkeys_mem_shift
],
l_
pkey
,
l_
pkey_size
);
l_
pkeys_mem_shift
+=
l_
pkey_size
;
uint8_t
*
l_
sign_step
=
dap_sign_get_sign
(
l_
dap_sign_step
,
&
l_
sign_size
);
l_
sign
->
meta
[
i
].
sign_size
=
l_
sign_size
;
if
(
l_
signs_mem_shift
==
0
)
{
l_
sign
->
sign_data
=
DAP_NEW_SIZE
(
uint8_t
,
l_
sign_size
);
}
else
{
sign
->
sign_data
=
DAP_REALLOC
(
sign
->
sign_data
,
signs_mem_shift
+
sign_size
);
l_
sign
->
sign_data
=
DAP_REALLOC
(
l_
sign
->
sign_data
,
l_
signs_mem_shift
+
l_
sign_size
);
}
memcpy
(
&
sign
->
sign_data
[
signs_mem_shift
],
sign_step
,
sign_size
);
DAP_DELETE
(
dap_sign_step
);
memcpy
(
&
l_
sign
->
sign_data
[
l_
signs_mem_shift
],
l_
sign_step
,
l_
sign_size
);
DAP_DELETE
(
l_
dap_sign_step
);
}
return
sign
;
return
l_
sign
;
}
/**
* @brief dap_multi_sign_verify Make verification test for multi-signed message
* @param sign Pointer to multi-signature structure
* @param data Pointer to message signed with this multi-signature
* @param data_size Signed message size
* @param
a_
sign Pointer to multi-signature structure
* @param
a_
data Pointer to message signed with this multi-signature
* @param
a_
data_size Signed message size
* @return 1 valid signature, 0 invalid signature, -1 verification error
*/
int
dap_multi_sign_verify
(
dap_multi_sign_t
*
sign
,
const
void
*
data
,
const
size_t
data_size
)
int
dap_multi_sign_verify
(
dap_multi_sign_t
*
a_
sign
,
const
void
*
a_
data
,
const
size_t
a_
data_size
)
{
if
(
!
sign
||
!
data
)
if
(
!
a_
sign
||
!
a_
data
)
return
-
1
;
if
(
sign
->
type
!=
SIG_TYPE_MULTI_CHAINED
)
{
if
(
a_
sign
->
type
.
type
!=
SIG_TYPE_MULTI_CHAINED
)
{
log_it
(
L_ERROR
,
"Unsupported multi-signature type"
);
return
-
1
;
}
if
(
!
sign
->
pub_keys
||
!
sign
->
sign_data
||
!
sign
->
key_hashes
||
!
sign
->
meta
||
!
sign
->
key_seq
)
{
if
(
!
a_
sign
->
pub_keys
||
!
a_
sign
->
sign_data
||
!
a_
sign
->
key_hashes
||
!
a_
sign
->
meta
||
!
a_
sign
->
key_seq
)
{
log_it
(
L_ERROR
,
"Invalid multi-signature format"
);
return
-
1
;
}
uint32_t
pkeys_mem_shift
=
0
,
signs_mem_shift
=
0
;
for
(
int
i
=
0
;
i
<
sign
->
sign_count
-
1
;
i
++
)
{
pkeys_mem_shift
+=
sign
->
meta
[
i
].
pkey_size
;
signs_mem_shift
+=
sign
->
meta
[
i
].
sign_size
;
}
dap_chain_hash_fast_t
data_hash
;
bool
hashed
;
int
verified
=
0
;
for
(
int
i
=
sign
->
sign_count
-
1
;
i
>=
0
;
i
--
)
{
size_t
pkey_size
=
sign
->
meta
[
i
].
pkey_size
;
size_t
sign_size
=
sign
->
meta
[
i
].
sign_size
;
dap_sign_t
*
step_sign
=
DAP_NEW_Z_SIZE
(
dap_sign_t
,
sizeof
(
dap_sign_hdr_t
)
+
pkey_size
+
sign_size
);
step_sign
->
header
.
type
=
sign
->
key_seq
[
i
].
type
;
step_sign
->
header
.
sign_pkey_size
=
pkey_size
;
step_sign
->
header
.
sign_size
=
sign_size
;
memcpy
(
step_sign
->
pkey_n_sign
,
&
sign
->
pub_keys
[
pkeys_mem_shift
],
pkey_size
);
uint32_t
l_
pkeys_mem_shift
=
0
,
l_
signs_mem_shift
=
0
;
for
(
int
i
=
0
;
i
<
a_
sign
->
sign_count
-
1
;
i
++
)
{
l_
pkeys_mem_shift
+=
a_
sign
->
meta
[
i
].
pkey_size
;
l_
signs_mem_shift
+=
a_
sign
->
meta
[
i
].
sign_size
;
}
dap_chain_hash_fast_t
l_
data_hash
;
bool
l_
hashed
;
int
l_
verified
=
0
;
for
(
int
i
=
a_
sign
->
sign_count
-
1
;
i
>=
0
;
i
--
)
{
size_t
l_
pkey_size
=
a_
sign
->
meta
[
i
].
pkey_size
;
size_t
l_
sign_size
=
a_
sign
->
meta
[
i
].
sign_size
;
dap_sign_t
*
l_
step_sign
=
DAP_NEW_Z_SIZE
(
dap_sign_t
,
sizeof
(
dap_sign_hdr_t
)
+
l_
pkey_size
+
l_
sign_size
);
l_
step_sign
->
header
.
type
=
a_
sign
->
key_seq
[
i
].
type
;
l_
step_sign
->
header
.
sign_pkey_size
=
l_
pkey_size
;
l_
step_sign
->
header
.
sign_size
=
l_
sign_size
;
memcpy
(
l_
step_sign
->
pkey_n_sign
,
&
a_
sign
->
pub_keys
[
l_
pkeys_mem_shift
],
l_
pkey_size
);
if
(
i
>
0
)
{
pkeys_mem_shift
-=
sign
->
meta
[
i
-
1
].
pkey_size
;
l_
pkeys_mem_shift
-=
a_
sign
->
meta
[
i
-
1
].
pkey_size
;
}
memcpy
(
&
step_sign
->
pkey_n_sign
[
pkey_size
],
&
sign
->
sign_data
[
signs_mem_shift
],
sign_size
);
memcpy
(
&
l_
step_sign
->
pkey_n_sign
[
l_
pkey_size
],
&
a_
sign
->
sign_data
[
l_
signs_mem_shift
],
l_
sign_size
);
if
(
i
>
0
)
{
signs_mem_shift
-=
sign
->
meta
[
i
-
1
].
sign_size
;
l_
signs_mem_shift
-=
a_
sign
->
meta
[
i
-
1
].
sign_size
;
}
if
(
i
==
0
)
{
hashed
=
dap_multi_sign_hash_data
(
sign
,
data
,
data_size
,
&
data_hash
);
l_
hashed
=
dap_multi_sign_hash_data
(
a_
sign
,
a_
data
,
a_
data_size
,
&
l_
data_hash
);
}
else
{
hashed
=
dap_hash_fast
(
&
sign
->
sign_data
[
signs_mem_shift
],
sign
->
meta
[
i
-
1
].
sign_size
,
&
data_hash
);
l_
hashed
=
dap_hash_fast
(
&
a_
sign
->
sign_data
[
l_
signs_mem_shift
],
a_
sign
->
meta
[
i
-
1
].
sign_size
,
&
l_
data_hash
);
}
if
(
!
hashed
)
{
if
(
!
l_
hashed
)
{
log_it
(
L_ERROR
,
"Can't create multi-signature hash"
);
return
-
1
;
}
verified
=
dap_sign_verify
(
step_sign
,
&
data_hash
,
sizeof
(
dap_chain_hash_fast_t
));
DAP_DELETE
(
step_sign
);
if
(
verified
!=
1
)
{
return
verified
;
l_
verified
=
dap_sign_verify
(
l_
step_sign
,
&
l_
data_hash
,
sizeof
(
dap_chain_hash_fast_t
));
DAP_DELETE
(
l_
step_sign
);
if
(
l_
verified
!=
1
)
{
return
l_
verified
;
}
}
return
verified
;
return
l_
verified
;
}
/**
* @brief dap_multi_sign_delete Destroy multi-signature structure
* @param sign Pointer to multi-signature structure to destroy
* @param
a_
sign Pointer to multi-signature structure to destroy
* @return None
*/
void
dap_multi_sign_delete
(
dap_multi_sign_t
*
sign
)
void
dap_multi_sign_delete
(
dap_multi_sign_t
*
a_
sign
)
{
if
(
!
sign
)
if
(
!
a_
sign
)
return
;
if
(
sign
->
sign_data
)
{
DAP_DELETE
(
sign
->
sign_data
);
if
(
a_
sign
->
sign_data
)
{
DAP_DELETE
(
a_
sign
->
sign_data
);
}
if
(
sign
->
pub_keys
)
{
DAP_DELETE
(
sign
->
pub_keys
);
if
(
a_
sign
->
pub_keys
)
{
DAP_DELETE
(
a_
sign
->
pub_keys
);
}
if
(
sign
->
key_hashes
)
{
DAP_DELETE
(
sign
->
key_hashes
);
if
(
a_
sign
->
key_hashes
)
{
DAP_DELETE
(
a_
sign
->
key_hashes
);
}
if
(
sign
->
meta
)
{
DAP_DELETE
(
sign
->
meta
);
if
(
a_
sign
->
meta
)
{
DAP_DELETE
(
a_
sign
->
meta
);
}
if
(
sign
->
key_seq
)
{
DAP_DELETE
(
sign
->
key_seq
);
if
(
a_
sign
->
key_seq
)
{
DAP_DELETE
(
a_
sign
->
key_seq
);
}
DAP_DELETE
(
sign
);
DAP_DELETE
(
a_
sign
);
}
This diff is collapsed.
Click to expand it.
test/crypto/dap_enc_sign_multi_test.c
+
10
−
1
View file @
5337a6cb
...
...
@@ -38,11 +38,20 @@ static void test_signing_verifying(void)
dap_multi_sign_t
*
sign
=
dap_multi_sign_create
(
params
,
source
,
source_size
);
dap_assert_PIF
(
sign
,
"Signing message"
);
int
verify
=
dap_multi_sign_verify
(
sign
,
source
,
source_size
);
size_t
serialized_size
=
0
;
uint8_t
*
serialized_sign
=
dap_multi_sign_serialize
(
sign
,
&
serialized_size
);
dap_assert_PIF
(
serialized_sign
,
"Serializing signature"
);
dap_multi_sign_t
*
deserialized_sign
=
dap_multi_sign_deserialize
(
SIG_TYPE_MULTI_CHAINED
,
serialized_sign
,
serialized_size
);
dap_assert_PIF
(
deserialized_sign
,
"Deserializing signature"
);
int
verify
=
dap_multi_sign_verify
(
deserialized_sign
,
source
,
source_size
);
dap_assert_PIF
(
verify
==
1
,
"Verifying signature"
);
dap_multi_sign_delete
(
deserialized_sign
);
dap_multi_sign_delete
(
sign
);
dap_multi_sign_params_delete
(
params
);
DAP_DELETE
(
serialized_sign
);
DAP_DELETE
(
source
);
for
(
int
i
=
0
;
i
<
KEYS_TOTAL_COUNT
;
i
++
)
{
dap_enc_key_delete
(
key
[
i
]);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment