verifyAdvertisedKeyPackage function
Future<(KeyPackage?, KeyPackageStatus)>
verifyAdvertisedKeyPackage(
- Object? advertised, {
- required AtClientEnvelopeSigner signer,
- required String signerAtSign,
- required String enrollmentId,
- String? apkamId,
Verifies an advertised key package against the _apsk of the enrollment
whose record carries it, and says why if it is unusable.
Throws nothing but StoppedException: a rejection concerns this advertisement only, so a caller listing a roster can drop one member and keep the rest rather than let a single bad record deny every other enrollment its secrets.
Implementation
Future<(KeyPackage?, KeyPackageStatus)> verifyAdvertisedKeyPackage(
Object? advertised, {
required AtClientEnvelopeSigner signer,
required String signerAtSign,
required String enrollmentId,
String? apkamId,
}) async {
if (advertised == null) return (null, KeyPackageStatus.absent);
final envelope =
_advertisedEnvelope(advertised, enrollmentId: enrollmentId, report: true);
if (envelope == null) return (null, KeyPackageStatus.rejected);
try {
await signer.verifyEnvelopeSignature(envelope,
signerAtSign: signerAtSign,
signerEnrollmentId: enrollmentId,
expecting: EnvelopeType.keyPackage);
} on AtSigningVerificationException catch (e) {
_logger.severe('the key package advertised by enrollment $enrollmentId '
'does not verify against its _apsk, so the key it offers is only as '
'trustworthy as whatever served it; not sealing to it: $e');
return (null, KeyPackageStatus.rejected);
} catch (e) {
if (e is StoppedException) rethrow;
_logger.warning('the key package advertised by enrollment $enrollmentId '
'could not be checked against its _apsk, which could not be fetched; '
'not sealing to it now: $e');
return (null, KeyPackageStatus.unverified);
}
try {
return (
KeyPackage.fromPayload(
envelope.payload,
enrollmentId: enrollmentId,
apkamId: apkamId,
),
KeyPackageStatus.present
);
} catch (e) {
_logger.info('enrollment $enrollmentId advertised a signed key package '
'this version cannot parse: $e');
return (null, KeyPackageStatus.unsupported);
}
}