Parameters: ctor inputs leaf_secret commit_opts
| 976 | // * leaf_secret |
| 977 | // * commit_opts |
| 978 | std::tuple<State, Welcome> |
| 979 | State::create_branch(bytes group_id, |
| 980 | HPKEPrivateKey enc_priv, |
| 981 | SignaturePrivateKey sig_priv, |
| 982 | const LeafNode& leaf_node, |
| 983 | ExtensionList extensions, |
| 984 | const std::vector<KeyPackage>& key_packages, |
| 985 | const bytes& leaf_secret, |
| 986 | const CommitOpts& commit_opts) const |
| 987 | { |
| 988 | // Create new empty group with the appropriate PSK |
| 989 | auto new_group = |
| 990 | State{ std::move(group_id), _suite, std::move(enc_priv), |
| 991 | std::move(sig_priv), leaf_node, std::move(extensions) }; |
| 992 | |
| 993 | new_group.add_resumption_psk(_group_id, _epoch, _key_schedule.resumption_psk); |
| 994 | |
| 995 | // Create Add proposals |
| 996 | auto proposals = stdx::transform<Proposal>( |
| 997 | key_packages, [&](const auto& kp) { return new_group.add_proposal(kp); }); |
| 998 | |
| 999 | // Create PSK proposal |
| 1000 | proposals.push_back({ PreSharedKey{ |
| 1001 | { ResumptionPSK{ ResumptionPSKUsage::branch, _group_id, _epoch }, |
| 1002 | random_bytes(_suite.secret_size()) } } }); |
| 1003 | |
| 1004 | // Commit the Add and PSK proposals |
| 1005 | auto opts = CommitOpts{ |
| 1006 | proposals, |
| 1007 | commit_opts.inline_tree, |
| 1008 | commit_opts.force_path, |
| 1009 | commit_opts.leaf_node_opts, |
| 1010 | }; |
| 1011 | auto [_commit, welcome, state] = new_group.commit( |
| 1012 | leaf_secret, opts, {}, RestartCommitParams{ ResumptionPSKUsage::branch }); |
| 1013 | return { state, welcome }; |
| 1014 | } |
| 1015 | |
| 1016 | State |
| 1017 | State::handle_branch(const HPKEPrivateKey& init_priv, |
nothing calls this directly
no test coverage detected