|
| 1 | +import * as nativeCrypto from 'crypto'; |
| 2 | +import * as fs from 'fs'; |
| 3 | +import {assert} from 'chai'; |
| 4 | +import {createCrypto} from '../src/crypto/crypto'; |
| 5 | +import {NodeCrypto} from '../src/crypto/node/crypto'; |
| 6 | + |
| 7 | +const publicKey = fs.readFileSync('./test/fixtures/public.pem', 'utf-8'); |
| 8 | +const privateKey = fs.readFileSync('./test/fixtures/private.pem', 'utf-8'); |
| 9 | + |
| 10 | +describe('Node.js crypto tests', () => { |
| 11 | + const crypto = createCrypto(); |
| 12 | + |
| 13 | + it('should create a NodeCrypto instance', () => { |
| 14 | + assert(crypto instanceof NodeCrypto); |
| 15 | + }); |
| 16 | + |
| 17 | + it('should calculate SHA256 digest', async () => { |
| 18 | + const input = 'I can calculate SHA256'; |
| 19 | + const expectedDigest = 'c9CEhti/1PtLwS3YkDYE3b3lrZW276VnvXI86BqIESI='; |
| 20 | + const calculatedDigest = await crypto.sha256DigestBase64(input); |
| 21 | + assert.strictEqual(calculatedDigest, expectedDigest); |
| 22 | + }); |
| 23 | + |
| 24 | + it('should generate random bytes', () => { |
| 25 | + const requestedLength = 20; |
| 26 | + const generated1Base64 = crypto.randomBytesBase64(requestedLength); |
| 27 | + const generated1 = Buffer.from(generated1Base64, 'base64'); |
| 28 | + assert.strictEqual(generated1.length, requestedLength); |
| 29 | + const generated2Base64 = crypto.randomBytesBase64(requestedLength); |
| 30 | + const generated2 = Buffer.from(generated2Base64, 'base64'); |
| 31 | + assert.strictEqual(generated2.length, requestedLength); |
| 32 | + // random strings are random! let's just check they are different. |
| 33 | + // if they are the same, we have a problem. |
| 34 | + assert.notStrictEqual(generated1Base64, generated2Base64); |
| 35 | + }); |
| 36 | + |
| 37 | + it('should verify a signature', async () => { |
| 38 | + const message = 'This message is signed'; |
| 39 | + const signatureBase64 = [ |
| 40 | + 'ufyKBV+Ar7Yq8CSmSIN9m38ch4xnWBz8CP4qHh6V+', |
| 41 | + 'm4cCbeXdR1MEmWVhNJjZQFv3KL3tDAnl0Q4bTcSR/', |
| 42 | + 'mmhXaRjdxyJ6xAUp0KcbVq6xsDIbnnYHSgYr3zVoS', |
| 43 | + 'dRRefWSWTknN1S69fNmKEfUeBIJA93xitr3pbqtLC', |
| 44 | + 'bP28XNU', |
| 45 | + ].join(''); // note: no padding |
| 46 | + const verified = await crypto.verify(publicKey, message, signatureBase64); |
| 47 | + assert(verified); |
| 48 | + }); |
| 49 | + |
| 50 | + it('should create a signer that works', () => { |
| 51 | + const message = 'This message is signed'; |
| 52 | + const expectedSignatureBase64 = [ |
| 53 | + 'ufyKBV+Ar7Yq8CSmSIN9m38ch4xnWBz8CP4qHh6V+', |
| 54 | + 'm4cCbeXdR1MEmWVhNJjZQFv3KL3tDAnl0Q4bTcSR/', |
| 55 | + 'mmhXaRjdxyJ6xAUp0KcbVq6xsDIbnnYHSgYr3zVoS', |
| 56 | + 'dRRefWSWTknN1S69fNmKEfUeBIJA93xitr3pbqtLC', |
| 57 | + 'bP28XNU=', |
| 58 | + ].join(''); |
| 59 | + |
| 60 | + const signer = crypto.createSign('SHA256'); |
| 61 | + assert(signer); |
| 62 | + signer.update(message); |
| 63 | + const signatureBase64 = signer.sign(privateKey, 'base64'); |
| 64 | + assert.strictEqual(signatureBase64, expectedSignatureBase64); |
| 65 | + }); |
| 66 | + |
| 67 | + it('should decode unpadded base64', () => { |
| 68 | + const originalString = 'test string'; |
| 69 | + const base64String = 'dGVzdCBzdHJpbmc'; |
| 70 | + const decodedString = crypto.decodeBase64StringUtf8(base64String); |
| 71 | + assert.strictEqual(decodedString, originalString); |
| 72 | + }); |
| 73 | + |
| 74 | + it('should encode to base64 and pad the result', () => { |
| 75 | + const originalString = 'test string'; |
| 76 | + const base64String = 'dGVzdCBzdHJpbmc='; |
| 77 | + const encodedString = crypto.encodeBase64StringUtf8(originalString); |
| 78 | + assert.strictEqual(encodedString, base64String); |
| 79 | + }); |
| 80 | +}); |
0 commit comments