Skip to content

Commit

Permalink
added a bench on 1 partition decrypt and becnhmarks in README
Browse files Browse the repository at this point in the history
  • Loading branch information
bgrieder committed Aug 1, 2022
1 parent 74290b2 commit 21aa6f3
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 7 deletions.
49 changes: 48 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,59 @@
# CoverCrypt   [![Build Status]][actions] [![Latest Version]][crates.io]

Implementation of the [CoverCrypt](bib/CoverCrypt.pdf) algorithm.
Implementation of the [CoverCrypt](bib/CoverCrypt.pdf) public key algorithm which partitions ciphertexts using attributes and allows issuing user keys with access policies over these attributes.

[Build Status]: https://img.shields.io/github/workflow/status/Cosmian/cover_crypt/CI%20checks/main
[actions]: https://github.com/Cosmian/cover_crypt/actions?query=branch%3Amain
[Latest Version]: https://img.shields.io/crates/v/cover_crypt.svg
[crates.io]: https://crates.io/crates/cover_crypt




- [A fast alternative to KP-ABE](#a-fast-alternative-to-kp-abe)
- [Building and testing](#building-and-testing)
- [Building the library for a different glibc](#building-the-library-for-a-different-glibc)
- [Building for Pyo3](#building-for-pyo3)
- [Benchmarks](#benchmarks)
- [Flamegraph](#flamegraph)

# A fast alternative to KP-ABE

CoverCrypt has been designed as a fast alternative to Key Policy Attribute Based Encryption schemes such as GPSW06 (>50x faster).

It is typically used in a hybrid encryption scheme as a KEM to encapsulate the symmetric key of a DEM (AES 256 GCM in the provided hybrid implementation)

```
CoverCrypt encryption over 1 partition:
time: [156.28 µs 156.73 µs 157.21 µs]
Found 538 outliers among 5000 measurements (10.76%)
207 (4.14%) high mild
331 (6.62%) high severe
CoverCrypt encryption over 3 partitions
time: [255.07 µs 255.70 µs 256.36 µs]
Found 364 outliers among 5000 measurements (7.28%)
135 (2.70%) high mild
229 (4.58%) high severe
CoverCrypt decryption with a 1 partition access user key
time: [208.39 µs 209.17 µs 209.98 µs]
Found 601 outliers among 5000 measurements (12.02%)
41 (0.82%) low mild
139 (2.78%) high mild
421 (8.42%) high severe
CoverCrypt decryption with a 3 partition access user key
time: [260.87 µs 261.85 µs 262.85 µs]
Found 669 outliers among 5000 measurements (13.38%)
13 (0.26%) low mild
160 (3.20%) high mild
496 (9.92%) high severe
```
Single threaded measurement over thousands of samples on an Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz

Run `cargo bench` to get the details (see below)

# Building and testing

The crate is separated in 3 main modules:
Expand Down
26 changes: 21 additions & 5 deletions benches/benches.rs
Original file line number Diff line number Diff line change
Expand Up @@ -307,16 +307,32 @@ fn bench_header_decryption(c: &mut Criterion) {
.expect("cannot generate master keys");
let encrypted_header = generate_encrypted_header(&public_key);

let access_policy =
let access_policy_1 = AccessPolicy::new("Department", "FIN")
& AccessPolicy::new("Security Level", "Confidential");
let user_decryption_key_1 = cc
.generate_user_private_key(&msk, &access_policy_1, &policy)
.expect("cannot generate user private key");

c.bench_function("Header decryption/1 partition access", |b| {
b.iter(|| {
decrypt_hybrid_header::<Aes256GcmCrypto>(
&user_decryption_key_1,
&encrypted_header.header_bytes,
)
.expect("cannot decrypt hybrid header")
})
});

let access_policy_3 =
AccessPolicy::new("Department", "FIN") & AccessPolicy::new("Security Level", "Top Secret");
let user_decryption_key = cc
.generate_user_private_key(&msk, &access_policy, &policy)
let user_decryption_key_3 = cc
.generate_user_private_key(&msk, &access_policy_3, &policy)
.expect("cannot generate user private key");

c.bench_function("Header decryption", |b| {
c.bench_function("Header decryption/3 partition access", |b| {
b.iter(|| {
decrypt_hybrid_header::<Aes256GcmCrypto>(
&user_decryption_key,
&user_decryption_key_3,
&encrypted_header.header_bytes,
)
.expect("cannot decrypt hybrid header")
Expand Down
Binary file renamed bib/CoverCrypt-2.0.pdf → bib/CoverCrypt.pdf
Binary file not shown.
2 changes: 1 addition & 1 deletion non_regression_vector.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"public_key":"2026ce1ffa5f3bedce505d08a732fe4e2f101d84f7d50eebf5e0bcadb6c8b7434d20c4e5b24c5dc62704e3ebd67347b02c5c1e180d142bebb2924d1a6dca0543a07419020306200a6e9bc97e92c68e64b81a2d7e8d6d6bedcb53098b81b3a70792105ec2c4556702040720e4dd5df93828d683354642fa38fba01b047dd761944cb57c35ae026902bfb17402020720a28a48b40e34849b25cf7075c8b79bac95a72bca7d4ff2fbbf1dc0dc365e714602050a209efefcecad57b7c943266ae39ac964bdb7cd87f5b374214335cf02ed067b740e02020a209a80022f44615046e9aeecf808271f5c9bc543c31d27a7fe8b55c0640843662a02010820d06e048f1d55da18d3df7a56efb6b92d42e2a4cc1500be114a5423a370401f71020307200a6bb59e1d183d51e810e1ca8d78fe7bdb69ba7d2d16b463bd6162f37c2b706a0205072060b7a054390fcfb03f52f358090219eb23480dfd584cc5e87017cf7890fdf54b02040620b84a2a3dcf33f96506e34fad026de2a27c935d79f8f7232a32d960a25496fa7d02050620d03dfa1b530dd8d40a7d8d90d1acd9c3dbed6502d9a2e61ac29d3650ad934e310201072062547e355a7a01fd271cab835291fd468968c55dcd7db83b6b89508aadcb56190203092014015fad600e43643ad8137311ea99ea129c8b8b9034e576f8aa336b05f5606f02050920488fd7c1ad1dd0b93b2685799c5e62811adda725f279b1ea9a9a198bec26ce4d0204082044aae9a7d2ec4435c7cbcf1067941f41f15dc97b92c19bd3778f9e954194de0b02030820980c366ee894b39ded314bd163b41e2fb2df5d747a0e55b887c8fc26f9eed13802010a20d65cf8bc2a70b6fb6b3b092cf5885f02ce858270acb30c20154a07eac6d06a0c02040a20f8808d31fcbb9e191676855cc4e60f02e18d5ebc000b2a0cfd4da68041ab41780202092098c6e779d9330bfb8b3e32aada47041adea89bb770f173cd72c163f9f2226d6802010920d8816422791374c1d65559120e1792608dcdccbd190fbf42fff1a39312e7f90c02050820c4a253268befca3a52c154eeb72e20f08203414c7af1b13993552b84e389747902040920c85bdcfab28c2427d2bb69869a88f27b555411469dfe62925df6f53658730f6102020620846c80d121accb01b2cdbd0f1d978490a054eac200ef99eecd8825b7f2c8eb2d02030a20066d64b5f5fa8ce21f23a63f88e3a012fdf61227f9396a8d437855242499b82d02020820187115943448c396421131961dd87d5efae6ce79e2c2e0f4497884a979dd073002010620ecc6ad72d8b6158f6aa8434ff22eb2f289b10ebb416f4542194a7ebf0d61855b","private_key":"202d9aed226d8fadb194c19dcbc06614cd8e5185af9d8fc2210f53c496baefa601207d659a86f4c9e965711ece53f42e8a5196288f485af091a7963627452e956908202d85bb4481d5a933cb00afde83a90250bc4841a79bc36e5241a07521f8f89a0e1902030820e12f534992a613b926fd0681c37e0ecb2878b32386a79ac593f48b8d2d94c20c020309208e8ffcb597689e818143070cc95a2db46ef1e16de4b0582f21e696aa8c8c320f02020820409b79b39281c58b35741d94e41e5c9b0c09a7feff551c9d3b4395ceb083da0602040920c8a9e6be04a9330cb3f5092b0999b2ffdea8429cf1c16d649ebce9ebc22a570802010620fbf191c188dc72614db78ac0415da38f0af40f6d9986c54f3e5dc907ee502e03020306208072ea3e2ecaa9d396f0a5b1f4513dfc8211322c2fbbf07a4e8d6fa105cd050a02020a207bcbd11379a6a789a1cc7ca6087740850bfedf1ef3d5d03be2fd8c61a77fa1090205062080e3241854e4aaf9480916c86fc9fffab3b05eaf2727606fe5b50cba8f353e0402050820b5ac7c69537ee091b5e1ed9144b9fb67bcbbc2f07ca90f7057abb604f0209a0f02030a204a5455ee1137a48fdc368bc8a43163a98a0913f95de6f596971b58bf0f2bd40e020509201b6187294deab4f995765432f2c267e8a4703cfe75f9ca1e9fb8a3169bc1320202010820a80409e63e83f8ed777e2130679eff384d49f8e5820e2da30bbd5fa00129f10502020720c06905b78541628f56898d45e42ffbfe86e9596ff22cf963dd5e513422ab840602010920863c80f13aced0c44e091db86fda39bae7c38f1b6901cfd276b72c2b31f8b30402040820f7a6da3101031cca03a98ea99a45370f18d61474d3558c4173fa564a69c5da09020307205c16152a491e1933ce02a3997d4765080faa2ed4b0c27a781aa0090c40c57109020406203e903248db5502bc01d322bcca417f8e0f808c25db68a60c94fbc4982fb3340b0204072074c34d108d050eff50def748ddcb44b8a2da45053a9944aceedac66278fa320002050a2048dbc68ca5720729b53b8d5d0b2f50e1f95c4c90b0686c920c9d6a6e90bd8504020107209c69dcdf67b8ad97964fb142884e3fae5658465bd7ab1c94e2b120ed27da070502020620c9607f93446c7e68de215c8ad0af61ad47dde020b06bd005f09bc871d404e20d02010a20db8355f9b76f077658cd5d96194f45701d0dd76c9d0d451c116897977fce530c02040a204a333f61e940695a0aefda8ac5b25fb3ef9132559d065a8d3452be9d68acff06020209204c717f4e1b24e80a186960ae5745c293837f49424aa22b74511df0139cd9450c02050720a35586607b658fd68c88e1a440a1363d05b613727e260d173744d94be94e6609","policy":"7b226c6173745f6174747269627574655f76616c7565223a31302c226d61785f6174747269627574655f6372656174696f6e73223a3130302c2261786573223a7b224465706172746d656e74223a5b5b22522644222c224852222c224d4b47222c2246494e225d2c66616c73655d2c225365637572697479204c6576656c223a5b5b2250726f746563746564222c224c6f7720536563726574222c224d656469756d20536563726574222c224869676820536563726574222c22546f7020536563726574225d2c747275655d7d2c226174747269627574655f746f5f696e74223a7b225365637572697479204c6576656c3a3a50726f746563746564223a5b315d2c224465706172746d656e743a3a4d4b47223a5b385d2c225365637572697479204c6576656c3a3a4c6f7720536563726574223a5b325d2c225365637572697479204c6576656c3a3a4869676820536563726574223a5b345d2c224465706172746d656e743a3a4852223a5b375d2c225365637572697479204c6576656c3a3a546f7020536563726574223a5b355d2c225365637572697479204c6576656c3a3a4d656469756d20536563726574223a5b335d2c224465706172746d656e743a3a522644223a5b365d2c224465706172746d656e743a3a46494e223a5b31302c395d7d7d","user_decryption_key":"20bc9bb51f8a83278d0542879bac24446d12254db39c863145679c292c5bcab30420dfa4773aa2d74b95b3ea1a37825361c81d02624f21ad95893563b06992d767080a02030820e12f534992a613b926fd0681c37e0ecb2878b32386a79ac593f48b8d2d94c20c02020820409b79b39281c58b35741d94e41e5c9b0c09a7feff551c9d3b4395ceb083da0602050820b5ac7c69537ee091b5e1ed9144b9fb67bcbbc2f07ca90f7057abb604f0209a0f02010820a80409e63e83f8ed777e2130679eff384d49f8e5820e2da30bbd5fa00129f10502030a204a5455ee1137a48fdc368bc8a43163a98a0913f95de6f596971b58bf0f2bd40e02020a207bcbd11379a6a789a1cc7ca6087740850bfedf1ef3d5d03be2fd8c61a77fa10902040820f7a6da3101031cca03a98ea99a45370f18d61474d3558c4173fa564a69c5da0902050a2048dbc68ca5720729b53b8d5d0b2f50e1f95c4c90b0686c920c9d6a6e90bd850402010a20db8355f9b76f077658cd5d96194f45701d0dd76c9d0d451c116897977fce530c02040a204a333f61e940695a0aefda8ac5b25fb3ef9132559d065a8d3452be9d68acff06","user_decryption_key_2":"209771e8db9a6468dd7f0797cfc9487e33578a151c4e29b0d50fd52de487173e0e20784c8d3e3ad6445e2a4da37e1c34e8a34194030a19c2aaec4efffc28407d07050302030820e12f534992a613b926fd0681c37e0ecb2878b32386a79ac593f48b8d2d94c20c02010820a80409e63e83f8ed777e2130679eff384d49f8e5820e2da30bbd5fa00129f10502020820409b79b39281c58b35741d94e41e5c9b0c09a7feff551c9d3b4395ceb083da06","header_bytes":"0000008520088d0d79dc40eda1c30bfce915d32ea4aa21a8a1a16e4e836a4b4ab1d6ff664f208a3a515fc38a74f31a45e2d70fba7a51b34b1ef4bce7d5340d3b983ee29fa93902200df0d33ac6cc267669c49cf502d78c7d3c6dc0e317bee196e77a20f13dad0c57206626771f2a803d1898c8f21979865340ee582b7462e7642434ff95813449a2122f5f1d241b95e11e1356dd859cde918db3e686a67a4e1aae0cb1395ad8b26505504eb0c5","encrypted_bytes":"000000ad0000008520088d0d79dc40eda1c30bfce915d32ea4aa21a8a1a16e4e836a4b4ab1d6ff664f208a3a515fc38a74f31a45e2d70fba7a51b34b1ef4bce7d5340d3b983ee29fa93902200df0d33ac6cc267669c49cf502d78c7d3c6dc0e317bee196e77a20f13dad0c57206626771f2a803d1898c8f21979865340ee582b7462e7642434ff95813449a2122f5f1d241b95e11e1356dd859cde918db3e686a67a4e1aae0cb1395ad8b26505504eb0c5c3316b351422b9f5a864827c2bf3c15334e96daf1e0dd45b211c7ae267a4f81d216fec48114cd0d8a24ecdcbb3","uid":"00000001"}
{"public_key":"2052f1658e8eedddc969a6548a980003f1e5f60de21d52c73b3bd2b681823ad04420f23556c75083ee889c5277cd4d67deadcead42f019cdc10d0d0a0cade134b17619020109209ca2c2bdd8eb44a1d3bfb223cc988e3a3ae5551d5120f56453e09db8553fe43a02050720d25c926be2bf10868a98037f95ff6655292fa203cd4071d3f6788035cab766030205082082a77e79e51db29ba09d12218d8a240d7bc4a0e0bdd31ba1e1c11a9d642ba557020406202aabc31b7242d5e075c6b6587e9a8a2dc555355300194edfc95bd010e56e983d02030720085c26343a8e7e8bf9018ab6e4700cc1705780465aa7b5c20211e0a0538a7a6202050a20aa48ddfa8111a804a896fb252641c988f945b3093fb53b385a3d7cfdbbacba3302040a2064f191c827da0904fedfa96f557e28f65f6f2525933037a3c64f5864f718255a02050620440ac2fe452e27824f6bee6e46123fbab6aed9ed81a7f7d5c195b72273e8317102020a20ba12f04db60eeb65d121c3863f045b3ba4ce4ce0ff67be2831c4bde81e61334202020620c838dedf29a2d6b404a013d8f4c65abbc678229ecdc1fd5543ff09c817beed4d020306206663677d3f5d35a4aaf4ebec8c435dbef2704b584c6e8015e4872494171e545002030820061826ce9d008708348c31d221f1f64c2d55a5764018f428dfc5bef4923f1b1402030a208e298c54f8eae8dce5f891ad1eaa3cc7c889b0ec07e90b927f4c2d336a383e3f020107200a5f40380ba136e4197071854147ae7dac3631cdee4b30d95ece1305adadab79020409205028cb35d92544a6261bb839ba1939be57bc4383adcff472ed733b54bcaa555102010620e6e31bb27da0244e5526b4038fba1792816ba2f25d9f19dbd7eab57e8daac040020407208ca9333d3ff9f4349e6a4990098319c3720a2808cac579e1530e83d3deb74d4b0202092076ca5f91ab47e1299a360d3e3f57b3ceb8e82bf55aa81fad80b5a2ca94741c5702030920acdbabea72c241137e9f5ea275c7c4459d9530a1465ae626c39df80ce31cf330020408203ca09ac5ceb5ac95f8c75a5d67a8ea65faf5da6ac510ebefa2aba73e294aed45020509207e4c52c9e6339d9924e15a1cdec58714dccbee69fd53995e9c86e8969c5d5c1302010a2084c4d8d5dec707f076948f08edf8a559eab5168af7ce63a85f91ecdaa858d40702020720e07286e2e58baf63fa6eeb48cd2ec7f6969e069172bed8a1893e276c78c55a6f02010820c09e45849543982b38112429c70288ee92c8f8a26819dc8f54d6f5091e4aff0102020820e690c3745f1b264167a40f1949f6d26ef301525579e49dc2fbf74e643c402047","private_key":"209e79827c3cfd5708aa2c46a9a8a6eb8812af133f8f550cfd1823f1ae99bcb8012062cfb08f3a082d0a9ddebc1bdda7bdc78a79fa623643c0171a02b8261a391c062051d57c8da99dc4df321a9e3dce896e83ee717a90713a1be73d1b81c3e8c483021902030720d596de77ed94c097acf6f5d50fe6d4faae549455b19deffcfa0ee403b26e400202040920b6fd720ec7024a2f40503d7f942923625f5959ddedb05024fabf0061e66a340202010620eeebc1784679e177ae1ecb17d4cecd06c22b0bb4e557cb743398e8346dae0b0c02030a20d4941c48bc2eb1a456554b51acbbd97517883a704291095303f6113dd805720002050a2011fb2c938ea3fe227d4537c67dd2108858b5b4f1e7a96686b261f39df08de80002030620196cc76a4e4e7701a450a0980d36a538ea55a4f2f3b4e44043b3ae44dab0490d0201092091f2b8a5d816b259492e479c6a6694d77e32c64a868081594ac6b981e6c8b10f02010720cc4f21ec7e2718ad3204e6e8b1e341a1edcdf242cb0b5727c566941dbd8a11050204072071e02a04724954d0afd8349d1f18d1c16a7c8d9980fd7348873d84c71a634709020208209b062f20ec7379ac9ae93574d5a51d9c453474ac32cdcc70c21c306d302c8f0902040a202bfb29c5e0d09e9e5b05b9a87f4e22bde1642935d06bfb0c43c240a274dd540a02050620774ca850ae58124228a2c9f1bfe4957ff9dbd9cc2daff27901e4907bc4e80e0c02020720aef66d42ba0a484b285eaa32cc28a458a069285305ecadeb0106447801f13e0602050720a8410e832f39ba97ed11e9698a2f8faec542801070d381661b68a2cd13704005020508206bee040c232e377fc0b2b206f096e406ce0b190cb3878db542e4aa7b7c4d3f0d020108207cba64f3ec7f46a643d7aeea572297cd48f11e9eeb0b77ba97e0587bff6b2b0b02020920806d7f3350eae33e4068ec10ec284de173a9b3b2b031c251f7a6d5c61ce05f0902040620c7844b6fa95fe25f89230cc3901780c8e7951307c3c7b7ec0eddf865ec032e0a02040820e737cebd2c41aa9c711d55cc195b8f33ba9937fda15d0b5b2b82fc45595f190f02020a200bb7580bd73768129771f163662fed4ce866e622d9e3adb9a643a5eb2bec350c020206205774849f31a38eee66f20e8f62f7ba7fc8cb58eeec1250a836640d3af665c40602010a2077ac7ed3f72e73abe87fb271b118ff33240725ef7739b1d9d3336d3b3678cd0102030820ed206993cd082dc32a37327b988e5184850576d12768d525295ac0251191020e020309207638a846b1b9ebe666ce1eccf979edcccdd147c9e893ed9fb61ccec47f6e4f0602050920a21bce2f74a5e6bf0bbaa9af8d7906355e36b9aac5182fca3178ed338a663409","policy":"7b226c6173745f6174747269627574655f76616c7565223a31302c226d61785f6174747269627574655f6372656174696f6e73223a3130302c2261786573223a7b225365637572697479204c6576656c223a5b5b2250726f746563746564222c224c6f7720536563726574222c224d656469756d20536563726574222c224869676820536563726574222c22546f7020536563726574225d2c747275655d2c224465706172746d656e74223a5b5b22522644222c224852222c224d4b47222c2246494e225d2c66616c73655d7d2c226174747269627574655f746f5f696e74223a7b225365637572697479204c6576656c3a3a4d656469756d20536563726574223a5b335d2c224465706172746d656e743a3a522644223a5b365d2c225365637572697479204c6576656c3a3a50726f746563746564223a5b315d2c225365637572697479204c6576656c3a3a4c6f7720536563726574223a5b325d2c225365637572697479204c6576656c3a3a546f7020536563726574223a5b355d2c224465706172746d656e743a3a4852223a5b375d2c224465706172746d656e743a3a4d4b47223a5b385d2c225365637572697479204c6576656c3a3a4869676820536563726574223a5b345d2c224465706172746d656e743a3a46494e223a5b31302c395d7d7d","user_decryption_key":"2039957032b15048365c9ebc229456c863a48bab005cb38da958af03513eaf5e05204cdecf8e6078949995fea7a1f27c65835483c383abd66c60f7f3c7e70c8d6b050a02050a2011fb2c938ea3fe227d4537c67dd2108858b5b4f1e7a96686b261f39df08de800020108207cba64f3ec7f46a643d7aeea572297cd48f11e9eeb0b77ba97e0587bff6b2b0b02020a200bb7580bd73768129771f163662fed4ce866e622d9e3adb9a643a5eb2bec350c02030820ed206993cd082dc32a37327b988e5184850576d12768d525295ac0251191020e02040820e737cebd2c41aa9c711d55cc195b8f33ba9937fda15d0b5b2b82fc45595f190f020208209b062f20ec7379ac9ae93574d5a51d9c453474ac32cdcc70c21c306d302c8f09020508206bee040c232e377fc0b2b206f096e406ce0b190cb3878db542e4aa7b7c4d3f0d02010a2077ac7ed3f72e73abe87fb271b118ff33240725ef7739b1d9d3336d3b3678cd0102030a20d4941c48bc2eb1a456554b51acbbd97517883a704291095303f6113dd805720002040a202bfb29c5e0d09e9e5b05b9a87f4e22bde1642935d06bfb0c43c240a274dd540a","user_decryption_key_2":"208130da81df0dddd28efcbe7df87d52c47d96a2e79c93ef2ddb6b02d29269070320c5ac3441d83317a87c8741ce6c884c1d013ea88de631455848206423530c410d03020108207cba64f3ec7f46a643d7aeea572297cd48f11e9eeb0b77ba97e0587bff6b2b0b020208209b062f20ec7379ac9ae93574d5a51d9c453474ac32cdcc70c21c306d302c8f0902030820ed206993cd082dc32a37327b988e5184850576d12768d525295ac0251191020e","header_bytes":"00000085207e75ef39b32fbd18c3739ddcd422cdacfcd52ab3cfaef7a598dbd1437a20a251205eeae7e0e9142b5964d677c498b5352760982ab3f8358c52509c88048c657c79022005fbb6dd78ba588ca3db36686dae500300f40579e1d2d2eea348c31ce650934620c474e21acccb3d94ee1e1afe3fed7f3ae9ad62a870d05dc2a02eaaf963e4593c633963af6a5044e891846899b1a22e82021eb991bb8a334c250916564db6125d44bb7584","encrypted_bytes":"000000ad00000085207e75ef39b32fbd18c3739ddcd422cdacfcd52ab3cfaef7a598dbd1437a20a251205eeae7e0e9142b5964d677c498b5352760982ab3f8358c52509c88048c657c79022005fbb6dd78ba588ca3db36686dae500300f40579e1d2d2eea348c31ce650934620c474e21acccb3d94ee1e1afe3fed7f3ae9ad62a870d05dc2a02eaaf963e4593c633963af6a5044e891846899b1a22e82021eb991bb8a334c250916564db6125d44bb75841786e250d18c9ba09924626f3fde622f3fe0f984ed2cddc9f07b2c707ee436ea39d4ab12337130e067b2c0ee38","uid":"00000001"}

0 comments on commit 21aa6f3

Please sign in to comment.