Skip to content

Instantly share code, notes, and snippets.

View asit-dhal's full-sized avatar

Asit Kumar Dhal asit-dhal

View GitHub Profile
@asit-dhal
asit-dhal / ca.md
Created October 7, 2021 22:21 — forked from soarez/ca.md
How to setup your own CA with OpenSSL

How to setup your own CA with OpenSSL

For educational reasons I've decided to create my own CA. Here is what I learned.

First things first

Lets get some context first.

int main()
{
B b(1, 'a', 'b', 'e');
auto& [e1, e2, e3, e4] =b;
e1 = 100;
e2 = 'k';
e3 = 'l';
e4 = 'm';
assert(100 == b.a);
assert('k' == b.c);
template<std::size_t idx> decltype(auto) get(B &b)
{
static_assert (idx < 4);
if constexpr (idx == 0) {
return static_cast<int&>(b.a);
} else if constexpr (idx == 1) {
return static_cast<char&>(b.c);
} else if constexpr (idx == 2) {
return static_cast<char&>(b.d);
} else {
int main()
{
B b(1, 'a', 'b', 'e');
auto [e1, e2, e3, e4] = b;
assert(e1 == b.a);
assert(e2 == b.c);
assert(e3 == b.d);
assert(e4 == b.e);
}
template<std::size_t idx> auto get(const B &b)
{
static_assert (idx < 4);
if constexpr (idx == 0) {
return b.a;
} else if constexpr (idx == 1) {
return b.c;
} else if constexpr (idx == 2) {
return b.d;
} else {
template<std::size_t> auto get(const B&);
template<> auto get<0>(const B &b) { return b.a; }
template<> auto get<1>(const B &b) { return b.c; }
template<> auto get<2>(const B &b) { return b.d; }
template<> auto get<3>(const B &b) { return b.e; }
template<>
struct std::tuple_element<0, B>
{
using type = int;
};
template<std::size_t idx>
struct std::tuple_element<idx, B>
{
using type = char;
template<>
struct std::tuple_size<B>
{
static constexpr int value = 4;
};
struct A {
explicit A(int a) : a(a) {}
int a;
};
struct B : public A {
B(int a, char c, char d, char e) : A(a), c(c), d(d), e(e) {}
char c;
char d;
char e;
struct RetVal
{
int x;
int& y;
const int& z;
};
RetVal doSomething(int& a, const int &b) {
return {10, a, b};
}