verifyAdvertisedKeyPackage function

Future<(KeyPackage?, KeyPackageStatus)> verifyAdvertisedKeyPackage(
  1. Object? advertised, {
  2. required AtClientEnvelopeSigner signer,
  3. required String signerAtSign,
  4. required String enrollmentId,
  5. 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);
  }
}