in src/governance/ccf-app/js/src/endpoints/ca/cakey.ts [32:128]
export function generateEndorsedCert(
request: ccfapp.Request<GenerateEndorsedCertRequest>
): ccfapp.Response | ErrorResponse {
const contractId = request.params.contractId;
const body = request.body.json();
if (!body.attestation) {
return {
statusCode: 400,
body: new ErrorResponse(
"AttestationMissing",
"Attestation payload must be supplied."
)
};
}
if (!body.encrypt) {
return {
statusCode: 400,
body: new ErrorResponse(
"EncryptionMissing",
"Encrypt payload must be supplied."
)
};
}
// First validate attestation report.
let snpAttestationResult: SnpAttestationResult;
try {
snpAttestationResult = verifySnpAttestation(contractId, body.attestation);
} catch (e) {
return {
statusCode: 400,
body: new ErrorResponse("VerifySnpAttestationFailed", e.message)
};
}
// Then validate the report data value.
try {
verifyReportData(snpAttestationResult, body.encrypt.publicKey);
} catch (e) {
return {
statusCode: 400,
body: new ErrorResponse("ReportDataMismatch", e.message)
};
}
// Attestation report and report data values are verified. Now check the signature.
const data: ArrayBuffer = b64ToBuf(body.data);
try {
verifySignature(body.sign, data);
} catch (e) {
return {
statusCode: 400,
body: new ErrorResponse("SignatureMismatch", e.message)
};
}
// All verifications pass. Genereate the endorsed certificate.
const item = getCASigningKey(contractId);
if (item === null) {
return {
statusCode: 404,
body: new ErrorResponse(
"NoCASigningKey",
"Cannot generate endorsed certificate as there is no CA signing key for this contract."
)
};
}
const requestData: GenerateEndorsedCertRequestData = JSON.parse(
ccf.bufToStr(data)
);
const endorsed_cert = cleanroom.crypto.generateEndorsedCert(
requestData.publicKey,
requestData.subjectName,
requestData.subjectAlternateNames,
requestData.validityPeriodDays,
item.privateKey,
item.caCert,
false
);
// Wrap the response before returning it.
const serializedItem = JSON.stringify(endorsed_cert);
const wrapAlgo = {
name: "RSA-OAEP-AES-KWP",
aesKeySize: 256
} as RsaOaepAesKwpParams;
const wrapped: ArrayBuffer = ccf.crypto.wrapKey(
ccf.strToBuf(serializedItem),
ccf.strToBuf(Base64.decode(body.encrypt.publicKey)),
wrapAlgo
);
const wrappedBase64 = Base64.fromUint8Array(new Uint8Array(wrapped));
return { body: { value: wrappedBase64 } };
}