Skip to content

Commit

Permalink
Fix issue with netscape_comment causing random crashes
Browse files Browse the repository at this point in the history
this commit fixes node opcua issue 1289
  • Loading branch information
erossignon committed Aug 17, 2023
1 parent 0772645 commit 33b0737
Show file tree
Hide file tree
Showing 7 changed files with 702 additions and 13 deletions.
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
"cost-of-modules": "npx cost-of-modules --no-install",
"release-it": "npx release-it",
"prettier-format": "prettier --config .prettierrc.js source/**/*.ts test/**/*.ts --write",
"ncu": "npx npm-check-updates -u -x env-paths,chalk"
"ncu": "npx npm-check-updates -u -x env-paths,chalk",
"experiment": "tsc test/test_peculiar_edge_case.ts -t es2021 -m nodenext"
},
"keywords": [
"OPCUA",
Expand All @@ -56,7 +57,6 @@
"@typescript-eslint/eslint-plugin": "^6.4.0",
"@typescript-eslint/parser": "^6.4.0",
"cross-env": "^7.0.3",
"crypto": "^1.0.1",
"esbuild-plugin-polyfill-node": "^0.3.0",
"eslint": "^8.47.0",
"eslint-config-prettier": "^9.0.0",
Expand All @@ -76,6 +76,7 @@
"assert": "^2.0.0",
"better-assert": "^1.0.2",
"chalk": "^4.1.2",
"crypto": "^1.0.1",
"hexy": "0.3.5",
"jsrsasign": "^10.8.6",
"sshpk": "^1.17.0"
Expand Down
6 changes: 4 additions & 2 deletions source/x509/create_self_signed_certificate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ import { CertificatePurpose } from "../common.js";
import { getCrypto, x509 } from "./_crypto.js";
import { getAttributes } from "./_get_attributes.js";
import { buildPublicKey } from "./_build_public_key.js";

import { AsnConvert, AsnUtf8StringConverter } from "@peculiar/asn1-schema";

export interface CreateSelfSignCertificateOptions {
privateKey: CryptoKey;
notBefore?: Date;
Expand Down Expand Up @@ -75,6 +76,7 @@ export async function createSelfSignedCertificate({
// https://opensource.apple.com/source/OpenSSH/OpenSSH-186/osslshim/heimdal-asn1/rfc2459.asn1.auto.html
const ID_NETSCAPE_COMMENT = "2.16.840.1.113730.1.13";


const s = new Subject(subject || "");
const s1 = s.toStringInternal(", ");
const name = s1;
Expand All @@ -91,7 +93,7 @@ export async function createSelfSignedCertificate({
keys,

extensions: [
new x509.Extension(ID_NETSCAPE_COMMENT, false, Buffer.from(nsComment, "ascii")),
new x509.Extension(ID_NETSCAPE_COMMENT, false, AsnConvert.serialize(AsnUtf8StringConverter(nsComment))),

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (18.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (18.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (18.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (16.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (16.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (16.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (19.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (19.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (19.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (19.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (19.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (19.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (20.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (20.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (20.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (18.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (18.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (18.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-legacy (14.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-legacy (14.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-legacy (14.x, ubuntu-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-legacy (14.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-legacy (14.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-legacy (14.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (16.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (16.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (16.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build (16.x, macos-latest)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (20.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (20.x, ubuntu-20.04)

This expression is not callable.

Check failure on line 96 in source/x509/create_self_signed_certificate.ts

View workflow job for this annotation

GitHub Actions / build-new (20.x, ubuntu-20.04)

This expression is not callable.
// new x509.BasicConstraintsExtension(true, 2, true),
basicConstraints,
new x509.ExtendedKeyUsageExtension(keyUsageExtension, true),
Expand Down
15 changes: 15 additions & 0 deletions source_nodejs/generate_private_key_filename.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,18 @@ export async function generatePrivateKeyFile(privateKeyFilename: string, modulus
privateKeyPem.privPem = "";
privateKeyPem.privDer = new Uint8Array(0);
}

/**
* alternate function to generate PrivateKeyFile, using jsrsasign.
*
* This function is slower than generatePrivateKeyFile
*/
export async function generatePrivateKeyFileAlternate(privateKeyFilename: string, modulusLength: 2048 | 3072 | 4096) {
const rs = require("jsrsasign");
const kp = rs.KEYUTIL.generateKeypair("RSA", modulusLength);
const prv = kp.prvKeyObj;
const pub = kp.pubKeyObj;
const prvpem = rs.KEYUTIL.getPEM(prv, "PKCS8PRV");
const pubpem = rs.KEYUTIL.getPEM(pub, "PKCS8PUB");
await fs.promises.writeFile(privateKeyFilename, prvpem, "utf-8");
}
110 changes: 110 additions & 0 deletions test-fixtures/peculiar_cert_in_base64.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
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
kRA=
Loading

0 comments on commit 33b0737

Please sign in to comment.