Files
tubestation/dom/mls/MLSTransactionMessage.cpp
Benjamin Beurdouche 4e1e4fe2c9 Bug 1900537 - Part 3: Web API for MLS. r=webidl,ipc-reviewers,smaug,nika
This patch contains an experimental Web API for the Messaging Layer Security (RFC 9420) protocol.
The API allows to securely generate cryptographic material and build large dynamic groups with state-of-the-art security.

The state (both public and secret) is stored in the profile and isolated by origin within dedicated databases.
No secret can be exfiltrated through the API, and privacy risks are minimized due to the selected isolation.

Differential Revision: https://phabricator.services.mozilla.com/D210568
2024-12-18 14:04:20 +00:00

66 lines
2.4 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsTArray.h"
#include "ipc/IPCMessageUtils.h"
#include "ipc/IPCMessageUtilsSpecializations.h"
#include "mozilla/Assertions.h"
#include "mozilla/security/mls/mls_gk_ffi_generated.h"
#include "MLSTransactionMessage.h"
#include "mozilla/dom/MLSTransactionMessage.h"
using namespace mozilla::security::mls;
void IPC::ParamTraits<mozilla::security::mls::GkReceived>::Write(
MessageWriter* aWriter, const paramType& aValue) {
// Serialize the enum variant tag
IPC::WriteParam(aWriter, aValue.tag);
switch (aValue.tag) {
case paramType::Tag::ApplicationMessage:
IPC::WriteParam(aWriter, aValue.application_message._0);
break;
case paramType::Tag::GroupIdEpoch:
IPC::WriteParam(aWriter, aValue.group_id_epoch._0);
break;
case paramType::Tag::CommitOutput:
IPC::WriteParam(aWriter, aValue.commit_output._0);
break;
default:
break;
}
}
bool IPC::ParamTraits<mozilla::security::mls::GkReceived>::Read(
MessageReader* aReader, paramType* aResult) {
MOZ_ASSERT(aResult->tag == paramType::Tag::None,
"Clobbering already-initialized result");
// Deserialize the tag
if (!IPC::ReadParam(aReader, &aResult->tag)) {
// Ensure that the tag has a safe value for the destructor before returning.
aResult->tag = paramType::Tag::None;
return false;
}
// Use placement-new to initialize the relevant variant of the internal union,
// then deserialize the bodies.
switch (aResult->tag) {
case paramType::Tag::None:
return true; // No data payload
case paramType::Tag::ApplicationMessage:
new (&aResult->application_message) paramType::ApplicationMessage_Body;
return IPC::ReadParam(aReader, &aResult->application_message._0);
case paramType::Tag::GroupIdEpoch:
new (&aResult->group_id_epoch) paramType::GroupIdEpoch_Body;
return IPC::ReadParam(aReader, &aResult->group_id_epoch._0);
case paramType::Tag::CommitOutput:
new (&aResult->commit_output) paramType::CommitOutput_Body;
return IPC::ReadParam(aReader, &aResult->commit_output._0);
}
return false;
}