@bsv/sdk 1.1.33 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/mod.js +4 -0
- package/dist/cjs/mod.js.map +1 -1
- package/dist/cjs/package.json +4 -3
- package/dist/cjs/src/auth/Certificate.js +163 -0
- package/dist/cjs/src/auth/Certificate.js.map +1 -0
- package/dist/cjs/src/auth/index.js +9 -0
- package/dist/cjs/src/auth/index.js.map +1 -0
- package/dist/cjs/src/compat/BSM.js +17 -7
- package/dist/cjs/src/compat/BSM.js.map +1 -1
- package/dist/cjs/src/compat/ECIES.js +17 -7
- package/dist/cjs/src/compat/ECIES.js.map +1 -1
- package/dist/cjs/src/compat/HD.js +17 -7
- package/dist/cjs/src/compat/HD.js.map +1 -1
- package/dist/cjs/src/compat/Mnemonic.js +17 -7
- package/dist/cjs/src/compat/Mnemonic.js.map +1 -1
- package/dist/cjs/src/compat/index.js +17 -7
- package/dist/cjs/src/compat/index.js.map +1 -1
- package/dist/cjs/src/messages/index.js +17 -7
- package/dist/cjs/src/messages/index.js.map +1 -1
- package/dist/cjs/src/overlay-tools/LookupResolver.js +170 -0
- package/dist/cjs/src/overlay-tools/LookupResolver.js.map +1 -0
- package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js +69 -0
- package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -0
- package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js +336 -0
- package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js.map +1 -0
- package/dist/cjs/src/overlay-tools/index.js +29 -0
- package/dist/cjs/src/overlay-tools/index.js.map +1 -0
- package/dist/cjs/src/primitives/PrivateKey.js +17 -7
- package/dist/cjs/src/primitives/PrivateKey.js.map +1 -1
- package/dist/cjs/src/primitives/TransactionSignature.js +17 -7
- package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/cjs/src/primitives/index.js +17 -7
- package/dist/cjs/src/primitives/index.js.map +1 -1
- package/dist/cjs/src/script/Spend.js +17 -7
- package/dist/cjs/src/script/Spend.js.map +1 -1
- package/dist/cjs/src/script/templates/PushDrop.js +218 -0
- package/dist/cjs/src/script/templates/PushDrop.js.map +1 -0
- package/dist/cjs/src/script/templates/index.js +3 -1
- package/dist/cjs/src/script/templates/index.js.map +1 -1
- package/dist/cjs/src/transaction/http/DefaultHttpClient.js +1 -1
- package/dist/cjs/src/transaction/http/DefaultHttpClient.js.map +1 -1
- package/dist/cjs/src/wallet/CachedKeyDeriver.js +177 -0
- package/dist/cjs/src/wallet/CachedKeyDeriver.js.map +1 -0
- package/dist/cjs/src/wallet/KeyDeriver.js +174 -0
- package/dist/cjs/src/wallet/KeyDeriver.js.map +1 -0
- package/dist/cjs/src/wallet/ProtoWallet.js +245 -0
- package/dist/cjs/src/wallet/ProtoWallet.js.map +1 -0
- package/dist/cjs/src/wallet/Wallet.interfaces.js +3 -0
- package/dist/cjs/src/wallet/Wallet.interfaces.js.map +1 -0
- package/dist/cjs/src/wallet/WalletClient.js +181 -0
- package/dist/cjs/src/wallet/WalletClient.js.map +1 -0
- package/dist/cjs/src/wallet/WalletError.js +28 -0
- package/dist/cjs/src/wallet/WalletError.js.map +1 -0
- package/dist/cjs/src/wallet/index.js +34 -0
- package/dist/cjs/src/wallet/index.js.map +1 -0
- package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js +45 -0
- package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js.map +1 -0
- package/dist/cjs/src/wallet/substrates/WalletWire.js +3 -0
- package/dist/cjs/src/wallet/substrates/WalletWire.js.map +1 -0
- package/dist/cjs/src/wallet/substrates/WalletWireCalls.js +36 -0
- package/dist/cjs/src/wallet/substrates/WalletWireCalls.js.map +1 -0
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +1821 -0
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -0
- package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +1305 -0
- package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -0
- package/dist/cjs/src/wallet/substrates/XDM.js +130 -0
- package/dist/cjs/src/wallet/substrates/XDM.js.map +1 -0
- package/dist/cjs/src/wallet/substrates/index.js +33 -0
- package/dist/cjs/src/wallet/substrates/index.js.map +1 -0
- package/dist/cjs/src/wallet/substrates/window.CWI.js +102 -0
- package/dist/cjs/src/wallet/substrates/window.CWI.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/mod.js +4 -0
- package/dist/esm/mod.js.map +1 -1
- package/dist/esm/src/auth/Certificate.js +185 -0
- package/dist/esm/src/auth/Certificate.js.map +1 -0
- package/dist/esm/src/auth/index.js +2 -0
- package/dist/esm/src/auth/index.js.map +1 -0
- package/dist/esm/src/overlay-tools/LookupResolver.js +167 -0
- package/dist/esm/src/overlay-tools/LookupResolver.js.map +1 -0
- package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js +64 -0
- package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -0
- package/dist/esm/src/overlay-tools/SHIPBroadcaster.js +335 -0
- package/dist/esm/src/overlay-tools/SHIPBroadcaster.js.map +1 -0
- package/dist/esm/src/overlay-tools/index.js +6 -0
- package/dist/esm/src/overlay-tools/index.js.map +1 -0
- package/dist/esm/src/script/templates/PushDrop.js +215 -0
- package/dist/esm/src/script/templates/PushDrop.js.map +1 -0
- package/dist/esm/src/script/templates/index.js +1 -0
- package/dist/esm/src/script/templates/index.js.map +1 -1
- package/dist/esm/src/transaction/http/DefaultHttpClient.js +1 -1
- package/dist/esm/src/transaction/http/DefaultHttpClient.js.map +1 -1
- package/dist/esm/src/wallet/CachedKeyDeriver.js +174 -0
- package/dist/esm/src/wallet/CachedKeyDeriver.js.map +1 -0
- package/dist/esm/src/wallet/KeyDeriver.js +172 -0
- package/dist/esm/src/wallet/KeyDeriver.js.map +1 -0
- package/dist/esm/src/wallet/ProtoWallet.js +207 -0
- package/dist/esm/src/wallet/ProtoWallet.js.map +1 -0
- package/dist/esm/src/wallet/Wallet.interfaces.js +2 -0
- package/dist/esm/src/wallet/Wallet.interfaces.js.map +1 -0
- package/dist/esm/src/wallet/WalletClient.js +177 -0
- package/dist/esm/src/wallet/WalletClient.js.map +1 -0
- package/dist/esm/src/wallet/WalletError.js +25 -0
- package/dist/esm/src/wallet/WalletError.js.map +1 -0
- package/dist/esm/src/wallet/index.js +9 -0
- package/dist/esm/src/wallet/index.js.map +1 -0
- package/dist/esm/src/wallet/substrates/HTTPWalletWire.js +42 -0
- package/dist/esm/src/wallet/substrates/HTTPWalletWire.js.map +1 -0
- package/dist/esm/src/wallet/substrates/WalletWire.js +2 -0
- package/dist/esm/src/wallet/substrates/WalletWire.js.map +1 -0
- package/dist/esm/src/wallet/substrates/WalletWireCalls.js +34 -0
- package/dist/esm/src/wallet/substrates/WalletWireCalls.js.map +1 -0
- package/dist/esm/src/wallet/substrates/WalletWireProcessor.js +1816 -0
- package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -0
- package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js +1300 -0
- package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -0
- package/dist/esm/src/wallet/substrates/XDM.js +128 -0
- package/dist/esm/src/wallet/substrates/XDM.js.map +1 -0
- package/dist/esm/src/wallet/substrates/index.js +8 -0
- package/dist/esm/src/wallet/substrates/index.js.map +1 -0
- package/dist/esm/src/wallet/substrates/window.CWI.js +100 -0
- package/dist/esm/src/wallet/substrates/window.CWI.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/mod.d.ts +4 -0
- package/dist/types/mod.d.ts.map +1 -1
- package/dist/types/src/auth/Certificate.d.ts +76 -0
- package/dist/types/src/auth/Certificate.d.ts.map +1 -0
- package/dist/types/src/auth/index.d.ts +2 -0
- package/dist/types/src/auth/index.d.ts.map +1 -0
- package/dist/types/src/overlay-tools/LookupResolver.d.ts +71 -0
- package/dist/types/src/overlay-tools/LookupResolver.d.ts.map +1 -0
- package/dist/types/src/overlay-tools/OverlayAdminTokenTemplate.d.ts +44 -0
- package/dist/types/src/overlay-tools/OverlayAdminTokenTemplate.d.ts.map +1 -0
- package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts +90 -0
- package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts.map +1 -0
- package/dist/types/src/overlay-tools/index.d.ts +6 -0
- package/dist/types/src/overlay-tools/index.d.ts.map +1 -0
- package/dist/types/src/script/templates/PushDrop.d.ts +53 -0
- package/dist/types/src/script/templates/PushDrop.d.ts.map +1 -0
- package/dist/types/src/script/templates/index.d.ts +1 -0
- package/dist/types/src/script/templates/index.d.ts.map +1 -1
- package/dist/types/src/wallet/CachedKeyDeriver.d.ts +92 -0
- package/dist/types/src/wallet/CachedKeyDeriver.d.ts.map +1 -0
- package/dist/types/src/wallet/KeyDeriver.d.ts +72 -0
- package/dist/types/src/wallet/KeyDeriver.d.ts.map +1 -0
- package/dist/types/src/wallet/ProtoWallet.d.ts +415 -0
- package/dist/types/src/wallet/ProtoWallet.d.ts.map +1 -0
- package/dist/types/src/wallet/Wallet.interfaces.d.ts +996 -0
- package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -0
- package/dist/types/src/wallet/WalletClient.d.ts +182 -0
- package/dist/types/src/wallet/WalletClient.d.ts.map +1 -0
- package/dist/types/src/wallet/WalletError.d.ts +14 -0
- package/dist/types/src/wallet/WalletError.d.ts.map +1 -0
- package/dist/types/src/wallet/index.d.ts +9 -0
- package/dist/types/src/wallet/index.d.ts.map +1 -0
- package/dist/types/src/wallet/substrates/HTTPWalletWire.d.ts +9 -0
- package/dist/types/src/wallet/substrates/HTTPWalletWire.d.ts.map +1 -0
- package/dist/types/src/wallet/substrates/WalletWire.d.ts +7 -0
- package/dist/types/src/wallet/substrates/WalletWire.d.ts.map +1 -0
- package/dist/types/src/wallet/substrates/WalletWireCalls.d.ts +33 -0
- package/dist/types/src/wallet/substrates/WalletWireCalls.d.ts.map +1 -0
- package/dist/types/src/wallet/substrates/WalletWireProcessor.d.ts +18 -0
- package/dist/types/src/wallet/substrates/WalletWireProcessor.d.ts.map +1 -0
- package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts +196 -0
- package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts.map +1 -0
- package/dist/types/src/wallet/substrates/XDM.d.ts +412 -0
- package/dist/types/src/wallet/substrates/XDM.d.ts.map +1 -0
- package/dist/types/src/wallet/substrates/index.d.ts +8 -0
- package/dist/types/src/wallet/substrates/index.d.ts.map +1 -0
- package/dist/types/src/wallet/substrates/window.CWI.d.ts +410 -0
- package/dist/types/src/wallet/substrates/window.CWI.d.ts.map +1 -0
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/umd/bundle.js +1 -1
- package/docs/overlay-tools.md +551 -0
- package/docs/script.md +135 -0
- package/docs/totp.md +119 -0
- package/docs/wallet-substrates.md +10 -0
- package/docs/wallet.md +4182 -0
- package/mod.ts +5 -1
- package/package.json +44 -3
- package/src/auth/Certificate.ts +233 -0
- package/src/auth/__tests/Certificate.test.ts +282 -0
- package/src/auth/index.ts +1 -0
- package/src/overlay-tools/LookupResolver.ts +228 -0
- package/src/overlay-tools/OverlayAdminTokenTemplate.ts +79 -0
- package/src/overlay-tools/SHIPBroadcaster.ts +405 -0
- package/src/overlay-tools/__tests/LookupResolver.test.ts +1403 -0
- package/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.ts +69 -0
- package/src/overlay-tools/__tests/SHIPBroadcaster.test.ts +904 -0
- package/src/overlay-tools/index.ts +5 -0
- package/src/script/templates/PushDrop.ts +246 -0
- package/src/script/templates/__tests/PushDrop.test.ts +158 -0
- package/src/script/templates/index.ts +1 -0
- package/src/transaction/http/DefaultHttpClient.ts +1 -1
- package/src/wallet/CachedKeyDeriver.ts +193 -0
- package/src/wallet/KeyDeriver.ts +178 -0
- package/src/wallet/ProtoWallet.ts +732 -0
- package/src/wallet/Wallet.interfaces.ts +1170 -0
- package/src/wallet/WalletClient.ts +201 -0
- package/src/wallet/WalletError.ts +27 -0
- package/src/wallet/__tests/CachedKeyDeriver.test.ts +322 -0
- package/src/wallet/__tests/KeyDeriver.test.ts +118 -0
- package/src/wallet/__tests/ProtoWallet.test.ts +543 -0
- package/src/wallet/index.ts +8 -0
- package/src/wallet/substrates/HTTPWalletWire.ts +47 -0
- package/src/wallet/substrates/WalletWire.ts +6 -0
- package/src/wallet/substrates/WalletWireCalls.ts +34 -0
- package/src/wallet/substrates/WalletWireProcessor.ts +2046 -0
- package/src/wallet/substrates/WalletWireTransceiver.ts +1454 -0
- package/src/wallet/substrates/XDM.ts +157 -0
- package/src/wallet/substrates/__tests/WalletWire.integration.test.ts +2194 -0
- package/src/wallet/substrates/__tests/XDM.test.ts +659 -0
- package/src/wallet/substrates/index.ts +7 -0
- package/src/wallet/substrates/window.CWI.ts +133 -0
package/mod.ts
CHANGED
|
@@ -8,4 +8,8 @@ export * from "./src/transaction/chaintrackers/index.js"
|
|
|
8
8
|
export * from "./src/transaction/http/index.js"
|
|
9
9
|
export * from "./src/messages/index.js"
|
|
10
10
|
export * from "./src/compat/index.js"
|
|
11
|
-
export * from "./src/totp/index.js"
|
|
11
|
+
export * from "./src/totp/index.js"
|
|
12
|
+
export * from "./src/wallet/index.js"
|
|
13
|
+
export * from "./src/wallet/substrates/index.js"
|
|
14
|
+
export * from "./src/auth/index.js"
|
|
15
|
+
export * from "./src/overlay-tools/index.js"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bsv/sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "BSV Blockchain Software Development Kit",
|
|
6
6
|
"main": "dist/cjs/mod.js",
|
|
@@ -134,6 +134,46 @@
|
|
|
134
134
|
"require": "./dist/cjs/src/totp/*.js",
|
|
135
135
|
"types": "./dist/types/src/totp/*.d.ts"
|
|
136
136
|
},
|
|
137
|
+
"./wallet": {
|
|
138
|
+
"import": "./dist/esm/src/wallet/index.js",
|
|
139
|
+
"require": "./dist/cjs/src/wallet/index.js",
|
|
140
|
+
"types": "./dist/types/src/wallet/index.d.ts"
|
|
141
|
+
},
|
|
142
|
+
"./wallet/*": {
|
|
143
|
+
"import": "./dist/esm/src/wallet/*.js",
|
|
144
|
+
"require": "./dist/cjs/src/wallet/*.js",
|
|
145
|
+
"types": "./dist/types/src/wallet/*.d.ts"
|
|
146
|
+
},
|
|
147
|
+
"./wallet/substrates": {
|
|
148
|
+
"import": "./dist/esm/src/wallet/substrates/index.js",
|
|
149
|
+
"require": "./dist/cjs/src/wallet/substrates/index.js",
|
|
150
|
+
"types": "./dist/types/src/wallet/substrates/index.d.ts"
|
|
151
|
+
},
|
|
152
|
+
"./wallet/substrates/*": {
|
|
153
|
+
"import": "./dist/esm/src/wallet/substrates/*.js",
|
|
154
|
+
"require": "./dist/cjs/src/wallet/substrates/*.js",
|
|
155
|
+
"types": "./dist/types/src/wallet/substrates/*.d.ts"
|
|
156
|
+
},
|
|
157
|
+
"./auth": {
|
|
158
|
+
"import": "./dist/esm/src/auth/index.js",
|
|
159
|
+
"require": "./dist/cjs/src/auth/index.js",
|
|
160
|
+
"types": "./dist/types/src/auth/index.d.ts"
|
|
161
|
+
},
|
|
162
|
+
"./auth/*": {
|
|
163
|
+
"import": "./dist/esm/src/auth/*.js",
|
|
164
|
+
"require": "./dist/cjs/src/auth/*.js",
|
|
165
|
+
"types": "./dist/types/src/auth/*.d.ts"
|
|
166
|
+
},
|
|
167
|
+
"./overlay-tools": {
|
|
168
|
+
"import": "./dist/esm/src/overlay-tools/index.js",
|
|
169
|
+
"require": "./dist/cjs/src/overlay-tools/index.js",
|
|
170
|
+
"types": "./dist/types/src/overlay-tools/index.d.ts"
|
|
171
|
+
},
|
|
172
|
+
"./overlay-tools/*": {
|
|
173
|
+
"import": "./dist/esm/src/overlay-tools/*.js",
|
|
174
|
+
"require": "./dist/cjs/src/overlay-tools/*.js",
|
|
175
|
+
"types": "./dist/types/src/overlay-tools/*.d.ts"
|
|
176
|
+
},
|
|
137
177
|
"./umd": {
|
|
138
178
|
"import": "./dist/umd/bundle.js"
|
|
139
179
|
}
|
|
@@ -148,7 +188,7 @@
|
|
|
148
188
|
"build:umd": "webpack --config webpack.config.js",
|
|
149
189
|
"dev": "tsc -b -w",
|
|
150
190
|
"prepublish": "npm run build",
|
|
151
|
-
"doc": "ts2md --inputFilename=src/script/index.ts --outputFilename=docs/script.md --filenameSubString=script --firstHeadingLevel=1 && ts2md --inputFilename=src/primitives/index.ts --outputFilename=docs/primitives.md --filenameSubString=primitives --firstHeadingLevel=1 && ts2md --inputFilename=src/transaction/index.ts --outputFilename=docs/transaction.md --filenameSubString=transaction --firstHeadingLevel=1 && ts2md --inputFilename=src/messages/index.ts --outputFilename=docs/messages.md --filenameSubString=messages --firstHeadingLevel=1 && ts2md --inputFilename=src/compat/index.ts --outputFilename=docs/compat.md --filenameSubString=compat --firstHeadingLevel=1"
|
|
191
|
+
"doc": "ts2md --inputFilename=src/script/index.ts --outputFilename=docs/script.md --filenameSubString=script --firstHeadingLevel=1 && ts2md --inputFilename=src/primitives/index.ts --outputFilename=docs/primitives.md --filenameSubString=primitives --firstHeadingLevel=1 && ts2md --inputFilename=src/transaction/index.ts --outputFilename=docs/transaction.md --filenameSubString=transaction --firstHeadingLevel=1 && ts2md --inputFilename=src/messages/index.ts --outputFilename=docs/messages.md --filenameSubString=messages --firstHeadingLevel=1 && ts2md --inputFilename=src/compat/index.ts --outputFilename=docs/compat.md --filenameSubString=compat --firstHeadingLevel=1 && ts2md --inputFilename=src/wallet/index.ts --outputFilename=docs/wallet.md --filenameSubString=wallet --firstHeadingLevel=1 && ts2md --inputFilename=src/totp/index.ts --outputFilename=docs/totp.md --filenameSubString=totp --firstHeadingLevel=1 && ts2md --inputFilename=src/overlay-tools/index.ts --outputFilename=docs/overlay-tools.md --filenameSubString=overlay-tools --firstHeadingLevel=1"
|
|
152
192
|
},
|
|
153
193
|
"repository": {
|
|
154
194
|
"type": "git",
|
|
@@ -168,8 +208,9 @@
|
|
|
168
208
|
},
|
|
169
209
|
"homepage": "https://github.com/bitcoin-sv/ts-sdk#readme",
|
|
170
210
|
"devDependencies": {
|
|
171
|
-
"@types/jest": "^29.5.
|
|
211
|
+
"@types/jest": "^29.5.14",
|
|
172
212
|
"jest": "^29.7.0",
|
|
213
|
+
"jest-environment-jsdom": "^29.7.0",
|
|
173
214
|
"ts-jest": "^29.1.1",
|
|
174
215
|
"ts-loader": "^9.5.1",
|
|
175
216
|
"ts-standard": "^12.0.2",
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { Utils } from '../primitives/index.js'
|
|
2
|
+
import { Wallet, Base64String, PubKeyHex, HexString, OutpointString, CertificateFieldNameUnder50Bytes } from '../wallet/Wallet.interfaces.js'
|
|
3
|
+
import ProtoWallet from '../wallet/ProtoWallet.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Represents an Identity Certificate as per the Wallet interface specifications.
|
|
7
|
+
*
|
|
8
|
+
* This class provides methods to serialize and deserialize certificates, as well as signing and verifying the certificate's signature.
|
|
9
|
+
*/
|
|
10
|
+
export default class Certificate {
|
|
11
|
+
/**
|
|
12
|
+
* Type identifier for the certificate, base64 encoded string, 32 bytes.
|
|
13
|
+
*/
|
|
14
|
+
type: Base64String
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Unique serial number of the certificate, base64 encoded string, 32 bytes.
|
|
18
|
+
*/
|
|
19
|
+
serialNumber: Base64String
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The public key belonging to the certificate's subject, compressed public key hex string.
|
|
23
|
+
*/
|
|
24
|
+
subject: PubKeyHex
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Public key of the certifier who issued the certificate, compressed public key hex string.
|
|
28
|
+
*/
|
|
29
|
+
certifier: PubKeyHex
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The outpoint used to confirm that the certificate has not been revoked (TXID.OutputIndex), as a string.
|
|
33
|
+
*/
|
|
34
|
+
revocationOutpoint: OutpointString
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* All the fields present in the certificate, with field names as keys and field values as strings.
|
|
38
|
+
*/
|
|
39
|
+
fields: Record<CertificateFieldNameUnder50Bytes, string>
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Certificate signature by the certifier's private key, DER encoded hex string.
|
|
43
|
+
*/
|
|
44
|
+
signature?: HexString
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Constructs a new Certificate.
|
|
48
|
+
*
|
|
49
|
+
* @param {Base64String} type - Type identifier for the certificate, base64 encoded string, 32 bytes.
|
|
50
|
+
* @param {Base64String} serialNumber - Unique serial number of the certificate, base64 encoded string, 32 bytes.
|
|
51
|
+
* @param {PubKeyHex} subject - The public key belonging to the certificate's subject, compressed public key hex string.
|
|
52
|
+
* @param {PubKeyHex} certifier - Public key of the certifier who issued the certificate, compressed public key hex string.
|
|
53
|
+
* @param {OutpointString} revocationOutpoint - The outpoint used to confirm that the certificate has not been revoked (TXID.OutputIndex), as a string.
|
|
54
|
+
* @param {Record<CertificateFieldNameUnder50Bytes, string>} fields - All the fields present in the certificate.
|
|
55
|
+
* @param {HexString} signature - Certificate signature by the certifier's private key, DER encoded hex string.
|
|
56
|
+
*/
|
|
57
|
+
constructor(
|
|
58
|
+
type: Base64String,
|
|
59
|
+
serialNumber: Base64String,
|
|
60
|
+
subject: PubKeyHex,
|
|
61
|
+
certifier: PubKeyHex,
|
|
62
|
+
revocationOutpoint: OutpointString,
|
|
63
|
+
fields: Record<CertificateFieldNameUnder50Bytes, string>,
|
|
64
|
+
signature?: HexString,
|
|
65
|
+
) {
|
|
66
|
+
this.type = type
|
|
67
|
+
this.serialNumber = serialNumber
|
|
68
|
+
this.subject = subject
|
|
69
|
+
this.certifier = certifier
|
|
70
|
+
this.revocationOutpoint = revocationOutpoint
|
|
71
|
+
this.fields = fields
|
|
72
|
+
this.signature = signature
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Serializes the certificate into binary format, with or without a signature.
|
|
77
|
+
*
|
|
78
|
+
* @param {boolean} [includeSignature=true] - Whether to include the signature in the serialization.
|
|
79
|
+
* @returns {number[]} - The serialized certificate in binary format.
|
|
80
|
+
*/
|
|
81
|
+
toBin(includeSignature: boolean = true): number[] {
|
|
82
|
+
const writer = new Utils.Writer()
|
|
83
|
+
|
|
84
|
+
// Write type (Base64String, 32 bytes)
|
|
85
|
+
const typeBytes = Utils.toArray(this.type, 'base64')
|
|
86
|
+
writer.write(typeBytes)
|
|
87
|
+
|
|
88
|
+
// Write serialNumber (Base64String, 32 bytes)
|
|
89
|
+
const serialNumberBytes = Utils.toArray(this.serialNumber, 'base64')
|
|
90
|
+
writer.write(serialNumberBytes)
|
|
91
|
+
|
|
92
|
+
// Write subject (33 bytes compressed PubKeyHex)
|
|
93
|
+
const subjectBytes = Utils.toArray(this.subject, 'hex')
|
|
94
|
+
writer.write(subjectBytes)
|
|
95
|
+
|
|
96
|
+
// Write certifier (33 bytes compressed PubKeyHex)
|
|
97
|
+
const certifierBytes = Utils.toArray(this.certifier, 'hex')
|
|
98
|
+
writer.write(certifierBytes)
|
|
99
|
+
|
|
100
|
+
// Write revocationOutpoint (TXID + OutputIndex)
|
|
101
|
+
const [txid, outputIndex] = this.revocationOutpoint.split('.')
|
|
102
|
+
const txidBytes = Utils.toArray(txid, 'hex')
|
|
103
|
+
writer.write(txidBytes)
|
|
104
|
+
writer.writeVarIntNum(Number(outputIndex))
|
|
105
|
+
|
|
106
|
+
// Write fields
|
|
107
|
+
const fieldEntries = Object.entries(this.fields)
|
|
108
|
+
writer.writeVarIntNum(fieldEntries.length)
|
|
109
|
+
for (const [fieldName, fieldValue] of fieldEntries) {
|
|
110
|
+
// Field name
|
|
111
|
+
const fieldNameBytes = Utils.toArray(fieldName, 'utf8')
|
|
112
|
+
writer.writeVarIntNum(fieldNameBytes.length)
|
|
113
|
+
writer.write(fieldNameBytes)
|
|
114
|
+
|
|
115
|
+
// Field value
|
|
116
|
+
const fieldValueBytes = Utils.toArray(fieldValue, 'utf8')
|
|
117
|
+
writer.writeVarIntNum(fieldValueBytes.length)
|
|
118
|
+
writer.write(fieldValueBytes)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Write signature if included
|
|
122
|
+
if (includeSignature && this.signature && this.signature.length > 0) {
|
|
123
|
+
const signatureBytes = Utils.toArray(this.signature, 'hex')
|
|
124
|
+
writer.writeVarIntNum(signatureBytes.length)
|
|
125
|
+
writer.write(signatureBytes)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return writer.toArray()
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Deserializes a certificate from binary format.
|
|
133
|
+
*
|
|
134
|
+
* @param {number[]} bin - The binary data representing the certificate.
|
|
135
|
+
* @returns {Certificate} - The deserialized Certificate object.
|
|
136
|
+
*/
|
|
137
|
+
static fromBin(bin: number[]): Certificate {
|
|
138
|
+
const reader = new Utils.Reader(bin)
|
|
139
|
+
|
|
140
|
+
// Read type
|
|
141
|
+
const typeBytes = reader.read(32)
|
|
142
|
+
const type = Utils.toBase64(typeBytes)
|
|
143
|
+
|
|
144
|
+
// Read serialNumber
|
|
145
|
+
const serialNumberBytes = reader.read(32)
|
|
146
|
+
const serialNumber = Utils.toBase64(serialNumberBytes)
|
|
147
|
+
|
|
148
|
+
// Read subject (33 bytes)
|
|
149
|
+
const subjectBytes = reader.read(33)
|
|
150
|
+
const subject = Utils.toHex(subjectBytes)
|
|
151
|
+
|
|
152
|
+
// Read certifier (33 bytes)
|
|
153
|
+
const certifierBytes = reader.read(33)
|
|
154
|
+
const certifier = Utils.toHex(certifierBytes)
|
|
155
|
+
|
|
156
|
+
// Read revocationOutpoint
|
|
157
|
+
const txidBytes = reader.read(32)
|
|
158
|
+
const txid = Utils.toHex(txidBytes)
|
|
159
|
+
const outputIndex = reader.readVarIntNum()
|
|
160
|
+
const revocationOutpoint = `${txid}.${outputIndex}`
|
|
161
|
+
|
|
162
|
+
// Read fields
|
|
163
|
+
const numFields = reader.readVarIntNum()
|
|
164
|
+
const fields: Record<CertificateFieldNameUnder50Bytes, string> = {}
|
|
165
|
+
for (let i = 0; i < numFields; i++) {
|
|
166
|
+
// Field name
|
|
167
|
+
const fieldNameLength = reader.readVarIntNum()
|
|
168
|
+
const fieldNameBytes = reader.read(fieldNameLength)
|
|
169
|
+
const fieldName = Utils.toUTF8(fieldNameBytes) as CertificateFieldNameUnder50Bytes
|
|
170
|
+
|
|
171
|
+
// Field value
|
|
172
|
+
const fieldValueLength = reader.readVarIntNum()
|
|
173
|
+
const fieldValueBytes = reader.read(fieldValueLength)
|
|
174
|
+
const fieldValue = Utils.toUTF8(fieldValueBytes)
|
|
175
|
+
|
|
176
|
+
fields[fieldName] = fieldValue
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Read signature if present
|
|
180
|
+
let signature: string | undefined = undefined
|
|
181
|
+
if (!reader.eof()) {
|
|
182
|
+
const signatureLength = reader.readVarIntNum()
|
|
183
|
+
const signatureBytes = reader.read(signatureLength)
|
|
184
|
+
signature = Utils.toHex(signatureBytes)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return new Certificate(
|
|
188
|
+
type,
|
|
189
|
+
serialNumber,
|
|
190
|
+
subject,
|
|
191
|
+
certifier,
|
|
192
|
+
revocationOutpoint,
|
|
193
|
+
fields,
|
|
194
|
+
signature
|
|
195
|
+
)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Verifies the certificate's signature.
|
|
200
|
+
*
|
|
201
|
+
* @returns {Promise<boolean>} - A promise that resolves to true if the signature is valid.
|
|
202
|
+
*/
|
|
203
|
+
async verify(): Promise<boolean> {
|
|
204
|
+
// A verifier can be any wallet capable of verifying signatures
|
|
205
|
+
const verifier = new ProtoWallet('anyone')
|
|
206
|
+
const verificationData = this.toBin(false) // Exclude the signature from the verification data
|
|
207
|
+
|
|
208
|
+
const { valid } = await verifier.verifySignature({
|
|
209
|
+
signature: Utils.toArray(this.signature, 'hex'),
|
|
210
|
+
data: verificationData,
|
|
211
|
+
protocolID: [2, 'certificate signature'],
|
|
212
|
+
keyID: `${this.type} ${this.serialNumber}`,
|
|
213
|
+
counterparty: this.certifier // The certifier is the one who signed the certificate
|
|
214
|
+
})
|
|
215
|
+
return valid
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Signs the certificate using the provided certifier wallet.
|
|
220
|
+
*
|
|
221
|
+
* @param {Wallet} certifier - The wallet representing the certifier.
|
|
222
|
+
* @returns {Promise<void>}
|
|
223
|
+
*/
|
|
224
|
+
async sign(certifier: Wallet): Promise<void> {
|
|
225
|
+
const preimage = this.toBin(false) // Exclude the signature when signing
|
|
226
|
+
const { signature } = await certifier.createSignature({
|
|
227
|
+
data: preimage,
|
|
228
|
+
protocolID: [2, 'certificate signature'],
|
|
229
|
+
keyID: `${this.type} ${this.serialNumber}`
|
|
230
|
+
})
|
|
231
|
+
this.signature = Utils.toHex(signature)
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import Certificate from '../../../dist/cjs/src/auth/Certificate.js'
|
|
2
|
+
import ProtoWallet from '../../../dist/cjs/src/wallet/ProtoWallet.js'
|
|
3
|
+
import { Utils, PrivateKey } from '../../../dist/cjs/src/primitives/index.js'
|
|
4
|
+
|
|
5
|
+
describe('Certificate', () => {
|
|
6
|
+
// Sample data for testing
|
|
7
|
+
const sampleType = Utils.toBase64(new Array(32).fill(1))
|
|
8
|
+
const sampleSerialNumber = Utils.toBase64(new Array(32).fill(2))
|
|
9
|
+
const sampleSubjectPrivateKey = PrivateKey.fromRandom()
|
|
10
|
+
const sampleSubjectPubKey = sampleSubjectPrivateKey.toPublicKey().toString()
|
|
11
|
+
const sampleCertifierPrivateKey = PrivateKey.fromRandom()
|
|
12
|
+
const sampleCertifierPubKey = sampleCertifierPrivateKey.toPublicKey().toString()
|
|
13
|
+
const sampleRevocationOutpoint = 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef.1'
|
|
14
|
+
const sampleFields = {
|
|
15
|
+
name: 'Alice',
|
|
16
|
+
email: 'alice@example.com',
|
|
17
|
+
organization: 'Example Corp'
|
|
18
|
+
}
|
|
19
|
+
const sampleFieldsEmpty = {}
|
|
20
|
+
|
|
21
|
+
it('should construct a Certificate with valid data', () => {
|
|
22
|
+
const certificate = new Certificate(
|
|
23
|
+
sampleType,
|
|
24
|
+
sampleSerialNumber,
|
|
25
|
+
sampleSubjectPubKey,
|
|
26
|
+
sampleCertifierPubKey,
|
|
27
|
+
sampleRevocationOutpoint,
|
|
28
|
+
sampleFields,
|
|
29
|
+
undefined // No signature
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
expect(certificate.type).toEqual(sampleType)
|
|
33
|
+
expect(certificate.serialNumber).toEqual(sampleSerialNumber)
|
|
34
|
+
expect(certificate.subject).toEqual(sampleSubjectPubKey)
|
|
35
|
+
expect(certificate.certifier).toEqual(sampleCertifierPubKey)
|
|
36
|
+
expect(certificate.revocationOutpoint).toEqual(sampleRevocationOutpoint)
|
|
37
|
+
expect(certificate.signature).toBeUndefined()
|
|
38
|
+
expect(certificate.fields).toEqual(sampleFields)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('should serialize and deserialize the Certificate without signature', () => {
|
|
42
|
+
const certificate = new Certificate(
|
|
43
|
+
sampleType,
|
|
44
|
+
sampleSerialNumber,
|
|
45
|
+
sampleSubjectPubKey,
|
|
46
|
+
sampleCertifierPubKey,
|
|
47
|
+
sampleRevocationOutpoint,
|
|
48
|
+
sampleFields,
|
|
49
|
+
undefined // No signature
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
const serialized = certificate.toBin(false) // Exclude signature
|
|
53
|
+
const deserializedCertificate = Certificate.fromBin(serialized)
|
|
54
|
+
|
|
55
|
+
expect(deserializedCertificate.type).toEqual(sampleType)
|
|
56
|
+
expect(deserializedCertificate.serialNumber).toEqual(sampleSerialNumber)
|
|
57
|
+
expect(deserializedCertificate.subject).toEqual(sampleSubjectPubKey)
|
|
58
|
+
expect(deserializedCertificate.certifier).toEqual(sampleCertifierPubKey)
|
|
59
|
+
expect(deserializedCertificate.revocationOutpoint).toEqual(sampleRevocationOutpoint)
|
|
60
|
+
expect(deserializedCertificate.signature).toBeUndefined()
|
|
61
|
+
expect(deserializedCertificate.fields).toEqual(sampleFields)
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('should serialize and deserialize the Certificate with signature', async () => {
|
|
65
|
+
const certificate = new Certificate(
|
|
66
|
+
sampleType,
|
|
67
|
+
sampleSerialNumber,
|
|
68
|
+
sampleSubjectPubKey,
|
|
69
|
+
sampleCertifierPubKey,
|
|
70
|
+
sampleRevocationOutpoint,
|
|
71
|
+
sampleFields,
|
|
72
|
+
undefined // No signature
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
// Sign the certificate
|
|
76
|
+
const certifierWallet: ProtoWallet = new ProtoWallet(sampleCertifierPrivateKey)
|
|
77
|
+
await certificate.sign(certifierWallet)
|
|
78
|
+
|
|
79
|
+
const serialized = certificate.toBin(true) // Include signature
|
|
80
|
+
const deserializedCertificate = Certificate.fromBin(serialized)
|
|
81
|
+
|
|
82
|
+
expect(deserializedCertificate.type).toEqual(sampleType)
|
|
83
|
+
expect(deserializedCertificate.serialNumber).toEqual(sampleSerialNumber)
|
|
84
|
+
expect(deserializedCertificate.subject).toEqual(sampleSubjectPubKey)
|
|
85
|
+
expect(deserializedCertificate.certifier).toEqual(sampleCertifierPubKey)
|
|
86
|
+
expect(deserializedCertificate.revocationOutpoint).toEqual(sampleRevocationOutpoint)
|
|
87
|
+
expect(deserializedCertificate.signature).toEqual(certificate.signature)
|
|
88
|
+
expect(deserializedCertificate.fields).toEqual(sampleFields)
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it('should sign the Certificate and verify the signature successfully', async () => {
|
|
92
|
+
const certificate = new Certificate(
|
|
93
|
+
sampleType,
|
|
94
|
+
sampleSerialNumber,
|
|
95
|
+
sampleSubjectPubKey,
|
|
96
|
+
sampleCertifierPubKey,
|
|
97
|
+
sampleRevocationOutpoint,
|
|
98
|
+
sampleFields,
|
|
99
|
+
undefined // No signature
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
// Sign the certificate
|
|
103
|
+
const certifierWallet: ProtoWallet = new ProtoWallet(sampleCertifierPrivateKey)
|
|
104
|
+
await certificate.sign(certifierWallet)
|
|
105
|
+
|
|
106
|
+
// Verify the signature
|
|
107
|
+
const isValid = await certificate.verify()
|
|
108
|
+
expect(isValid).toBe(true)
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
it('should fail verification if the Certificate is tampered with', async () => {
|
|
112
|
+
const certificate = new Certificate(
|
|
113
|
+
sampleType,
|
|
114
|
+
sampleSerialNumber,
|
|
115
|
+
sampleSubjectPubKey,
|
|
116
|
+
sampleCertifierPubKey,
|
|
117
|
+
sampleRevocationOutpoint,
|
|
118
|
+
sampleFields,
|
|
119
|
+
undefined // No signature
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
// Sign the certificate
|
|
123
|
+
const certifierWallet: ProtoWallet = new ProtoWallet(sampleCertifierPrivateKey)
|
|
124
|
+
await certificate.sign(certifierWallet)
|
|
125
|
+
|
|
126
|
+
// Tamper with the certificate (modify a field)
|
|
127
|
+
certificate.fields.email = 'attacker@example.com'
|
|
128
|
+
|
|
129
|
+
// Verify the signature
|
|
130
|
+
await expect(certificate.verify()).rejects.toThrow()
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
it('should fail verification if the signature is missing', async () => {
|
|
134
|
+
const certificate = new Certificate(
|
|
135
|
+
sampleType,
|
|
136
|
+
sampleSerialNumber,
|
|
137
|
+
sampleSubjectPubKey,
|
|
138
|
+
sampleCertifierPubKey,
|
|
139
|
+
sampleRevocationOutpoint,
|
|
140
|
+
sampleFields,
|
|
141
|
+
undefined // No signature
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
// Verify the signature
|
|
145
|
+
await expect(certificate.verify()).rejects.toThrow()
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
it('should fail verification if the signature is incorrect', async () => {
|
|
149
|
+
const certificate = new Certificate(
|
|
150
|
+
sampleType,
|
|
151
|
+
sampleSerialNumber,
|
|
152
|
+
sampleSubjectPubKey,
|
|
153
|
+
sampleCertifierPubKey,
|
|
154
|
+
sampleRevocationOutpoint,
|
|
155
|
+
sampleFields,
|
|
156
|
+
'3045022100cde229279465bb91992ccbc30bf6ed4eb8cdd9d517f31b30ff778d500d5400010220134f0e4065984f8668a642a5ad7a80886265f6aaa56d215d6400c216a4802177' // Incorrect signature
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
// Verify the signature
|
|
160
|
+
await expect(certificate.verify()).rejects.toThrowErrorMatchingInlineSnapshot(`"Signature is not valid"`)
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
it('should handle certificates with empty fields', async () => {
|
|
164
|
+
const certificate = new Certificate(
|
|
165
|
+
sampleType,
|
|
166
|
+
sampleSerialNumber,
|
|
167
|
+
sampleSubjectPubKey,
|
|
168
|
+
sampleCertifierPubKey,
|
|
169
|
+
sampleRevocationOutpoint,
|
|
170
|
+
sampleFieldsEmpty,
|
|
171
|
+
undefined // No signature
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
// Sign the certificate
|
|
175
|
+
const certifierWallet: ProtoWallet = new ProtoWallet(sampleCertifierPrivateKey)
|
|
176
|
+
await certificate.sign(certifierWallet)
|
|
177
|
+
|
|
178
|
+
// Serialize and deserialize
|
|
179
|
+
const serialized = certificate.toBin(true)
|
|
180
|
+
const deserializedCertificate = Certificate.fromBin(serialized)
|
|
181
|
+
|
|
182
|
+
expect(deserializedCertificate.fields).toEqual(sampleFieldsEmpty)
|
|
183
|
+
|
|
184
|
+
// Verify the signature
|
|
185
|
+
const isValid = await deserializedCertificate.verify()
|
|
186
|
+
expect(isValid).toBe(true)
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
it('should correctly handle serialization/deserialization when signature is excluded', () => {
|
|
190
|
+
const certificate = new Certificate(
|
|
191
|
+
sampleType,
|
|
192
|
+
sampleSerialNumber,
|
|
193
|
+
sampleSubjectPubKey,
|
|
194
|
+
sampleCertifierPubKey,
|
|
195
|
+
sampleRevocationOutpoint,
|
|
196
|
+
sampleFields,
|
|
197
|
+
'deadbeef1234', // Placeholder signature
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
// Serialize without signature
|
|
201
|
+
const serialized = certificate.toBin(false)
|
|
202
|
+
const deserializedCertificate = Certificate.fromBin(serialized)
|
|
203
|
+
|
|
204
|
+
expect(deserializedCertificate.signature).toBeUndefined() // Signature should be empty
|
|
205
|
+
expect(deserializedCertificate.fields).toEqual(sampleFields)
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
it('should correctly handle certificates with long field names and values', async () => {
|
|
209
|
+
const longFieldName = 'longFieldName_'.repeat(10) as any // Exceeding typical lengths
|
|
210
|
+
const longFieldValue = 'longFieldValue_'.repeat(20)
|
|
211
|
+
const fields = {
|
|
212
|
+
[longFieldName]: longFieldValue
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const certificate = new Certificate(
|
|
216
|
+
sampleType,
|
|
217
|
+
sampleSerialNumber,
|
|
218
|
+
sampleSubjectPubKey,
|
|
219
|
+
sampleCertifierPubKey,
|
|
220
|
+
sampleRevocationOutpoint,
|
|
221
|
+
fields,
|
|
222
|
+
undefined // No signature
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
// Sign the certificate
|
|
226
|
+
const certifierWallet: ProtoWallet = new ProtoWallet(sampleCertifierPrivateKey)
|
|
227
|
+
await certificate.sign(certifierWallet)
|
|
228
|
+
|
|
229
|
+
// Serialize and deserialize
|
|
230
|
+
const serialized = certificate.toBin(true)
|
|
231
|
+
const deserializedCertificate = Certificate.fromBin(serialized)
|
|
232
|
+
|
|
233
|
+
expect(deserializedCertificate.fields).toEqual(fields)
|
|
234
|
+
|
|
235
|
+
// Verify the signature
|
|
236
|
+
const isValid = await deserializedCertificate.verify()
|
|
237
|
+
expect(isValid).toBe(true)
|
|
238
|
+
})
|
|
239
|
+
|
|
240
|
+
it('should correctly serialize and deserialize the revocationOutpoint', () => {
|
|
241
|
+
const certificate = new Certificate(
|
|
242
|
+
sampleType,
|
|
243
|
+
sampleSerialNumber,
|
|
244
|
+
sampleSubjectPubKey,
|
|
245
|
+
sampleCertifierPubKey,
|
|
246
|
+
sampleRevocationOutpoint,
|
|
247
|
+
sampleFields,
|
|
248
|
+
undefined // No signature
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
const serialized = certificate.toBin(false)
|
|
252
|
+
const deserializedCertificate = Certificate.fromBin(serialized)
|
|
253
|
+
|
|
254
|
+
expect(deserializedCertificate.revocationOutpoint).toEqual(sampleRevocationOutpoint)
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
it('should correctly handle certificates with no fields', async () => {
|
|
258
|
+
const certificate = new Certificate(
|
|
259
|
+
sampleType,
|
|
260
|
+
sampleSerialNumber,
|
|
261
|
+
sampleSubjectPubKey,
|
|
262
|
+
sampleCertifierPubKey,
|
|
263
|
+
sampleRevocationOutpoint,
|
|
264
|
+
{}, // No fields
|
|
265
|
+
undefined // No signature
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
// Sign the certificate
|
|
269
|
+
const certifierWallet: ProtoWallet = new ProtoWallet(sampleCertifierPrivateKey)
|
|
270
|
+
await certificate.sign(certifierWallet)
|
|
271
|
+
|
|
272
|
+
// Serialize and deserialize
|
|
273
|
+
const serialized = certificate.toBin(true)
|
|
274
|
+
const deserializedCertificate = Certificate.fromBin(serialized)
|
|
275
|
+
|
|
276
|
+
expect(deserializedCertificate.fields).toEqual({})
|
|
277
|
+
|
|
278
|
+
// Verify the signature
|
|
279
|
+
const isValid = await deserializedCertificate.verify()
|
|
280
|
+
expect(isValid).toBe(true)
|
|
281
|
+
})
|
|
282
|
+
})
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Certificate } from './Certificate.js'
|