Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

rsa-bridge

Package Overview
Dependencies
Maintainers
1
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

rsa-bridge - npm Package Compare versions

Comparing version 1.1.0 to 1.1.5

4

dist/modules/server.d.ts
import Express, { Handler, Send } from "express";
import { BasicRSA, BasicRSAConfig } from "./basic";
type DefaultHandler = (req: any, res: any, ...unused: any) => any;
export interface ExtendedRequest extends Express.Request {

@@ -10,3 +9,3 @@ RSA: RSAServer;

/** Returns an http handler responsible for exposing the public key of the RSA service */
publish(): DefaultHandler;
publish(_: any, res: any): any;
gate(handler?: Handler): Handler;

@@ -17,2 +16,1 @@ injectedSend(send: Send, key: string | string[]): Send;

}
export {};

@@ -14,13 +14,11 @@ "use strict";

/** Returns an http handler responsible for exposing the public key of the RSA service */
publish() {
return (_, res) => {
if (typeof res.contentType === "function")
res.contentType("text");
if (typeof res.status === "function")
res.status(200);
return res.json({
key: this.publicKey("public"),
format: "public",
});
};
publish(_, res) {
if (typeof (res === null || res === void 0 ? void 0 : res.contentType) === "function")
res.contentType("text");
if (typeof (res === null || res === void 0 ? void 0 : res.status) === "function")
res.status(200);
return res === null || res === void 0 ? void 0 : res.json({
key: this.publicKey("public"),
format: "public",
});
}

@@ -27,0 +25,0 @@ gate(handler) {

@@ -31,3 +31,2 @@ "use strict";

const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
const node_test_1 = require("node:test");
const basic_1 = require("../modules/basic");

@@ -58,6 +57,6 @@ const server_1 = require("../modules/server");

-----END RSA PRIVATE KEY-----`;
(0, node_test_1.describe)("BasicRSA Validation", () => {
(0, node_test_1.describe)("Validation with random keys", () => {
describe("BasicRSA Validation", () => {
describe("Validation with random keys", () => {
const memory = {};
(0, node_test_1.it)("create with default config", () => {
it("create with default config", () => {
const rsa = new basic_1.BasicRSA();

@@ -71,3 +70,3 @@ (0, chai_1.expect)(rsa).not.to.be.equal(null).equal(undefined);

});
(0, node_test_1.it)("create instance with random keys", () => {
it("create instance with random keys", () => {
const rsa = new basic_1.BasicRSA({ bits: 1024 });

@@ -81,3 +80,3 @@ (0, chai_1.expect)(rsa).not.to.be.equal(null).equal(undefined);

});
(0, node_test_1.it)("encrypt using public key", () => {
it("encrypt using public key", () => {
const rsa = memory.rsa;

@@ -88,3 +87,3 @@ memory.text = "my cat is funny";

});
(0, node_test_1.it)("decrypt using private key", () => {
it("decrypt using private key", () => {
const rsa = memory.rsa;

@@ -96,3 +95,3 @@ const target = memory.text;

});
(0, node_test_1.it)("encrypt using public key on another", () => {
it("encrypt using public key on another", () => {
const rsa = memory.rsa;

@@ -104,5 +103,5 @@ const target = memory.text;

});
(0, node_test_1.describe)("Validation with custom keys", () => {
describe("Validation with custom keys", () => {
const memory = {};
(0, node_test_1.it)("create instance with random keys", () => {
it("create instance with random keys", () => {
const rsa = new basic_1.BasicRSA({

@@ -121,3 +120,3 @@ keys: {

});
(0, node_test_1.it)("encryp using public key", () => {
it("encryp using public key", () => {
const rsa = memory.rsa;

@@ -128,3 +127,3 @@ memory.text = "my cat is funny";

});
(0, node_test_1.it)("decrypt using private key", () => {
it("decrypt using private key", () => {
const rsa = memory.rsa;

@@ -136,3 +135,3 @@ const target = memory.text;

});
(0, node_test_1.it)("encrypt using public key on ", () => {
it("encrypt using public key on ", () => {
const rsa = memory.rsa;

@@ -144,4 +143,4 @@ const target = memory.text;

});
(0, node_test_1.describe)("Validation with invalid inputs", () => {
(0, node_test_1.it)("invalid constructor config", () => {
describe("Validation with invalid inputs", () => {
it("invalid constructor config", () => {
try {

@@ -156,3 +155,3 @@ // @ts-ignore

});
(0, node_test_1.it)("invalid constructor keys", () => {
it("invalid constructor keys", () => {
try {

@@ -172,3 +171,3 @@ // @ts-ignore

});
(0, node_test_1.it)("invalid encrypt input", () => {
it("invalid encrypt input", () => {
try {

@@ -183,3 +182,3 @@ // @ts-ignore

});
(0, node_test_1.it)("invalid decrypt input", () => {
it("invalid decrypt input", () => {
try {

@@ -194,3 +193,3 @@ // @ts-ignore

});
(0, node_test_1.it)("invalid decrypt input", () => {
it("invalid decrypt input", () => {
try {

@@ -205,3 +204,3 @@ // @ts-ignore

});
(0, node_test_1.it)("missing private/public key", () => {
it("missing private/public key", () => {
try {

@@ -232,3 +231,3 @@ new basic_1.BasicRSA({

});
(0, node_test_1.it)("missing private/public key format", () => {
it("missing private/public key format", () => {
try {

@@ -269,5 +268,5 @@ new basic_1.BasicRSA({

});
(0, node_test_1.describe)("Server Validation", () => {
describe("Server Validation", () => {
const memory = {};
(0, node_test_1.it)("create server instance", () => {
it("create server instance", () => {
const rsa = new server_1.RSAServer({

@@ -278,3 +277,3 @@ keys: { private: privateKey, public: publicKey },

});
(0, node_test_1.it)("testing public key handle", () => {
it("testing public key handle", () => {
const rsa = memory.rsa;

@@ -289,3 +288,3 @@ function send(data) {

}
rsa.publish()(null, {
rsa.publish(null, {
json,

@@ -292,0 +291,0 @@ send,

{
"name": "rsa-bridge",
"version": "1.1.0",
"version": "1.1.5",
"description": "Encrypted communication bridge between client and server using Node-RSA library",

@@ -36,2 +36,4 @@ "main": "./dist/index.js",

"@types/chai-as-promised": "^7.1.8",
"@types/express": "^4.17.21",
"@types/mocha": "^10.0.6",
"@types/node": "^20.11.30",

@@ -43,7 +45,8 @@ "@types/node-rsa": "^1.1.4",

"express": "^4.19.1",
"i": "^0.3.7",
"mocha": "^10.3.0",
"npm": "^10.5.0",
"shx": "^0.3.4",
"supertest": "^6.3.4",
"typescript": "^5.4.2",
"@types/express": "^4.17.21"
"typescript": "^5.4.2"
},

@@ -50,0 +53,0 @@ "dependencies": {

# RSA-BRIDGE
Encrypted communication bridge between client and server using [Node-RSA](https://www.npmjs.com/package/node-rsa) library.
###### Encrypted communication bridge between client and server using [Node-RSA](https://www.npmjs.com/package/node-rsa) library.
<ul>
<li>Encrypted Communication</li>
<li>Streamlined Client-Server Integration</li>
<li>Development simplification</li>
<li>Key Generation</li>
<li>Powered by a solid library</li>
</ul>
- Encrypted Communication
- Streamlined Client-Server Integration
- Development simplification
- Key Generation
- Powered by a solid library
The library uses Node-RSA to create a bridge between server-client with encrypted communication, enabling secure end-to-end communication.
![RSA Client Image](structure.png)
## Example
RSA Bridge Server Instance
```js
import { RSAServer } from "rsa-bridge";
const rsa = new RSAServer({ bits: 1024 });
app.use(
rsa.gate((req, res, next) => {
// your handler functions
})
);
```
RSA Bridge Client Instance
```js
import { RSAClient } from "rsa-bridge";
const rsa = new RSAClient({ bits: 1024 });
rsa.connect();
rsa.fetch(INPUT, OPTIONS);
```
### Installing
```sh
npm install rsa-bridge
```
#### Testing
```sh
npm test
```
---
## Usage
Its use is divided into an **client** instance (`RSAClient`) and an **server** instance (`RSAServer`).
The **server instance** must expose the public key (`publish`) and have the middleware (`gate`) to inject RSA into the handler.
The **client instance** must have the public key exposure endpoint (`connect`) to encrypt the data.
#### Instantiating
<a name="instantiating"></a>
To instantiate the service on the server it is necessary to specify `bits` or `keys` that will be used.
Below is an example of instantiating the model used both on the server and on the client
```javascript
import { BasicRSA } from "rsa-bridge";
const rsa = new BasicRSA(BasicRSAConfig);
```
- **random** - <span style="color: purple;">BasicRSAConfig</span> - you can generate random keys by entering the `bits`
```js
{
bits: number;
}
```
- **custom** - <span style="color: purple;">BasicRSAConfig</span> - you can specify your keys using the configuration below
```js
{
keys: {
private: string,
public: string,
...
}
}
```
### Client-side
#### Instantiating
The instance configuration is the same as found [here](#instantiating). Although it is possible, a `custom` key is <span style="color: red">not recommended</span> for clients.
```javascript
import { RSAClient } from "rsa-bridge";
const rsa = new RSAClient(BasicRSAConfig);
```
#### Connect
Obtains a connection to the server's RSA service, via the endpoint defined for public key exposure.
The `PATH` must point to the address defined [here](#expose).
```javascript
rsa.connect(PATH);
```
#### Fetch
Execute a request to the server using the encryption bridge.
```javascript
rsa.fetch(INPUT, OPTIONS).then(({ body, response }) => {
// decrypted data
});
```
### Server-side
#### Instantiating
The instance configuration is the same as found [here](#instantiating).
```javascript
import { RSAServer } from "rsa-bridge";
const rsa = new RSAServer(BasicRSAConfig);
```
#### Publish
<a name="expose"></a>
The public key must be exposed for the bridge to work. The method must be **`GET`**.
```javascript
app.get(PATH, rsa.publish);
```
- **path** - <span style="color: darkblue;">string</span> - the HTTP path
#### Gate
It can be used as a **middleware**, propagating the service to **all routes**
```javascript
app.use(rsa.gate);
app.post("example", HANDLER);
```
It can also be used on a , as in the **single path**
```javascript
app.post("/example", rsa.gate(HANDLER));
```
#### Getting Data
If the request passed the gate, the data sent in the body can be obtained
```javascript
app.use(rsa.gate);
app.post("/example", (req, res) => {
req.body; // decrypted data
});
```
#### Send
The `send` function will be wrapped by the `gate` to encrypt the data before sending it to the client.
Predecessors like `.json()` and `.status()` can be used as well.
```javascript
app.use(rsa.gate);
app.post("/example", (req, res) => {
res.status(200).send(DATA); // L0SQ23.....
});
```
The wrapped `res` will extend throughout the _request_ until the _response_, even with the use of `next()` for example.
```javascript
app.use(rsa.gate);
app.use((req, res, next) => {
next();
});
app.use((req, res) => {
res.status(200).json(DATA); // L0SQ23.....
});
```
### Basic RSA Functions
#### Encrypt
Returns encrypted data as `base64`
```javascript
const encrypted = rsa.encrypt(data);
```
#### Decrypt
returns decrypted data as `utf8`
```javascript
const decrypted = rsa.decrypt(data);
```
#### encryptWithKey
returns encrypted data as `base64` encrypted with a different key
```javascript
const encrypted = rsa.encryptWithKey(key, data, format?);
```
#### publicKey
exports the node's public key. The default encoding is "UTF8" but can be changed.
```javascript
const publicKey = rsa.publicKey(KeyFormat, OutputEncoding);
```
---
### ReactJS Example
An example implementation with reactJS is available in [examples](https://github.com/HugoRodriguesQW/rsa-bridge/tree/main/examples). There is a live version at [https://rsa-bridge.vercel.app](https://rsa-bridge.vercel.app)
<a href="https://pkg-size.dev/rsa-bridge"><img src="https://pkg-size.dev/badge/install/254646" title="Install size for rsa-bridge"></a> <a href="https://pkg-size.dev/rsa-bridge"><img src="https://pkg-size.dev/badge/bundle/68049" title="Bundle size for rsa-bridge"> </a>[![CI](https://github.com/HugoRodriguesQW/rsa-bridge/actions/workflows/testing.yml/badge.svg)](https://github.com/HugoRodriguesQW/rsa-bridge/actions/workflows/testing.yml) ![npms.io](https://img.shields.io/npms-io/quality-score/rsa-bridge) ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/hugorodriguesqw/rsa-bridge?label=activity)

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc