Skip to content

Commit 6e21446

Browse files
committed
Release 1.0.0-BETA
1 parent 3f656ae commit 6e21446

26 files changed

+382
-156
lines changed

LICENSE.md

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
Apache License
2+
==============
3+
4+
_Version 2.0, January 2004_
5+
_&lt;<http://www.apache.org/licenses/>&gt;_
6+
7+
### Terms and Conditions for use, reproduction, and distribution
8+
9+
#### 1. Definitions
10+
11+
“License” shall mean the terms and conditions for use, reproduction, and
12+
distribution as defined by Sections 1 through 9 of this document.
13+
14+
“Licensor” shall mean the copyright owner or entity authorized by the copyright
15+
owner that is granting the License.
16+
17+
“Legal Entity” shall mean the union of the acting entity and all other entities
18+
that control, are controlled by, or are under common control with that entity.
19+
For the purposes of this definition, “control” means **(i)** the power, direct or
20+
indirect, to cause the direction or management of such entity, whether by
21+
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
22+
outstanding shares, or **(iii)** beneficial ownership of such entity.
23+
24+
“You” (or “Your”) shall mean an individual or Legal Entity exercising
25+
permissions granted by this License.
26+
27+
“Source” form shall mean the preferred form for making modifications, including
28+
but not limited to software source code, documentation source, and configuration
29+
files.
30+
31+
“Object” form shall mean any form resulting from mechanical transformation or
32+
translation of a Source form, including but not limited to compiled object code,
33+
generated documentation, and conversions to other media types.
34+
35+
“Work” shall mean the work of authorship, whether in Source or Object form, made
36+
available under the License, as indicated by a copyright notice that is included
37+
in or attached to the work (an example is provided in the Appendix below).
38+
39+
“Derivative Works” shall mean any work, whether in Source or Object form, that
40+
is based on (or derived from) the Work and for which the editorial revisions,
41+
annotations, elaborations, or other modifications represent, as a whole, an
42+
original work of authorship. For the purposes of this License, Derivative Works
43+
shall not include works that remain separable from, or merely link (or bind by
44+
name) to the interfaces of, the Work and Derivative Works thereof.
45+
46+
“Contribution” shall mean any work of authorship, including the original version
47+
of the Work and any modifications or additions to that Work or Derivative Works
48+
thereof, that is intentionally submitted to Licensor for inclusion in the Work
49+
by the copyright owner or by an individual or Legal Entity authorized to submit
50+
on behalf of the copyright owner. For the purposes of this definition,
51+
“submitted” means any form of electronic, verbal, or written communication sent
52+
to the Licensor or its representatives, including but not limited to
53+
communication on electronic mailing lists, source code control systems, and
54+
issue tracking systems that are managed by, or on behalf of, the Licensor for
55+
the purpose of discussing and improving the Work, but excluding communication
56+
that is conspicuously marked or otherwise designated in writing by the copyright
57+
owner as “Not a Contribution.”
58+
59+
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
60+
of whom a Contribution has been received by Licensor and subsequently
61+
incorporated within the Work.
62+
63+
#### 2. Grant of Copyright License
64+
65+
Subject to the terms and conditions of this License, each Contributor hereby
66+
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
67+
irrevocable copyright license to reproduce, prepare Derivative Works of,
68+
publicly display, publicly perform, sublicense, and distribute the Work and such
69+
Derivative Works in Source or Object form.
70+
71+
#### 3. Grant of Patent License
72+
73+
Subject to the terms and conditions of this License, each Contributor hereby
74+
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
75+
irrevocable (except as stated in this section) patent license to make, have
76+
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
77+
such license applies only to those patent claims licensable by such Contributor
78+
that are necessarily infringed by their Contribution(s) alone or by combination
79+
of their Contribution(s) with the Work to which such Contribution(s) was
80+
submitted. If You institute patent litigation against any entity (including a
81+
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
82+
Contribution incorporated within the Work constitutes direct or contributory
83+
patent infringement, then any patent licenses granted to You under this License
84+
for that Work shall terminate as of the date such litigation is filed.
85+
86+
#### 4. Redistribution
87+
88+
You may reproduce and distribute copies of the Work or Derivative Works thereof
89+
in any medium, with or without modifications, and in Source or Object form,
90+
provided that You meet the following conditions:
91+
92+
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
93+
this License; and
94+
* **(b)** You must cause any modified files to carry prominent notices stating that You
95+
changed the files; and
96+
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
97+
all copyright, patent, trademark, and attribution notices from the Source form
98+
of the Work, excluding those notices that do not pertain to any part of the
99+
Derivative Works; and
100+
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
101+
Derivative Works that You distribute must include a readable copy of the
102+
attribution notices contained within such NOTICE file, excluding those notices
103+
that do not pertain to any part of the Derivative Works, in at least one of the
104+
following places: within a NOTICE text file distributed as part of the
105+
Derivative Works; within the Source form or documentation, if provided along
106+
with the Derivative Works; or, within a display generated by the Derivative
107+
Works, if and wherever such third-party notices normally appear. The contents of
108+
the NOTICE file are for informational purposes only and do not modify the
109+
License. You may add Your own attribution notices within Derivative Works that
110+
You distribute, alongside or as an addendum to the NOTICE text from the Work,
111+
provided that such additional attribution notices cannot be construed as
112+
modifying the License.
113+
114+
You may add Your own copyright statement to Your modifications and may provide
115+
additional or different license terms and conditions for use, reproduction, or
116+
distribution of Your modifications, or for any such Derivative Works as a whole,
117+
provided Your use, reproduction, and distribution of the Work otherwise complies
118+
with the conditions stated in this License.
119+
120+
#### 5. Submission of Contributions
121+
122+
Unless You explicitly state otherwise, any Contribution intentionally submitted
123+
for inclusion in the Work by You to the Licensor shall be under the terms and
124+
conditions of this License, without any additional terms or conditions.
125+
Notwithstanding the above, nothing herein shall supersede or modify the terms of
126+
any separate license agreement you may have executed with Licensor regarding
127+
such Contributions.
128+
129+
#### 6. Trademarks
130+
131+
This License does not grant permission to use the trade names, trademarks,
132+
service marks, or product names of the Licensor, except as required for
133+
reasonable and customary use in describing the origin of the Work and
134+
reproducing the content of the NOTICE file.
135+
136+
#### 7. Disclaimer of Warranty
137+
138+
Unless required by applicable law or agreed to in writing, Licensor provides the
139+
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
140+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
141+
including, without limitation, any warranties or conditions of TITLE,
142+
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
143+
solely responsible for determining the appropriateness of using or
144+
redistributing the Work and assume any risks associated with Your exercise of
145+
permissions under this License.
146+
147+
#### 8. Limitation of Liability
148+
149+
In no event and under no legal theory, whether in tort (including negligence),
150+
contract, or otherwise, unless required by applicable law (such as deliberate
151+
and grossly negligent acts) or agreed to in writing, shall any Contributor be
152+
liable to You for damages, including any direct, indirect, special, incidental,
153+
or consequential damages of any character arising as a result of this License or
154+
out of the use or inability to use the Work (including but not limited to
155+
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
156+
any and all other commercial damages or losses), even if such Contributor has
157+
been advised of the possibility of such damages.
158+
159+
#### 9. Accepting Warranty or Additional Liability
160+
161+
While redistributing the Work or Derivative Works thereof, You may choose to
162+
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
163+
other liability obligations and/or rights consistent with this License. However,
164+
in accepting such obligations, You may act only on Your own behalf and on Your
165+
sole responsibility, not on behalf of any other Contributor, and only if You
166+
agree to indemnify, defend, and hold each Contributor harmless for any liability
167+
incurred by, or claims asserted against, such Contributor by reason of your
168+
accepting any such warranty or additional liability.

README.md

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
11
# TKeeper
2+
![](assets/gitkeeper.png)
23

3-
**TKeeper** is a threshold signature service that provides a simple REST API for distributed signing using **GG20 (Threshold ECDSA)** and **FROST (Threshold Schnorr)** protocols. The service abstracts the complexity of multiparty computation: to sign a message, a client just needs to send a single HTTP request.
4+
**TKeeper** is a threshold signature service that provides a simple REST API for distributed signing using **GG20 (Threshold ECDSA)** and **FROST (Threshold Schnorr)** protocols. The service abstracts the complexity of multiparty computation: to sign a message or generate a key, a client just needs to send a single HTTP request.
5+
Powered by [tss4j](https://github.com/exploit-org/tss4j) - our threshold cryptography library.
46

57
It is suitable for custody systems, MPC-based wallets, and backend services that require distributed key management and signing without exposing private keys to any single participant.
68

7-
We avoid using high-level abstractions such as `BigInteger` for handling sensitive data. All arithmetic operations on secret shares and cryptographic material are performed through low-level bindings over **libgmp**, allowing precise memory control and zeroing. For highly sensitive values (such as private key shares), **SecretBox** from **libsodium** is used for encryption in memory. The memory encryption key is generated every time application is started. For local persistent storage, TKeeper uses **RocksDB**, with all secret data encrypted with your **seal** key before being written to disk.
8-
99
---
1010

1111
## Requirements
1212

1313
TKeeper depends on several native libraries for cryptographic operations. Make sure the following are installed on the system:
1414

1515
- [libsodium](https://github.com/jedisct1/libsodium) – used for secure memory handling and Ed25519 point ops
16-
- [libgmp](https://gmplib.org/) – used for arbitrary-precision arithmetic
16+
- [libgmp](https://gmplib.org/) – used for arbitrary-precision arithmetic (constant time for sensitive data)
1717
- [libsecp256k1](https://github.com/bitcoin-core/secp256k1) – used for Secp256k1 point ops
1818

1919
Make sure these libraries are available in your environment and linked correctly.
20+
21+
> TKeeper doesn't require these libs on Windows x64, Linux x64, and macOS Apple Silicon, as it includes precompiled native dependencies for these platforms.
22+
2023
___
2124

2225
## Documentation
23-
See [docs](docs) for detailed documentation on, or visit [docs.exploit.org/tkeeper](https://docs.exploit.org/tkeeper) for
24-
user-friendly documentation.
26+
See [docs](docs) for detailed documentation, or visit [docs.exploit.org/tkeeper](https://docs.exploit.org/tkeeper) for
27+
user-friendly view.
28+
29+
## License
30+
Finja is licensed under the [Apache License, Version 2.0](LICENSE.md)

SECURITY.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Reporting Security Issues
2+
Don't hesitate to report security issues. If you discover a potential security vulnerability in this project, please report it as soon as possible:
3+
4+
> security@exploit.org
5+
6+
Having PoC is not required, but it will help us to fix the issue faster.

assets/gitkeeper.png

247 KB
Loading

build.gradle

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,6 @@ plugins {
77
repositories {
88
mavenCentral()
99
mavenLocal()
10-
11-
maven {
12-
url 'http://maven.hub/'
13-
credentials {
14-
username mavenUsername
15-
password mavenPassword
16-
}
17-
18-
allowInsecureProtocol = true
19-
}
2010
}
2111

2212
dependencies {
@@ -37,13 +27,18 @@ dependencies {
3727

3828
implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.18.3'
3929

40-
implementation 'org.exploit.tss:gg20:0.0.2.4'
41-
implementation 'org.exploit.tss:frost:0.0.2.4'
30+
implementation 'org.exploit:gg20:0.0.1'
31+
implementation 'org.exploit:frost:0.0.1'
32+
33+
implementation 'org.exploit:ed25519:0.0.1'
34+
implementation 'org.exploit:secp256k1:0.0.1'
4235

43-
implementation 'org.exploit.tss:ed25519:0.0.2.4'
44-
implementation 'org.exploit.tss:secp256k1:0.0.2.4'
36+
implementation 'org.exploit:tss4j:0.0.1'
37+
implementation 'org.exploit:crypto:1.0.0'
4538

46-
implementation 'org.exploit.tss:core:0.0.2.4'
39+
implementation("org.exploit:tss4j-natives:1.0.0:linux-amd64@jar")
40+
implementation("org.exploit:tss4j-natives:1.0.0:macos-aarch64@jar")
41+
implementation("org.exploit:tss4j-natives:1.0.0:windows-amd64@jar")
4742

4843
implementation 'com.nimbusds:nimbus-jose-jwt:10.2'
4944

@@ -61,7 +56,7 @@ dependencies {
6156
}
6257

6358
group 'org.exploit'
64-
version '0.0.1-SNAPSHOT'
59+
version '1.0.0-BETA'
6560

6661
java {
6762
sourceCompatibility = JavaVersion.VERSION_17
@@ -82,8 +77,7 @@ configurations.configureEach {
8277
resolutionStrategy {
8378
force(
8479
"net.java.dev.jna:jna:5.17.0",
85-
"net.java.dev.jna:jna-platform:5.17.0",
86-
"org.exploit:crypto:0.0.9-patch1",
80+
"net.java.dev.jna:jna-platform:5.17.0"
8781
)
8882
}
8983
}

docs/BUILD.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ TKeeper depends on several native libraries for cryptographic operations. Make s
99

1010
Make sure these libraries are available in your environment and linked correctly.
1111

12+
> TKeeper doesn't require this libs on Windows x64, Linux x64, and macos Apple Silicon, as it includes precompiled native dependencies for these platforms.
13+
1214
---
1315
## Build with Gradle
1416

docs/STORE.md

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,4 @@ Trusted dealer mode may be useful in:
7575
- Recovery operations where the original key is known
7676

7777
However, this mode **removes the trust separation** provided by MPC.
78-
Only use it when distributed key generation (DKG) is not an option.
79-
80-
---
81-
82-
## Summary
83-
84-
- Submit one full private key → TKeeper splits and distributes shares to all peers
85-
- All nodes must be online during the process
86-
- Each peer receives and stores only their share
87-
- Should be used only when DKG is not feasible
78+
Only use it when distributed key generation (DKG) is not an option.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.exploit.keeper
2+
3+
import io.quarkus.runtime.Quarkus
4+
import io.quarkus.runtime.annotations.QuarkusMain
5+
import org.exploit.tss.TSS
6+
7+
@QuarkusMain
8+
class TKeeper
9+
10+
fun main(args: Array<String>) {
11+
TSS.loadLibraries()
12+
Quarkus.run(*args)
13+
}

src/main/kotlin/org/exploit/keeper/api/auth/KeeperAuthenticator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package org.exploit.keeper.api.auth
22

33
import org.eclipse.jetty.client.api.Request
4-
import org.exploit.crypto.Hash
54
import org.exploit.crypto.curve.Ed25519Provider
65
import org.exploit.jettyx.auth.Authorization
76
import org.exploit.keeper.db.RocksKeyDB
87
import org.exploit.keeper.extension.toBase64
8+
import org.exploit.tss.util.Hash
99

1010
class KeeperAuthenticator(private val db: RocksKeyDB): Authorization {
1111
private val initData by lazy {

src/main/kotlin/org/exploit/keeper/api/client/TKeeperClient.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import org.exploit.keeper.extension.toSchnorrSignature
1111
import org.exploit.keeper.util.cache.CachedValue
1212
import org.exploit.tss.exception.IdentifiableAbortException
1313

14-
class TKeeperClient(val peerId: Int, auth: KeeperAuthenticator, url: String, jettyx: Jettyx) {
14+
class TKeeperClient(val peerId: Int, auth: KeeperAuthenticator, val url: String, jettyx: Jettyx) {
1515
private val publicKey: CachedValue<Ed25519PublicKey> = CachedValue(
1616
expireAfterMillis = 60 * 60 * 1000,
1717
compute = {

src/main/kotlin/org/exploit/keeper/controller/store/KeyStoreController.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@ import jakarta.ws.rs.Path
55
import jakarta.ws.rs.QueryParam
66
import org.exploit.keeper.model.request.Store
77
import org.exploit.keeper.service.core.KeeperStorageService
8-
import org.slf4j.Logger
9-
import org.slf4j.LoggerFactory
108

119
@Path("/v1/storage")
1210
class KeyStoreController(private val storage: KeeperStorageService) {
1311
@POST
1412
@Path("/store")
1513
fun store(body: Store) {
16-
LOGGER.info("Storing share for keyId: ${body.keyId}, curve: ${body.curve}")
1714
storage.storeShare(body)
1815
}
1916

@@ -22,8 +19,4 @@ class KeyStoreController(private val storage: KeeperStorageService) {
2219
fun revert(@QueryParam("keyId") keyId: String) {
2320
storage.deleteShare(keyId)
2421
}
25-
26-
private companion object {
27-
val LOGGER: Logger = LoggerFactory.getLogger(KeyStoreController::class.java)
28-
}
2922
}

0 commit comments

Comments
 (0)