Skip to content

Commit b7a2c4b

Browse files
authored
Merge pull request #54 from auth0-lab/issuer_intermediate_certs
feat: support inclusion of intermediate certificates at issuance time
2 parents e3833bb + becd33d commit b7a2c4b

File tree

7 files changed

+35
-16
lines changed

7 files changed

+35
-16
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/node_modules
22
/.idea
33
/lib
4+
/tmp
45
/coverage
56
.DS_Store

package-lock.json

Lines changed: 7 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/mdoc/model/Document.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,24 +163,30 @@ export class Document {
163163
*
164164
* @param {Object} params - The parameters object
165165
* @param {jose.JWK | Uint8Array} params.issuerPrivateKey - The issuer's private key either in JWK format or COSE_KEY format as buffer.
166-
* @param {string | Uint8Array} params.issuerCertificate - The issuer's certificate in pem format or as a buffer.
166+
* @param {string | Uint8Array | Array<string | Uint8Array>} params.issuerCertificate - The issuer's certificate in pem format, as a buffer, or an array.
167167
* @param {SupportedAlgs} params.alg - The algorhitm used for the MSO signature.
168168
* @param {string | Uint8Array} [params.kid] - The key id of the issuer's private key. default: issuerPrivateKey.kid
169169
* @returns {Promise<IssuerSignedDoc>} - The signed document
170170
*/
171171
async sign(params: {
172172
issuerPrivateKey: jose.JWK | Uint8Array,
173-
issuerCertificate: string | Uint8Array,
173+
issuerCertificate: string | Uint8Array | Array<string | Uint8Array>,
174174
alg: SupportedAlgs,
175175
kid?: string | Uint8Array,
176176
}): Promise<IssuerSignedDocument> {
177177
if (!this.#issuerNameSpaces) {
178178
throw new Error('No namespaces added');
179179
}
180180

181-
const issuerPublicKeyBuffer = typeof params.issuerCertificate === 'string' ?
182-
fromPEM(params.issuerCertificate) :
183-
params.issuerCertificate;
181+
let issuerCertificateChain: Uint8Array[];
182+
183+
if (Array.isArray(params.issuerCertificate)) {
184+
issuerCertificateChain = params.issuerCertificate.flatMap((cert) => (typeof cert === 'string' ? fromPEM(cert) : [cert]));
185+
} else if (typeof params.issuerCertificate === 'string') {
186+
issuerCertificateChain = fromPEM(params.issuerCertificate);
187+
} else {
188+
issuerCertificateChain = [params.issuerCertificate];
189+
}
184190

185191
const issuerPrivateKeyJWK = params.issuerPrivateKey instanceof Uint8Array ?
186192
COSEKeyToJWK(params.issuerPrivateKey) :
@@ -210,7 +216,7 @@ export class Document {
210216
const protectedHeader: ProtectedHeaders = { alg: params.alg };
211217
const unprotectedHeader: UnprotectedHeaders = {
212218
kid: params.kid ?? issuerPrivateKeyJWK.kid,
213-
x5chain: [issuerPublicKeyBuffer],
219+
x5chain: issuerCertificateChain.length === 1 ? issuerCertificateChain[0] : issuerCertificateChain,
214220
};
215221

216222
const issuerAuth = await IssuerAuth.sign(

src/mdoc/utils.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,19 @@ export function getRandomBytes(len: number) {
120120
return webcrypto.getRandomValues(new Uint8Array(len));
121121
}
122122

123-
export function fromPEM(pem: string): Uint8Array {
124-
const base64 = pem.replace(/-{5}(BEGIN|END) .*-{5}/gm, '').replace(/\s/gm, '');
125-
return Buffer.from(base64, 'base64');
123+
export function fromPEM(pem: string): Uint8Array[] {
124+
const certs = pem
125+
.split(/-----END CERTIFICATE-----/)
126+
.map((block) => block.trim())
127+
.filter((block) => block.length > 0)
128+
.map((block) => {
129+
const fullBlock = `${block}\n-----END CERTIFICATE-----`;
130+
const base64 = fullBlock
131+
.replace(/-----BEGIN CERTIFICATE-----/, '')
132+
.replace(/-----END CERTIFICATE-----/, '')
133+
.replace(/\s+/g, '');
134+
return Buffer.from(base64, 'base64');
135+
});
136+
137+
return certs;
126138
}

tmp/device-response.mdl

-3.48 KB
Binary file not shown.

tmp/ephemeral-reader-key

Lines changed: 0 additions & 1 deletion
This file was deleted.

tmp/session-transcript

-582 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)