文件
mynode/packages/lib/services/e2ee/ppk/RSA.node.ts
chen 301194963b
一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
feat: Initial clean release of CHM
2026-11-04 11:29:39 +08:00

72 行
2.5 KiB
TypeScript

import { PublicKeyAlgorithm, PublicKeyCrypto, PublicKeyCryptoProvider } from '../types';
import NodeRSA from 'node-rsa';
import { webcrypto } from 'crypto';
import buildRsaCryptoProvider from './webCrypto/buildRsaCryptoProvider';
const legacyRSAOptions: NodeRSA.Options = {
// Must use pkcs1 otherwise any data encrypted with NodeRSA will crash the
// app when decrypted by RN-RSA.
// https://github.com/amitaymolko/react-native-rsa-native/issues/66#issuecomment-932768139
encryptionScheme: 'pkcs1',
// Allows NodeRSA to work with pkcs1-v1.5 in newer NodeJS versions:
environment: 'browser',
};
const legacyRsa: PublicKeyCrypto<NodeRSA> = {
generateKeyPair: async () => {
const keys = new NodeRSA();
keys.setOptions(legacyRSAOptions);
const keySize = 2048;
keys.generateKeyPair(keySize, 65537);
// Sanity check
if (!keys.isPrivate()) throw new Error('No private key was generated');
if (!keys.isPublic()) throw new Error('No public key was generated');
return { keyPair: keys, keySize };
},
loadKeys: async (publicKey: string, privateKey: string) => {
const keys = new NodeRSA();
keys.setOptions(legacyRSAOptions);
// Don't specify the import format, and let it auto-detect because
// react-native-rsa might not create a key in the expected format.
keys.importKey(publicKey);
if (privateKey) keys.importKey(privateKey);
return keys;
},
// Unlimited, but probably not a good idea to encrypt a large amount of data (>=1 KiB).
// Breaking input into blocks is handled by NodeRSA, but seems to use ECB mode.
maximumPlaintextLengthBytes: null,
encrypt: async (plaintextUtf8: string, rsaKeyPair: NodeRSA) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Workaround for incorrect types after improving type safety
return rsaKeyPair.encrypt(plaintextUtf8 as any, 'buffer', 'utf8') as Buffer<ArrayBuffer>;
},
decrypt: async (ciphertext: Buffer, rsaKeyPair: NodeRSA) => {
return rsaKeyPair.decrypt(ciphertext, 'utf8');
},
publicKey: async (rsaKeyPair: NodeRSA) => {
return rsaKeyPair.exportKey('pkcs1-public-pem');
},
privateKey: async (rsaKeyPair: NodeRSA) => {
return rsaKeyPair.exportKey('pkcs1-private-pem');
},
};
const rsa: PublicKeyCryptoProvider = {
[PublicKeyAlgorithm.Unknown]: null,
[PublicKeyAlgorithm.RsaV1]: legacyRsa,
[PublicKeyAlgorithm.RsaV2]: buildRsaCryptoProvider(PublicKeyAlgorithm.RsaV2, webcrypto),
[PublicKeyAlgorithm.RsaV3]: buildRsaCryptoProvider(PublicKeyAlgorithm.RsaV3, webcrypto),
};
export default rsa;