/abe-fame

Primary LanguageC++MIT LicenseMIT

abe-fame

An implementation of CP-ABE and KP-ABE based on Fast Attribute-based Message Encryption

usage

Cipher Policy ABE

 using namespace ::odn::crypto;

  auto msk = odn_abe::generate_authority(2);
  auto pk = odn_abe::generate_pk(msk);
  auto sk = odn_abe::generate_sk(msk, set<string>{"A", "B", "C"});

  // (A | C) & B
  binary_policy_tree policy(NodeType::AND);
  auto &orPolicy = policy.root().addLeft<NodeType::OR>(policy);
  policy.root().addRight(policy, NodeType::LEAF, "B");
  orPolicy.addLeft(policy, NodeType::LEAF, "A");
  orPolicy.addRight(policy, NodeType::LEAF, "C");

  auto encrypt_session = odn_abe::encrypt_session(pk, policy);
  EXPECT_EQ(encrypt_session.first.is_valid(), 0);

  auto encrypt = encrypt_session.first.enc_stream();
  // encrypt with random key
  uint8_t text0[] = {'s', 'e', 'c', 'r', 'e', 't', '0'};
  uint8_t cipher0[7 + CIPHER_SIZE];
  size_t cipher0_size = 0;
  EXPECT_EQ(encrypt(text0, 7, cipher0, cipher0_size), 0);

  auto decrypt_session = odn_abe::decrypt_session(sk, encrypt_session.second);
  EXPECT_EQ(decrypt_session.is_valid(), 0);

  auto decrypt = decrypt_session.dec_stream(encrypt.header(), HEADER_SIZE);

  uint8_t rev_text0[7];
  size_t rev_text0_size = 0;
  EXPECT_EQ(decrypt(rev_text0, rev_text0_size, cipher0, cipher0_size), 0);
  EXPECT_EQ(rev_text0_size, 7);

  // compare elemnt wise
  for (size_t i = 0; i < rev_text0_size; ++i) {
    EXPECT_EQ(text0[i], rev_text0[i]);
  }

Key Policy ABE

 using namespace ::odn::crypto;

  auto msk = odn_abe::generate_authority(2);
  auto pk = odn_abe::generate_pk(msk);
  // (A | C) & B
  binary_policy_tree policy(NodeType::AND);
  policy.root().addLeft<NodeType::OR>(policy).addLeft(policy, NodeType::LEAF, "A");
  policy.root().addLeft<NodeType::OR>(policy).addRight(policy, NodeType::LEAF, "C");
  policy.root().addRight(policy, NodeType::LEAF, "B");
  // policy.root().addLeft(policy, NodeType::LEAF, "A");
  // policy.root().addRight(policy, NodeType::LEAF, "B");

  auto sk = odn_abe::generate_sk(msk, policy);

  auto encrypt_session = odn_abe::encrypt_session(pk, set<string>{"B", "C"});
  EXPECT_EQ(encrypt_session.first.is_valid(), 0);

  auto encrypt = encrypt_session.first.enc_stream();
  // encrypt with random key
  uint8_t text0[] = {'s', 'e', 'c', 'r', 'e', 't', '0'};
  uint8_t cipher0[7 + CIPHER_SIZE];
  size_t cipher0_size = 0;
  EXPECT_EQ(encrypt(text0, 7, cipher0, cipher0_size), 0);

  auto decrypt_session = odn_abe::decrypt_session(sk, encrypt_session.second);
  EXPECT_EQ(decrypt_session.is_valid(), 0);

  auto decrypt = decrypt_session.dec_stream(encrypt.header(), HEADER_SIZE);

  uint8_t rev_text0[7];
  size_t rev_text0_size = 0;
  EXPECT_EQ(decrypt(rev_text0, rev_text0_size, cipher0, cipher0_size), 0);
  EXPECT_EQ(rev_text0_size, 7);

  // compare elemnt wise
  for (size_t i = 0; i < rev_text0_size; ++i) {
    EXPECT_EQ(text0[i], rev_text0[i]);
  }


# Disclaimer

This is not a production grade code. Implementations may not be correct or secure and may include patented algorithms.

# License
MIT