tryDecode method

Map<String, dynamic> tryDecode(
  1. PublicKey recipientPublicKey,
  2. Uint8List encodedMessage
)

Implementation

Map<String, dynamic> tryDecode(
    ct.PublicKey recipientPublicKey, Uint8List encodedMessage) {
  if (1 == encodedMessage[0]) {
    try {
      final message = decodeAesGcm(deriveSharedKey, keyPair,
          recipientPublicKey, encodedMessage.sublist(1));
      return {'isDecoded': true, 'message': message};
    } catch (e) {
      if (e.toString() !=
              'SecretBoxAuthenticationError: SecretBox has wrong message authentication code (MAC)' &&
          e.toString() != 'Instance of \'InvalidCipherTextException\'') {
        rethrow;
      }
    }
  }

  if (0xFE == encodedMessage[0] &&
      0 ==
          ArrayHelpers.deepCompare(
              DELEGATION_MARKER, encodedMessage.sublist(0, 8))) {
    final ephemeralPublicKeyStart = DELEGATION_MARKER.length;
    final ephemeralPublicKeyEnd = ephemeralPublicKeyStart + ct.PublicKey.SIZE;
    final ephemeralPublicKey = ct.PublicKey(encodedMessage.sublist(
        ephemeralPublicKeyStart, ephemeralPublicKeyEnd));

    try {
      final message = decodeAesGcm(deriveSharedKey, keyPair,
          ephemeralPublicKey, encodedMessage.sublist(ephemeralPublicKeyEnd));
      return {'isDecoded': true, 'message': message};
    } catch (e) {
      if (e.toString() !=
              'Unsupported state or unable to authenticate data' &&
          e.toString() != 'invalid point') {
        rethrow;
      }
    }
  }

  return {'isDecoded': false, 'message': encodedMessage};
}