openFanet1 function

Future<({String plaintext, String senderPub})> openFanet1({
  1. required SimpleKeyPair channelKeyPair,
  2. required String frameId,
  3. required String channelId,
  4. required String payloadB64,
})

Opens a fanet1 frame with the channel X25519 channelKeyPair.

Returns the authenticated sender public key (base64) and plaintext. Wrong keys, frame ids, channel ids, malformed frames, and tampering all throw; no unauthenticated plaintext is returned.

Implementation

Future<({String senderPub, String plaintext})> openFanet1({
  required SimpleKeyPair channelKeyPair,
  required String frameId,
  required String channelId,
  required String payloadB64,
}) async {
  final data = base64Decode(payloadB64);
  if (data.length < _minFrameLength) {
    throw const FormatException('fanet1 frame too short');
  }
  if (data.first != fanet1FrameVersion) {
    throw FormatException('unsupported fanet1 frame version ${data.first}');
  }
  final senderPub = SimplePublicKey(
    data.sublist(1, 1 + _senderKeyLength),
    type: KeyPairType.x25519,
  );
  final plaintext = await decryptPayload(
    recipientDhKeyPair: channelKeyPair,
    senderDhPubkey: senderPub,
    frameId: frameId,
    aadTarget: channelId,
    ciphertextB64: base64Encode(data.sublist(1 + _senderKeyLength)),
  );
  return (
    senderPub: base64Encode(senderPub.bytes),
    plaintext: plaintext,
  );
}