@phantom/crypto 0.1.0 → 0.1.2

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/README.md ADDED
@@ -0,0 +1,114 @@
1
+ # @phantom/crypto
2
+
3
+ Cryptographic utilities for Phantom SDK, providing Ed25519 key generation, key pair management, and digital signing functionality.
4
+
5
+ ## Features
6
+
7
+ - **Ed25519 Key Pair Generation**: Generate cryptographically secure key pairs
8
+ - **Key Pair Recovery**: Recreate key pairs from existing secret keys
9
+ - **Digital Signing**: Sign data using Ed25519 with detached signatures
10
+ - **Base58 Encoding**: All keys are encoded in base58 format for compatibility
11
+ - **Cross-platform**: Works in both Node.js and browser environments
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install @phantom/crypto
17
+ # or
18
+ yarn add @phantom/crypto
19
+ ```
20
+
21
+ ## Usage
22
+
23
+ ### Generate a New Key Pair
24
+
25
+ ```typescript
26
+ import { generateKeyPair } from "@phantom/crypto";
27
+
28
+ const keyPair = generateKeyPair();
29
+ console.log("Public Key:", keyPair.publicKey);
30
+ console.log("Secret Key:", keyPair.secretKey);
31
+ ```
32
+
33
+ ### Create Key Pair from Existing Secret Key
34
+
35
+ ```typescript
36
+ import { createKeyPairFromSecret } from "@phantom/crypto";
37
+
38
+ const existingSecretKey = "your-base58-encoded-secret-key";
39
+ const keyPair = createKeyPairFromSecret(existingSecretKey);
40
+ console.log("Recovered Public Key:", keyPair.publicKey);
41
+ ```
42
+
43
+ ### Sign Data
44
+
45
+ ```typescript
46
+ import { signWithSecret } from "@phantom/crypto";
47
+
48
+ const secretKey = "your-base58-encoded-secret-key";
49
+ const message = "Hello, world!";
50
+
51
+ const signature = signWithSecret(secretKey, message);
52
+ console.log("Signature:", signature);
53
+ ```
54
+
55
+ ## API Reference
56
+
57
+ ### Types
58
+
59
+ #### `Keypair`
60
+
61
+ ```typescript
62
+ interface Keypair {
63
+ publicKey: string; // Base58-encoded public key
64
+ secretKey: string; // Base58-encoded secret key
65
+ }
66
+ ```
67
+
68
+ ### Functions
69
+
70
+ #### `generateKeyPair(): Keypair`
71
+
72
+ Generates a new Ed25519 key pair with cryptographically secure random keys.
73
+
74
+ **Returns:** A `Keypair` object with base58-encoded public and secret keys.
75
+
76
+ #### `createKeyPairFromSecret(b58PrivateKey: string): Keypair`
77
+
78
+ Reconstructs a key pair from an existing base58-encoded secret key.
79
+
80
+ **Parameters:**
81
+
82
+ - `b58PrivateKey`: Base58-encoded private key string
83
+
84
+ **Returns:** A `Keypair` object with the corresponding public key derived from the secret key.
85
+
86
+ #### `signWithSecret(secretKey: string | Uint8Array, data: string | Uint8Array | Buffer): Uint8Array`
87
+
88
+ Signs data using Ed25519 with a secret key, producing a detached signature.
89
+
90
+ **Parameters:**
91
+
92
+ - `secretKey`: Base58-encoded secret key string or raw Uint8Array
93
+ - `data`: Data to sign (accepts string, Uint8Array, or Buffer)
94
+
95
+ **Returns:** Raw signature as Uint8Array
96
+
97
+ ## Security Notes
98
+
99
+ - Always keep secret keys secure and never expose them in client-side code
100
+ - Use cryptographically secure random number generation (provided by TweetNaCl)
101
+ - Ed25519 provides strong security with 128-bit security level
102
+ - Signatures are deterministic but secure against forgery
103
+
104
+ ## Dependencies
105
+
106
+ This package uses:
107
+
108
+ - **TweetNaCl**: Cryptographic library for Ed25519 operations
109
+ - **bs58**: Base58 encoding/decoding
110
+ - **buffer**: Buffer polyfill for cross-platform compatibility
111
+
112
+ ## License
113
+
114
+ MIT
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { Buffer } from 'buffer';
2
+
1
3
  interface Keypair {
2
4
  publicKey: string;
3
5
  secretKey: string;
package/dist/index.js CHANGED
@@ -37,6 +37,7 @@ __export(src_exports, {
37
37
  module.exports = __toCommonJS(src_exports);
38
38
  var import_tweetnacl = __toESM(require("tweetnacl"));
39
39
  var import_bs58 = __toESM(require("bs58"));
40
+ var import_buffer = require("buffer");
40
41
  function generateKeyPair() {
41
42
  const keypair = import_tweetnacl.default.sign.keyPair();
42
43
  return {
@@ -57,7 +58,7 @@ function signWithSecret(secretKey, data) {
57
58
  let dataBytes;
58
59
  if (typeof data === "string") {
59
60
  dataBytes = new TextEncoder().encode(data);
60
- } else if (data instanceof Buffer) {
61
+ } else if (data instanceof import_buffer.Buffer) {
61
62
  dataBytes = new Uint8Array(data);
62
63
  } else {
63
64
  dataBytes = data;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import nacl from \"tweetnacl\";\nimport bs58 from \"bs58\";\n\nexport interface Keypair {\n publicKey: string;\n secretKey: string;\n}\n\n/**\n * Generate a new Ed25519 keypair\n * @returns A keypair with base58-encoded public and secret keys\n */\nexport function generateKeyPair(): Keypair {\n const keypair = nacl.sign.keyPair();\n return {\n publicKey: bs58.encode(keypair.publicKey),\n secretKey: bs58.encode(keypair.secretKey),\n };\n}\n\n/**\n * Create a keypair from a base58-encoded private key\n * @param b58PrivateKey - Base58-encoded private key\n * @returns A keypair with base58-encoded public and secret keys\n */\nexport function createKeyPairFromSecret(b58PrivateKey: string): Keypair {\n const secretKeyBytes = bs58.decode(b58PrivateKey);\n const keypair = nacl.sign.keyPair.fromSecretKey(secretKeyBytes);\n return {\n publicKey: bs58.encode(keypair.publicKey),\n secretKey: bs58.encode(keypair.secretKey),\n };\n}\n\n/**\n * Sign data using Ed25519 with a secret key\n * @param secretKey - Base58-encoded secret key or raw Uint8Array\n * @param data - Data to sign (string, Uint8Array, or Buffer)\n * @returns Base64-encoded signature\n */\nexport function signWithSecret(secretKey: string | Uint8Array, data: string | Uint8Array | Buffer): Uint8Array {\n // Decode secret key if it's a string\n const secretKeyBytes = typeof secretKey === \"string\" ? bs58.decode(secretKey) : secretKey;\n\n // Convert data to Uint8Array if needed\n let dataBytes: Uint8Array;\n if (typeof data === \"string\") {\n dataBytes = new TextEncoder().encode(data);\n } else if (data instanceof Buffer) {\n dataBytes = new Uint8Array(data);\n } else {\n dataBytes = data;\n }\n\n // Sign the data\n return nacl.sign.detached(dataBytes, secretKeyBytes);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAiB;AACjB,kBAAiB;AAWV,SAAS,kBAA2B;AACzC,QAAM,UAAU,iBAAAA,QAAK,KAAK,QAAQ;AAClC,SAAO;AAAA,IACL,WAAW,YAAAC,QAAK,OAAO,QAAQ,SAAS;AAAA,IACxC,WAAW,YAAAA,QAAK,OAAO,QAAQ,SAAS;AAAA,EAC1C;AACF;AAOO,SAAS,wBAAwB,eAAgC;AACtE,QAAM,iBAAiB,YAAAA,QAAK,OAAO,aAAa;AAChD,QAAM,UAAU,iBAAAD,QAAK,KAAK,QAAQ,cAAc,cAAc;AAC9D,SAAO;AAAA,IACL,WAAW,YAAAC,QAAK,OAAO,QAAQ,SAAS;AAAA,IACxC,WAAW,YAAAA,QAAK,OAAO,QAAQ,SAAS;AAAA,EAC1C;AACF;AAQO,SAAS,eAAe,WAAgC,MAAgD;AAE7G,QAAM,iBAAiB,OAAO,cAAc,WAAW,YAAAA,QAAK,OAAO,SAAS,IAAI;AAGhF,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC5B,gBAAY,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,EAC3C,WAAW,gBAAgB,QAAQ;AACjC,gBAAY,IAAI,WAAW,IAAI;AAAA,EACjC,OAAO;AACL,gBAAY;AAAA,EACd;AAGA,SAAO,iBAAAD,QAAK,KAAK,SAAS,WAAW,cAAc;AACrD;","names":["nacl","bs58"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import nacl from \"tweetnacl\";\nimport bs58 from \"bs58\";\nimport { Buffer } from \"buffer\";\n\nexport interface Keypair {\n publicKey: string;\n secretKey: string;\n}\n\n/**\n * Generate a new Ed25519 keypair\n * @returns A keypair with base58-encoded public and secret keys\n */\nexport function generateKeyPair(): Keypair {\n const keypair = nacl.sign.keyPair();\n return {\n publicKey: bs58.encode(keypair.publicKey),\n secretKey: bs58.encode(keypair.secretKey),\n };\n}\n\n/**\n * Create a keypair from a base58-encoded private key\n * @param b58PrivateKey - Base58-encoded private key\n * @returns A keypair with base58-encoded public and secret keys\n */\nexport function createKeyPairFromSecret(b58PrivateKey: string): Keypair {\n const secretKeyBytes = bs58.decode(b58PrivateKey);\n const keypair = nacl.sign.keyPair.fromSecretKey(secretKeyBytes);\n return {\n publicKey: bs58.encode(keypair.publicKey),\n secretKey: bs58.encode(keypair.secretKey),\n };\n}\n\n/**\n * Sign data using Ed25519 with a secret key\n * @param secretKey - Base58-encoded secret key or raw Uint8Array\n * @param data - Data to sign (string, Uint8Array, or Buffer)\n * @returns Base64-encoded signature\n */\nexport function signWithSecret(secretKey: string | Uint8Array, data: string | Uint8Array | Buffer): Uint8Array {\n // Decode secret key if it's a string\n const secretKeyBytes = typeof secretKey === \"string\" ? bs58.decode(secretKey) : secretKey;\n\n // Convert data to Uint8Array if needed\n let dataBytes: Uint8Array;\n if (typeof data === \"string\") {\n dataBytes = new TextEncoder().encode(data);\n } else if (data instanceof Buffer) {\n dataBytes = new Uint8Array(data);\n } else {\n dataBytes = data;\n }\n\n // Sign the data\n return nacl.sign.detached(dataBytes, secretKeyBytes);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAiB;AACjB,kBAAiB;AACjB,oBAAuB;AAWhB,SAAS,kBAA2B;AACzC,QAAM,UAAU,iBAAAA,QAAK,KAAK,QAAQ;AAClC,SAAO;AAAA,IACL,WAAW,YAAAC,QAAK,OAAO,QAAQ,SAAS;AAAA,IACxC,WAAW,YAAAA,QAAK,OAAO,QAAQ,SAAS;AAAA,EAC1C;AACF;AAOO,SAAS,wBAAwB,eAAgC;AACtE,QAAM,iBAAiB,YAAAA,QAAK,OAAO,aAAa;AAChD,QAAM,UAAU,iBAAAD,QAAK,KAAK,QAAQ,cAAc,cAAc;AAC9D,SAAO;AAAA,IACL,WAAW,YAAAC,QAAK,OAAO,QAAQ,SAAS;AAAA,IACxC,WAAW,YAAAA,QAAK,OAAO,QAAQ,SAAS;AAAA,EAC1C;AACF;AAQO,SAAS,eAAe,WAAgC,MAAgD;AAE7G,QAAM,iBAAiB,OAAO,cAAc,WAAW,YAAAA,QAAK,OAAO,SAAS,IAAI;AAGhF,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC5B,gBAAY,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,EAC3C,WAAW,gBAAgB,sBAAQ;AACjC,gBAAY,IAAI,WAAW,IAAI;AAAA,EACjC,OAAO;AACL,gBAAY;AAAA,EACd;AAGA,SAAO,iBAAAD,QAAK,KAAK,SAAS,WAAW,cAAc;AACrD;","names":["nacl","bs58"]}
package/dist/index.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  // src/index.ts
2
2
  import nacl from "tweetnacl";
3
3
  import bs58 from "bs58";
4
+ import { Buffer } from "buffer";
4
5
  function generateKeyPair() {
5
6
  const keypair = nacl.sign.keyPair();
6
7
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import nacl from \"tweetnacl\";\nimport bs58 from \"bs58\";\n\nexport interface Keypair {\n publicKey: string;\n secretKey: string;\n}\n\n/**\n * Generate a new Ed25519 keypair\n * @returns A keypair with base58-encoded public and secret keys\n */\nexport function generateKeyPair(): Keypair {\n const keypair = nacl.sign.keyPair();\n return {\n publicKey: bs58.encode(keypair.publicKey),\n secretKey: bs58.encode(keypair.secretKey),\n };\n}\n\n/**\n * Create a keypair from a base58-encoded private key\n * @param b58PrivateKey - Base58-encoded private key\n * @returns A keypair with base58-encoded public and secret keys\n */\nexport function createKeyPairFromSecret(b58PrivateKey: string): Keypair {\n const secretKeyBytes = bs58.decode(b58PrivateKey);\n const keypair = nacl.sign.keyPair.fromSecretKey(secretKeyBytes);\n return {\n publicKey: bs58.encode(keypair.publicKey),\n secretKey: bs58.encode(keypair.secretKey),\n };\n}\n\n/**\n * Sign data using Ed25519 with a secret key\n * @param secretKey - Base58-encoded secret key or raw Uint8Array\n * @param data - Data to sign (string, Uint8Array, or Buffer)\n * @returns Base64-encoded signature\n */\nexport function signWithSecret(secretKey: string | Uint8Array, data: string | Uint8Array | Buffer): Uint8Array {\n // Decode secret key if it's a string\n const secretKeyBytes = typeof secretKey === \"string\" ? bs58.decode(secretKey) : secretKey;\n\n // Convert data to Uint8Array if needed\n let dataBytes: Uint8Array;\n if (typeof data === \"string\") {\n dataBytes = new TextEncoder().encode(data);\n } else if (data instanceof Buffer) {\n dataBytes = new Uint8Array(data);\n } else {\n dataBytes = data;\n }\n\n // Sign the data\n return nacl.sign.detached(dataBytes, secretKeyBytes);\n}\n"],"mappings":";AAAA,OAAO,UAAU;AACjB,OAAO,UAAU;AAWV,SAAS,kBAA2B;AACzC,QAAM,UAAU,KAAK,KAAK,QAAQ;AAClC,SAAO;AAAA,IACL,WAAW,KAAK,OAAO,QAAQ,SAAS;AAAA,IACxC,WAAW,KAAK,OAAO,QAAQ,SAAS;AAAA,EAC1C;AACF;AAOO,SAAS,wBAAwB,eAAgC;AACtE,QAAM,iBAAiB,KAAK,OAAO,aAAa;AAChD,QAAM,UAAU,KAAK,KAAK,QAAQ,cAAc,cAAc;AAC9D,SAAO;AAAA,IACL,WAAW,KAAK,OAAO,QAAQ,SAAS;AAAA,IACxC,WAAW,KAAK,OAAO,QAAQ,SAAS;AAAA,EAC1C;AACF;AAQO,SAAS,eAAe,WAAgC,MAAgD;AAE7G,QAAM,iBAAiB,OAAO,cAAc,WAAW,KAAK,OAAO,SAAS,IAAI;AAGhF,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC5B,gBAAY,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,EAC3C,WAAW,gBAAgB,QAAQ;AACjC,gBAAY,IAAI,WAAW,IAAI;AAAA,EACjC,OAAO;AACL,gBAAY;AAAA,EACd;AAGA,SAAO,KAAK,KAAK,SAAS,WAAW,cAAc;AACrD;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import nacl from \"tweetnacl\";\nimport bs58 from \"bs58\";\nimport { Buffer } from \"buffer\";\n\nexport interface Keypair {\n publicKey: string;\n secretKey: string;\n}\n\n/**\n * Generate a new Ed25519 keypair\n * @returns A keypair with base58-encoded public and secret keys\n */\nexport function generateKeyPair(): Keypair {\n const keypair = nacl.sign.keyPair();\n return {\n publicKey: bs58.encode(keypair.publicKey),\n secretKey: bs58.encode(keypair.secretKey),\n };\n}\n\n/**\n * Create a keypair from a base58-encoded private key\n * @param b58PrivateKey - Base58-encoded private key\n * @returns A keypair with base58-encoded public and secret keys\n */\nexport function createKeyPairFromSecret(b58PrivateKey: string): Keypair {\n const secretKeyBytes = bs58.decode(b58PrivateKey);\n const keypair = nacl.sign.keyPair.fromSecretKey(secretKeyBytes);\n return {\n publicKey: bs58.encode(keypair.publicKey),\n secretKey: bs58.encode(keypair.secretKey),\n };\n}\n\n/**\n * Sign data using Ed25519 with a secret key\n * @param secretKey - Base58-encoded secret key or raw Uint8Array\n * @param data - Data to sign (string, Uint8Array, or Buffer)\n * @returns Base64-encoded signature\n */\nexport function signWithSecret(secretKey: string | Uint8Array, data: string | Uint8Array | Buffer): Uint8Array {\n // Decode secret key if it's a string\n const secretKeyBytes = typeof secretKey === \"string\" ? bs58.decode(secretKey) : secretKey;\n\n // Convert data to Uint8Array if needed\n let dataBytes: Uint8Array;\n if (typeof data === \"string\") {\n dataBytes = new TextEncoder().encode(data);\n } else if (data instanceof Buffer) {\n dataBytes = new Uint8Array(data);\n } else {\n dataBytes = data;\n }\n\n // Sign the data\n return nacl.sign.detached(dataBytes, secretKeyBytes);\n}\n"],"mappings":";AAAA,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,SAAS,cAAc;AAWhB,SAAS,kBAA2B;AACzC,QAAM,UAAU,KAAK,KAAK,QAAQ;AAClC,SAAO;AAAA,IACL,WAAW,KAAK,OAAO,QAAQ,SAAS;AAAA,IACxC,WAAW,KAAK,OAAO,QAAQ,SAAS;AAAA,EAC1C;AACF;AAOO,SAAS,wBAAwB,eAAgC;AACtE,QAAM,iBAAiB,KAAK,OAAO,aAAa;AAChD,QAAM,UAAU,KAAK,KAAK,QAAQ,cAAc,cAAc;AAC9D,SAAO;AAAA,IACL,WAAW,KAAK,OAAO,QAAQ,SAAS;AAAA,IACxC,WAAW,KAAK,OAAO,QAAQ,SAAS;AAAA,EAC1C;AACF;AAQO,SAAS,eAAe,WAAgC,MAAgD;AAE7G,QAAM,iBAAiB,OAAO,cAAc,WAAW,KAAK,OAAO,SAAS,IAAI;AAGhF,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC5B,gBAAY,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,EAC3C,WAAW,gBAAgB,QAAQ;AACjC,gBAAY,IAAI,WAAW,IAAI;AAAA,EACjC,OAAO;AACL,gBAAY;AAAA,EACd;AAGA,SAAO,KAAK,KAAK,SAAS,WAAW,cAAc;AACrD;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phantom/crypto",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Cryptographic utilities for Phantom SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -24,10 +24,12 @@
24
24
  "test": "jest",
25
25
  "test:watch": "jest --watch",
26
26
  "lint": "tsc --noEmit && eslint --cache . --ext .ts",
27
+ "check-types": "tsc --noEmit",
27
28
  "prettier": "prettier --write \"src/**/*.{ts}\""
28
29
  },
29
30
  "dependencies": {
30
31
  "bs58": "^5.0.0",
32
+ "buffer": "^6.0.3",
31
33
  "tweetnacl": "^1.0.3"
32
34
  },
33
35
  "devDependencies": {