【Botan源码阅读】开篇词

admin 2022年10月29日14:30:57评论135 views字数 32058阅读106分51秒阅读模式

【Botan源码阅读】开篇词

【Botan源码阅读】开篇词

等闲识得东风面,万紫千红总是春。 —【宋】朱熹

好了,看到这个文章的标题,就知道,我又来给我自己挖坑了,这次呢,我们来一起看一下一个密码学库(botan)的源码的相关实现,那么为什么我不选择openssl呢,虽然说openssl是使用范围最广的密码学相关的库,但是由于我个人的水平实在有限,理解不了openssl的高深的写法,或许等我修炼到一定的程度之后可能能够理解到openssl的精髓,目前我这水平是完全不够的,然后呢,我就在众多密码学的实现库当中,着实的“精挑细选”了一波,最终选中了boton这个库,这个库首先看起来代码的思路和风格还是比较清晰和明了的,这也就是这一些列文章选他的最主要原因了,然后呢,搜了一下,好像来写密码学有关算法库的源码阅读的文章也并不多,因此呢,这里突然来了点灵感,就有了这一篇文章。

这个库代码主要是通过c++写的,因此阅读这一系列文章的读者需要有一定的c++的基础,这里我大概率不会去过多的去聊有关c++的知识,那么为什么选择c++而不选择其他语言呢,因为相对于其他语言,密码学库目前还是c++的居多,虽然在rust和go也给了对应语言的密码学算法实现,不过大多数rfc和paper当中所选择的语言还是c或者c++,因此呢,考虑再三,最终选择了botan这个库来作为这一系列文章的核心代码库。

其实,阅读密码学相关的库,其实相比于阅读其他的大型项目的源码,相对来说要容易一些,为什么这么说呢,在本文结束的时候聊一下我的看法作为结尾吧,好了,我们来开始本次的文章。

环境配置

俗话说,工欲善其事,必先利其器,因此呢我们在开始源码阅读之前呢,首先要先来配置一下源码阅读的环境,本次环境是基于CLion配置的,至于为什么不用vscode,是因为我对于vscode的使用实在是不熟悉,因此呢,就不用vscode了,本身botan这个项目是给出了makefile的,但是呢为了便于阅读和分析,本系列文章呢,采用CMake来进行构建调试,如果大家要编译成品,还是建议根据文档中的来,采用CMake仅仅是为了便于调试,因为我个人还是习惯CMake.

前期准备

因为CMake的配置文件是通过Python生成的,因此要确保电脑当中是有CMake以及Python的相关运行环境的。

  • 源码: https://github.com/randombit/botan[1]

  • IDE: CLion

  • 环境依赖: CMake、Python

生成配置文件

因为这个项目本身是不带CMake的配置文件的,因此呢需要自己生成一下,运行下面的命令就好了

python3 configure.py --with-cmake

运行完成之后呢,在项目的根目录会得到一个CMakeLists.txt的文件,如果没有那大概率是搞错了,如果想偷懒,不想运行,可以直接复制文末附件当中的内容,然后自己创建一个文件,应该问题也不大.

测试配置文件效果

生成完成之后呢,需要验证一下自己的环境搞没搞对,然后呢,我们直接运行一下他的测试,使用CLion打开项目,然后找到src/tests/main.cpp这个文件,我们实际上是不需要实际运行他的那些测试代码的,因此呢,这里可以直接删一下里里面的内容,只需要编译不报错,这里其实就可以了,具体代码如下

/*
* (C) 2015 Jack Lloyd
*
* Botan is released under the Simplified BSD License (see license.txt)
*/


namespace {
}

int main(int argc, char *argv[]) {
    return 0;
}

对,你没有看错,就是这么简单。至于怎么运行,相信用过CLion的各位读者大佬,应该都比我熟悉,这里就不在啰嗦了。

到这里,基本的环境配置就介绍完了,下面呢我们来先看一下这个项目的一个结构

项目结构

对于整个项目,所有代码相关内容都在src文件夹下,然后这个项目根目录当中的其他文件呢,和源码关系不大,这里就不展开来讲了,核心咱们来看下src下面的内容,然后呢对于整个源码内容,核心都在lib目录下,因此后文主要是针对于 lib目录的代码进行解读和分析,其他的相关代码主要是为了构建和测试,和核心内容关系不大,因此呢就不过多介绍了。

然后呢,下面简单介绍一下每个目录下面所有的文件夹及其作用,当然涉及到具体的算法这块不会展开来聊,因为要是展开,内容就太多了,只是简单提及一下,大部分的名字和收录的算法是相关的,看到名字其实就可以快速找到自己想找的算法,然后后文呢,只挑着我懂的算法来讲,然后呢,代码源文件里面有一个info.txt的文件,里面记录了当前文件夹下的主要作用,然后这里我从里面抽取了一下,纯手工操作,放在文末搞了一个思维导图,如果有需要的读者可以快速的找到对应的算法。

asn1

在电信和计算机网络领域,ASN.1(Abstract Syntax Notation One) 是一套标准,是描述数据的表示、编码、传输、解码的灵活的记法,有关这个的详细知识呢,不是本文的重点,因此在这里也就不详细展开来聊了(这个我也不是很了解)。

base

这个文件夹定义了一些基础的类型,用于后续的编码实现。

block

这个文件夹下面主要是收录了一些分组加密的算法,其中包括我们所熟悉的aes、des、sm4等等。

codec

这个文件夹主要是收录了一些编解码算法,其中包括hex编码,base32、base64编码等等。

compat

这个文件夹主要是做一些兼容其他库的库,这块其实对于源码阅读的作用不是特别大(个人感觉),因此后文不太会去分析这个文件夹下面的内容。

compression

这个文件夹呢,主要是包含了一些压缩算法,其中包括zlib、lzma等等。

entropy

实话说,这个文件夹的内容我没太看懂,因此呢等我修炼到一定境界再来看这个文件夹吧,我现有的水平着实不够。

ffi

这个文件夹呢,其实作用也不大,主要是给其他语言提供一个调用接口,和我们阅读源码的关系着实也不大,所以后续应该也不会讲他。

filters

这个文件夹是做一些数据转换用的,个人感觉和源码阅读关系也不大,所以这个文件夹下面的内容也不会展开来聊。

hash

这个文件夹主要是收录了一些哈希函数,包括我们常见的md5、sha1、sha2等等。

kdf

这个文件夹呢,主要是收录了一些密钥扩展算法,其中包括hkdf、kdf1等等。

mac

对于这一个文件夹,主要是收录了一些mac算法,其中不乏我们常见的hmac、poly1305等等。

math

math文件夹下面主要是包括一些密码学常用的数学相关的代码,其中包括数论、大整数的相关运算等等。

misc

杂项,顾名思义,这里面收录了一些我也不知道应该怎么分类的算法,这个文件夹感觉我分析的概率应该也不会太大,先不给自己挖坑了,主要是打眼一看,好像没什么我熟悉的东西,溜了溜了。

modes

这个文件夹主要是包括了一些密码学当中对于分组处理和padding的模式。

passhash

和上面所提到的hash不同,这个文件夹主要是包括了一些针对于保存密码所用到的算法。

pbkdf

这个和上面的kdf的差别是这个是基于密码的密钥派生算法。

pk_pad

这个主要是实现了一些对于公钥的padding方案。

prov

这个文件夹的作用我也没看太懂,所以这里先放放吧。

psk_db

这个是通用预共享密钥数据库的算法,对没错,应该是这么翻译的,实话说,我也不懂。

pubkey

这里主要是收录了一些分对称加密的算法,包括我们所熟悉的rsa、ecdsa等等。

rng

这个文件夹下面主要是收录了一些随机数生成算法。

stream

这个文件夹主要是收录一些我们熟悉的rc4、chacha系列算法等流密码。

tls

这个文件夹主要是实现了tls各个版本的协议。

utils

这个文件夹主要是一些工具类,里面的东西也比较杂,这里也不过多的讲了。

x509

这个主要是证书相关的密码学算法。

到这里,相关的目录的介绍呢就介绍的差不多了,这篇文章呢,到这里也快接近尾声了,本身定位就是一篇开篇词,感觉这又给自己挖了一个坑,算了慢慢填吧,好在就是里面大部分的算法在我之前的文章中都有讲过,然后这系列文章的核心呢在于来一起看看正常的密码学相关库的实现方案,学习下大佬们写代码的方式。

番外篇

对于密码学相关的库来说,除了对于算法实现的要求,还要确保实现的安全性,因此呢,在阅读代码的过程当中,可能会遇到一些比较奇怪的写法,我们先来看一个例子把,在c语言或者c++当中,对比两个buffer是否一致的代码,相信各位都写过,很容易写出如下的代码。

template<typename T> bool same_mem(const T* p1, const T* p2, size_t n) {
    for (int i = 0; i < n; ++i) {
        if (p1[i] != p2[i]) {
            return false;
        }
    }
    return true;
}

这段代码应该是比较好理解的,我们开始遍历需要对比的内存,然后如果不相同直接返回false,最终如果都相同则返回true,但是同样的代码,在密码学相关库当中确有另一个实现。

/**
* Memory comparison, input insensitive
* @param p1 a pointer to an array
* @param p2 a pointer to another array
* @param n the number of Ts in p1 and p2
* @return true iff p1[i] == p2[i] forall i in [0...n)
*/

template<typename T> inline bool same_mem(const T* p1, const T* p2, size_t n)
   
{
   volatile T difference = 0;

   for(size_t i = 0; i != n; ++i)
      difference = difference | (p1[i] ^ p2[i]);

   return difference == 0;
   }

首先呢,这个对于对比变量来说,采用了volatile关键字,有关这个关键字的作用呢,简单来说就告诉编译器我这个值是易变的,也许你也不知道谁将会来改变我,所以呢,对于这个值,每次你用的时候都在内存当中把这个值给捞出来,其次呢,这个是遍历了从0到n所有的内容,然后进行了一次异或操作在和对比变量进行与操作。

这有细心的读者可能想到了,这么对比不是浪费了更多的时间么,其实不是这样的,通过这个对比,对于任意的内存所需要的时间都是大致相同的,那么为什么需要这么考虑呢,我们考虑这么一种情况,第一种方法因为比较的次数是不一样的,因此呢对于不同的两块内存所使用的时间是有差异的,因此呢可以通过这个时间差异来推断出来某些内容,存在不安全的因素,实际上对于密码学当中有一种特殊的攻击手段,大类名称为侧信道攻击,这个就是基于时间差异而产生的一种攻击方式,因为侧信道攻击也不是本文的重点,感兴趣的读者可以自行查阅下相关资料。

结束语

好了,谈一下开头说的月度密码学相关库项目的源代码要比其他的项目要容易,这里不考虑openssl那种不是我现在的level能够理解的项目,就正常的项目而言,为什么我会这么说呢,核心在于密码学算法库的实现,因为每个密码学算法都是相对独立的内容,捕获牵扯到过多的项目文件想关联,从上面的文件夹分类来看,基本上每个文件夹下面都是独立的内容,特别多内容的也就是组合协议这块了,比如tls的内容,这块可能看起来是比较复杂的,其他的就都相对来说比较分散和独立了,不像其他的项目比如redis源码或者Android源码里面牵扯到的相关东西相对来说就比较多了,而且穿插着来各种复杂逻辑,因此呢,从这一方面来看,密码学相关库的可阅读性就好了很多,如果只是看某个算法,大概率可能就只需要看一个文件就好了(这里不考虑用的那些基础类和工具类的代码),因此呢,从我个人而言,阅读密码学相关库要比阅读其他项目的源码要简单不少,不过咱这里不能只说阅读密码学库源码的方便之处,咱们也要来说一下阅读相关代码的难点,其实难点核心就在于具体的密码学算法当中,因为他的分散性,这也就导致了去看每一种加密算法的过程当中,实际上我们都需要先去理解这个密码学算法的具体设计流程,这也就导致了每次去看新的算法的过程,大概率要先看一篇英文的rfc或者paper,如果说是本身对于密码学算法有一定的了解的话,可能看起来就比较容易了,到这里,这篇开篇词也就要结束了,希望这系列文章我能够坚持写下去,也祝愿各位读者能在我这些文章当中有所收获。

附件

CMake配置文件

cmake_minimum_required(VERSION 2.8.0)
project(botan)

if(POLICY CMP0042)
cmake_policy(SET CMP0042 NEW)
endif()

set(BOTAN_SOURCES
    "src/lib/asn1/alg_id.cpp"
    "src/lib/asn1/asn1_obj.cpp"
    "src/lib/asn1/asn1_oid.cpp"
    "src/lib/asn1/asn1_print.cpp"
    "src/lib/asn1/asn1_str.cpp"
    "src/lib/asn1/asn1_time.cpp"
    "src/lib/asn1/ber_dec.cpp"
    "src/lib/asn1/der_enc.cpp"
    "src/lib/asn1/oid_maps.cpp"
    "src/lib/asn1/oids.cpp"
    "src/lib/base/buf_comp.cpp"
    "src/lib/base/sym_algo.cpp"
    "src/lib/base/symkey.cpp"
    "src/lib/block/aes/aes.cpp"
    "src/lib/block/aes/aes_ni/aes_ni.cpp"
    "src/lib/block/aes/aes_vperm/aes_vperm.cpp"
    "src/lib/block/aria/aria.cpp"
    "src/lib/block/block_cipher.cpp"
    "src/lib/block/blowfish/blowfish.cpp"
    "src/lib/block/camellia/camellia.cpp"
    "src/lib/block/cascade/cascade.cpp"
    "src/lib/block/cast128/cast128.cpp"
    "src/lib/block/des/des.cpp"
    "src/lib/block/gost_28147/gost_28147.cpp"
    "src/lib/block/idea/idea.cpp"
    "src/lib/block/idea/idea_sse2/idea_sse2.cpp"
    "src/lib/block/lion/lion.cpp"
    "src/lib/block/noekeon/noekeon.cpp"
    "src/lib/block/noekeon/noekeon_simd/noekeon_simd.cpp"
    "src/lib/block/seed/seed.cpp"
    "src/lib/block/serpent/serpent.cpp"
    "src/lib/block/serpent/serpent_avx2/serpent_avx2.cpp"
    "src/lib/block/serpent/serpent_simd/serpent_simd.cpp"
    "src/lib/block/shacal2/shacal2.cpp"
    "src/lib/block/shacal2/shacal2_avx2/shacal2_avx2.cpp"
    "src/lib/block/shacal2/shacal2_simd/shacal2_simd.cpp"
    "src/lib/block/shacal2/shacal2_x86/shacal2_x86.cpp"
    "src/lib/block/sm4/sm4.cpp"
    "src/lib/block/threefish_512/threefish_512.cpp"
    "src/lib/block/threefish_512/threefish_512_avx2/threefish_512_avx2.cpp"
    "src/lib/block/twofish/twofish.cpp"
    "src/lib/block/twofish/twofish_tab.cpp"
    "src/lib/codec/base32/base32.cpp"
    "src/lib/codec/base58/base58.cpp"
    "src/lib/codec/base64/base64.cpp"
    "src/lib/codec/hex/hex.cpp"
    "src/lib/compat/sodium/sodium_25519.cpp"
    "src/lib/compat/sodium/sodium_aead.cpp"
    "src/lib/compat/sodium/sodium_auth.cpp"
    "src/lib/compat/sodium/sodium_box.cpp"
    "src/lib/compat/sodium/sodium_chacha.cpp"
    "src/lib/compat/sodium/sodium_salsa.cpp"
    "src/lib/compat/sodium/sodium_secretbox.cpp"
    "src/lib/compat/sodium/sodium_utils.cpp"
    "src/lib/entropy/entropy_srcs.cpp"
    "src/lib/entropy/getentropy/getentropy.cpp"
    "src/lib/entropy/rdseed/rdseed.cpp"
    "src/lib/ffi/ffi.cpp"
    "src/lib/ffi/ffi_block.cpp"
    "src/lib/ffi/ffi_cert.cpp"
    "src/lib/ffi/ffi_cipher.cpp"
    "src/lib/ffi/ffi_fpe.cpp"
    "src/lib/ffi/ffi_hash.cpp"
    "src/lib/ffi/ffi_hotp.cpp"
    "src/lib/ffi/ffi_kdf.cpp"
    "src/lib/ffi/ffi_keywrap.cpp"
    "src/lib/ffi/ffi_mac.cpp"
    "src/lib/ffi/ffi_mp.cpp"
    "src/lib/ffi/ffi_pk_op.cpp"
    "src/lib/ffi/ffi_pkey.cpp"
    "src/lib/ffi/ffi_pkey_algs.cpp"
    "src/lib/ffi/ffi_rng.cpp"
    "src/lib/ffi/ffi_srp6.cpp"
    "src/lib/ffi/ffi_totp.cpp"
    "src/lib/filters/algo_filt.cpp"
    "src/lib/filters/b64_filt.cpp"
    "src/lib/filters/basefilt.cpp"
    "src/lib/filters/buf_filt.cpp"
    "src/lib/filters/cipher_filter.cpp"
    "src/lib/filters/comp_filter.cpp"
    "src/lib/filters/data_snk.cpp"
    "src/lib/filters/fd_unix/fd_unix.cpp"
    "src/lib/filters/filter.cpp"
    "src/lib/filters/hex_filt.cpp"
    "src/lib/filters/out_buf.cpp"
    "src/lib/filters/pipe.cpp"
    "src/lib/filters/pipe_io.cpp"
    "src/lib/filters/pipe_rw.cpp"
    "src/lib/filters/secqueue.cpp"
    "src/lib/filters/threaded_fork.cpp"
    "src/lib/hash/blake2/blake2b.cpp"
    "src/lib/hash/checksum/adler32/adler32.cpp"
    "src/lib/hash/checksum/crc24/crc24.cpp"
    "src/lib/hash/checksum/crc32/crc32.cpp"
    "src/lib/hash/comb4p/comb4p.cpp"
    "src/lib/hash/gost_3411/gost_3411.cpp"
    "src/lib/hash/hash.cpp"
    "src/lib/hash/keccak/keccak.cpp"
    "src/lib/hash/md4/md4.cpp"
    "src/lib/hash/md5/md5.cpp"
    "src/lib/hash/mdx_hash/mdx_hash.cpp"
    "src/lib/hash/par_hash/par_hash.cpp"
    "src/lib/hash/rmd160/rmd160.cpp"
    "src/lib/hash/sha1/sha160.cpp"
    "src/lib/hash/sha1/sha1_sse2/sha1_sse2.cpp"
    "src/lib/hash/sha1/sha1_x86/sha1_x86.cpp"
    "src/lib/hash/sha2_32/sha2_32.cpp"
    "src/lib/hash/sha2_32/sha2_32_bmi2/sha2_32_bmi2.cpp"
    "src/lib/hash/sha2_32/sha2_32_x86/sha2_32_x86.cpp"
    "src/lib/hash/sha2_64/sha2_64.cpp"
    "src/lib/hash/sha2_64/sha2_64_bmi2/sha2_64_bmi2.cpp"
    "src/lib/hash/sha3/sha3.cpp"
    "src/lib/hash/sha3/sha3_bmi2/sha3_bmi2.cpp"
    "src/lib/hash/shake/shake.cpp"
    "src/lib/hash/skein/skein_512.cpp"
    "src/lib/hash/sm3/sm3.cpp"
    "src/lib/hash/streebog/streebog.cpp"
    "src/lib/hash/streebog/streebog_precalc.cpp"
    "src/lib/hash/whirlpool/whirlpool.cpp"
    "src/lib/kdf/hkdf/hkdf.cpp"
    "src/lib/kdf/kdf.cpp"
    "src/lib/kdf/kdf1/kdf1.cpp"
    "src/lib/kdf/kdf1_iso18033/kdf1_iso18033.cpp"
    "src/lib/kdf/kdf2/kdf2.cpp"
    "src/lib/kdf/prf_tls/prf_tls.cpp"
    "src/lib/kdf/prf_x942/prf_x942.cpp"
    "src/lib/kdf/sp800_108/sp800_108.cpp"
    "src/lib/kdf/sp800_56a/sp800_56a.cpp"
    "src/lib/kdf/sp800_56c/sp800_56c.cpp"
    "src/lib/mac/blake2mac/blake2bmac.cpp"
    "src/lib/mac/cmac/cmac.cpp"
    "src/lib/mac/gmac/gmac.cpp"
    "src/lib/mac/hmac/hmac.cpp"
    "src/lib/mac/mac.cpp"
    "src/lib/mac/poly1305/poly1305.cpp"
    "src/lib/mac/siphash/siphash.cpp"
    "src/lib/mac/x919_mac/x919_mac.cpp"
    "src/lib/math/bigint/big_code.cpp"
    "src/lib/math/bigint/big_io.cpp"
    "src/lib/math/bigint/big_ops2.cpp"
    "src/lib/math/bigint/big_ops3.cpp"
    "src/lib/math/bigint/big_rand.cpp"
    "src/lib/math/bigint/bigint.cpp"
    "src/lib/math/bigint/divide.cpp"
    "src/lib/math/mp/mp_comba.cpp"
    "src/lib/math/mp/mp_karat.cpp"
    "src/lib/math/mp/mp_monty.cpp"
    "src/lib/math/mp/mp_monty_n.cpp"
    "src/lib/math/numbertheory/dsa_gen.cpp"
    "src/lib/math/numbertheory/make_prm.cpp"
    "src/lib/math/numbertheory/mod_inv.cpp"
    "src/lib/math/numbertheory/monty.cpp"
    "src/lib/math/numbertheory/monty_exp.cpp"
    "src/lib/math/numbertheory/nistp_redc.cpp"
    "src/lib/math/numbertheory/numthry.cpp"
    "src/lib/math/numbertheory/primality.cpp"
    "src/lib/math/numbertheory/primes.cpp"
    "src/lib/math/numbertheory/reducer.cpp"
    "src/lib/misc/cryptobox/cryptobox.cpp"
    "src/lib/misc/fpe_fe1/fpe_fe1.cpp"
    "src/lib/misc/hotp/hotp.cpp"
    "src/lib/misc/hotp/totp.cpp"
    "src/lib/misc/nist_keywrap/nist_keywrap.cpp"
    "src/lib/misc/rfc3394/rfc3394.cpp"
    "src/lib/misc/roughtime/roughtime.cpp"
    "src/lib/misc/srp6/srp6.cpp"
    "src/lib/misc/tss/tss.cpp"
    "src/lib/misc/zfec/zfec.cpp"
    "src/lib/misc/zfec/zfec_sse2/zfec_sse2.cpp"
    "src/lib/misc/zfec/zfec_vperm/zfec_vperm.cpp"
    "src/lib/modes/aead/aead.cpp"
    "src/lib/modes/aead/ccm/ccm.cpp"
    "src/lib/modes/aead/chacha20poly1305/chacha20poly1305.cpp"
    "src/lib/modes/aead/eax/eax.cpp"
    "src/lib/modes/aead/gcm/gcm.cpp"
    "src/lib/modes/aead/ocb/ocb.cpp"
    "src/lib/modes/aead/siv/siv.cpp"
    "src/lib/modes/cbc/cbc.cpp"
    "src/lib/modes/cfb/cfb.cpp"
    "src/lib/modes/cipher_mode.cpp"
    "src/lib/modes/mode_pad/mode_pad.cpp"
    "src/lib/modes/xts/xts.cpp"
    "src/lib/passhash/argon2fmt/argon2fmt.cpp"
    "src/lib/passhash/bcrypt/bcrypt.cpp"
    "src/lib/passhash/passhash9/passhash9.cpp"
    "src/lib/pbkdf/argon2/argon2.cpp"
    "src/lib/pbkdf/argon2/argon2_ssse3/argon2_ssse3.cpp"
    "src/lib/pbkdf/argon2/argon2pwhash.cpp"
    "src/lib/pbkdf/bcrypt_pbkdf/bcrypt_pbkdf.cpp"
    "src/lib/pbkdf/pbkdf.cpp"
    "src/lib/pbkdf/pbkdf2/pbkdf2.cpp"
    "src/lib/pbkdf/pgp_s2k/pgp_s2k.cpp"
    "src/lib/pbkdf/pgp_s2k/rfc4880.cpp"
    "src/lib/pbkdf/pwdhash.cpp"
    "src/lib/pbkdf/scrypt/scrypt.cpp"
    "src/lib/pk_pad/eme.cpp"
    "src/lib/pk_pad/eme_oaep/oaep.cpp"
    "src/lib/pk_pad/eme_pkcs1/eme_pkcs.cpp"
    "src/lib/pk_pad/eme_raw/eme_raw.cpp"
    "src/lib/pk_pad/emsa.cpp"
    "src/lib/pk_pad/emsa1/emsa1.cpp"
    "src/lib/pk_pad/emsa_pkcs1/emsa_pkcs1.cpp"
    "src/lib/pk_pad/emsa_pssr/pssr.cpp"
    "src/lib/pk_pad/emsa_raw/emsa_raw.cpp"
    "src/lib/pk_pad/emsa_x931/emsa_x931.cpp"
    "src/lib/pk_pad/hash_id/hash_id.cpp"
    "src/lib/pk_pad/iso9796/iso9796.cpp"
    "src/lib/pk_pad/mgf1/mgf1.cpp"
    "src/lib/pk_pad/padding.cpp"
    "src/lib/prov/pkcs11/p11.cpp"
    "src/lib/prov/pkcs11/p11_ecc_key.cpp"
    "src/lib/prov/pkcs11/p11_ecdh.cpp"
    "src/lib/prov/pkcs11/p11_ecdsa.cpp"
    "src/lib/prov/pkcs11/p11_mechanism.cpp"
    "src/lib/prov/pkcs11/p11_module.cpp"
    "src/lib/prov/pkcs11/p11_object.cpp"
    "src/lib/prov/pkcs11/p11_randomgenerator.cpp"
    "src/lib/prov/pkcs11/p11_rsa.cpp"
    "src/lib/prov/pkcs11/p11_session.cpp"
    "src/lib/prov/pkcs11/p11_slot.cpp"
    "src/lib/prov/pkcs11/p11_x509.cpp"
    "src/lib/psk_db/psk_db.cpp"
    "src/lib/psk_db/psk_db_sql.cpp"
    "src/lib/pubkey/blinding.cpp"
    "src/lib/pubkey/cecpq1/cecpq1.cpp"
    "src/lib/pubkey/curve25519/curve25519.cpp"
    "src/lib/pubkey/curve25519/donna.cpp"
    "src/lib/pubkey/dh/dh.cpp"
    "src/lib/pubkey/dl_algo/dl_algo.cpp"
    "src/lib/pubkey/dl_group/dl_group.cpp"
    "src/lib/pubkey/dl_group/dl_named.cpp"
    "src/lib/pubkey/dlies/dlies.cpp"
    "src/lib/pubkey/dsa/dsa.cpp"
    "src/lib/pubkey/ec_group/curve_gfp.cpp"
    "src/lib/pubkey/ec_group/ec_group.cpp"
    "src/lib/pubkey/ec_group/ec_named.cpp"
    "src/lib/pubkey/ec_group/point_gfp.cpp"
    "src/lib/pubkey/ec_group/point_mul.cpp"
    "src/lib/pubkey/ec_h2c/ec_h2c.cpp"
    "src/lib/pubkey/ecc_key/ecc_key.cpp"
    "src/lib/pubkey/ecdh/ecdh.cpp"
    "src/lib/pubkey/ecdsa/ecdsa.cpp"
    "src/lib/pubkey/ecgdsa/ecgdsa.cpp"
    "src/lib/pubkey/ecies/ecies.cpp"
    "src/lib/pubkey/eckcdsa/eckcdsa.cpp"
    "src/lib/pubkey/ed25519/ed25519.cpp"
    "src/lib/pubkey/ed25519/ed25519_fe.cpp"
    "src/lib/pubkey/ed25519/ed25519_key.cpp"
    "src/lib/pubkey/ed25519/ge.cpp"
    "src/lib/pubkey/ed25519/sc_muladd.cpp"
    "src/lib/pubkey/ed25519/sc_reduce.cpp"
    "src/lib/pubkey/elgamal/elgamal.cpp"
    "src/lib/pubkey/gost_3410/gost_3410.cpp"
    "src/lib/pubkey/keypair/keypair.cpp"
    "src/lib/pubkey/kyber/kyber_common/kyber.cpp"
    "src/lib/pubkey/mce/code_based_key_gen.cpp"
    "src/lib/pubkey/mce/gf2m_rootfind_dcmp.cpp"
    "src/lib/pubkey/mce/gf2m_small_m.cpp"
    "src/lib/pubkey/mce/goppa_code.cpp"
    "src/lib/pubkey/mce/mce_workfactor.cpp"
    "src/lib/pubkey/mce/mceliece.cpp"
    "src/lib/pubkey/mce/mceliece_key.cpp"
    "src/lib/pubkey/mce/polyn_gf2m.cpp"
    "src/lib/pubkey/newhope/newhope.cpp"
    "src/lib/pubkey/pbes2/pbes2.cpp"
    "src/lib/pubkey/pem/pem.cpp"
    "src/lib/pubkey/pk_algs.cpp"
    "src/lib/pubkey/pk_keys.cpp"
    "src/lib/pubkey/pk_ops.cpp"
    "src/lib/pubkey/pkcs8.cpp"
    "src/lib/pubkey/pubkey.cpp"
    "src/lib/pubkey/rfc6979/rfc6979.cpp"
    "src/lib/pubkey/rsa/rsa.cpp"
    "src/lib/pubkey/sm2/sm2.cpp"
    "src/lib/pubkey/sm2/sm2_enc.cpp"
    "src/lib/pubkey/workfactor.cpp"
    "src/lib/pubkey/x509_key.cpp"
    "src/lib/pubkey/xmss/xmss_common_ops.cpp"
    "src/lib/pubkey/xmss/xmss_hash.cpp"
    "src/lib/pubkey/xmss/xmss_index_registry.cpp"
    "src/lib/pubkey/xmss/xmss_parameters.cpp"
    "src/lib/pubkey/xmss/xmss_privatekey.cpp"
    "src/lib/pubkey/xmss/xmss_publickey.cpp"
    "src/lib/pubkey/xmss/xmss_signature.cpp"
    "src/lib/pubkey/xmss/xmss_signature_operation.cpp"
    "src/lib/pubkey/xmss/xmss_verification_operation.cpp"
    "src/lib/pubkey/xmss/xmss_wots_parameters.cpp"
    "src/lib/pubkey/xmss/xmss_wots_privatekey.cpp"
    "src/lib/pubkey/xmss/xmss_wots_publickey.cpp"
    "src/lib/rng/auto_rng/auto_rng.cpp"
    "src/lib/rng/chacha_rng/chacha_rng.cpp"
    "src/lib/rng/hmac_drbg/hmac_drbg.cpp"
    "src/lib/rng/processor_rng/processor_rng.cpp"
    "src/lib/rng/rng.cpp"
    "src/lib/rng/stateful_rng/stateful_rng.cpp"
    "src/lib/rng/system_rng/system_rng.cpp"
    "src/lib/stream/chacha/chacha.cpp"
    "src/lib/stream/chacha/chacha_avx2/chacha_avx2.cpp"
    "src/lib/stream/chacha/chacha_simd32/chacha_simd32.cpp"
    "src/lib/stream/ctr/ctr.cpp"
    "src/lib/stream/ofb/ofb.cpp"
    "src/lib/stream/rc4/rc4.cpp"
    "src/lib/stream/salsa20/salsa20.cpp"
    "src/lib/stream/shake_cipher/shake_cipher.cpp"
    "src/lib/stream/stream_cipher.cpp"
    "src/lib/tls/credentials_manager.cpp"
    "src/lib/tls/msg_cert_req.cpp"
    "src/lib/tls/msg_cert_verify.cpp"
    "src/lib/tls/msg_client_hello.cpp"
    "src/lib/tls/msg_finished.cpp"
    "src/lib/tls/msg_server_hello.cpp"
    "src/lib/tls/msg_session_ticket.cpp"
    "src/lib/tls/sessions_sql/tls_session_manager_sql.cpp"
    "src/lib/tls/tls12/msg_cert_status.cpp"
    "src/lib/tls/tls12/msg_certificate_12.cpp"
    "src/lib/tls/tls12/msg_client_kex.cpp"
    "src/lib/tls/tls12/msg_hello_verify.cpp"
    "src/lib/tls/tls12/msg_server_kex.cpp"
    "src/lib/tls/tls12/tls_cbc/tls_cbc.cpp"
    "src/lib/tls/tls12/tls_channel_impl_12.cpp"
    "src/lib/tls/tls12/tls_client_impl_12.cpp"
    "src/lib/tls/tls12/tls_handshake_hash.cpp"
    "src/lib/tls/tls12/tls_handshake_io.cpp"
    "src/lib/tls/tls12/tls_handshake_state.cpp"
    "src/lib/tls/tls12/tls_record.cpp"
    "src/lib/tls/tls12/tls_server_impl_12.cpp"
    "src/lib/tls/tls12/tls_session_key.cpp"
    "src/lib/tls/tls13/msg_certificate_13.cpp"
    "src/lib/tls/tls13/msg_certificate_req_13.cpp"
    "src/lib/tls/tls13/msg_encrypted_extensions.cpp"
    "src/lib/tls/tls13/msg_key_update.cpp"
    "src/lib/tls/tls13/tls_channel_impl_13.cpp"
    "src/lib/tls/tls13/tls_cipher_state.cpp"
    "src/lib/tls/tls13/tls_client_impl_13.cpp"
    "src/lib/tls/tls13/tls_extensions_key_share.cpp"
    "src/lib/tls/tls13/tls_extensions_psk.cpp"
    "src/lib/tls/tls13/tls_handshake_layer_13.cpp"
    "src/lib/tls/tls13/tls_handshake_state_13.cpp"
    "src/lib/tls/tls13/tls_record_layer_13.cpp"
    "src/lib/tls/tls13/tls_transcript_hash_13.cpp"
    "src/lib/tls/tls_alert.cpp"
    "src/lib/tls/tls_algos.cpp"
    "src/lib/tls/tls_callbacks.cpp"
    "src/lib/tls/tls_ciphersuite.cpp"
    "src/lib/tls/tls_client.cpp"
    "src/lib/tls/tls_extensions.cpp"
    "src/lib/tls/tls_extensions_cert_status_req.cpp"
    "src/lib/tls/tls_handshake_transitions.cpp"
    "src/lib/tls/tls_policy.cpp"
    "src/lib/tls/tls_server.cpp"
    "src/lib/tls/tls_session.cpp"
    "src/lib/tls/tls_session_manager_memory.cpp"
    "src/lib/tls/tls_signature_scheme.cpp"
    "src/lib/tls/tls_suite_info.cpp"
    "src/lib/tls/tls_text_policy.cpp"
    "src/lib/tls/tls_version.cpp"
    "src/lib/utils/assert.cpp"
    "src/lib/utils/calendar.cpp"
    "src/lib/utils/charset.cpp"
    "src/lib/utils/cpuid/cpuid.cpp"
    "src/lib/utils/cpuid/cpuid_aarch64.cpp"
    "src/lib/utils/cpuid/cpuid_arm32.cpp"
    "src/lib/utils/cpuid/cpuid_ppc.cpp"
    "src/lib/utils/cpuid/cpuid_x86.cpp"
    "src/lib/utils/ct_utils.cpp"
    "src/lib/utils/data_src.cpp"
    "src/lib/utils/dyn_load/dyn_load.cpp"
    "src/lib/utils/exceptn.cpp"
    "src/lib/utils/filesystem.cpp"
    "src/lib/utils/ghash/ghash.cpp"
    "src/lib/utils/ghash/ghash_cpu/ghash_cpu.cpp"
    "src/lib/utils/ghash/ghash_vperm/ghash_vperm.cpp"
    "src/lib/utils/http_util/http_util.cpp"
    "src/lib/utils/locking_allocator/locking_allocator.cpp"
    "src/lib/utils/mem_ops.cpp"
    "src/lib/utils/mem_pool/mem_pool.cpp"
    "src/lib/utils/os_utils.cpp"
    "src/lib/utils/parsing.cpp"
    "src/lib/utils/poly_dbl/poly_dbl.cpp"
    "src/lib/utils/read_cfg.cpp"
    "src/lib/utils/read_kv.cpp"
    "src/lib/utils/scan_name.cpp"
    "src/lib/utils/socket/socket.cpp"
    "src/lib/utils/socket/socket_udp.cpp"
    "src/lib/utils/socket/uri.cpp"
    "src/lib/utils/thread_utils/barrier.cpp"
    "src/lib/utils/thread_utils/rwlock.cpp"
    "src/lib/utils/thread_utils/semaphore.cpp"
    "src/lib/utils/thread_utils/thread_pool.cpp"
    "src/lib/utils/timer.cpp"
    "src/lib/utils/uuid/uuid.cpp"
    "src/lib/utils/version.cpp"
    "src/lib/x509/asn1_alt_name.cpp"
    "src/lib/x509/cert_status.cpp"
    "src/lib/x509/certstor.cpp"
    "src/lib/x509/certstor_flatfile/certstor_flatfile.cpp"
    "src/lib/x509/certstor_sql/certstor_sql.cpp"
    "src/lib/x509/certstor_system/certstor_system.cpp"
    "src/lib/x509/certstor_system_macos/certstor_macos.cpp"
    "src/lib/x509/crl_ent.cpp"
    "src/lib/x509/key_constraint.cpp"
    "src/lib/x509/name_constraint.cpp"
    "src/lib/x509/ocsp.cpp"
    "src/lib/x509/ocsp_types.cpp"
    "src/lib/x509/pkcs10.cpp"
    "src/lib/x509/x509_attribute.cpp"
    "src/lib/x509/x509_ca.cpp"
    "src/lib/x509/x509_crl.cpp"
    "src/lib/x509/x509_dn.cpp"
    "src/lib/x509/x509_dn_ub.cpp"
    "src/lib/x509/x509_ext.cpp"
    "src/lib/x509/x509_obj.cpp"
    "src/lib/x509/x509cert.cpp"
    "src/lib/x509/x509opt.cpp"
    "src/lib/x509/x509path.cpp"
    "src/lib/x509/x509self.cpp"

)

set(BOTAN_CLI
    "src/cli/argon2.cpp"
    "src/cli/asn1.cpp"
    "src/cli/bcrypt.cpp"
    "src/cli/cc_enc.cpp"
    "src/cli/cipher.cpp"
    "src/cli/cli.cpp"
    "src/cli/cli_rng.cpp"
    "src/cli/codec.cpp"
    "src/cli/compress.cpp"
    "src/cli/entropy.cpp"
    "src/cli/hash.cpp"
    "src/cli/hmac.cpp"
    "src/cli/main.cpp"
    "src/cli/math.cpp"
    "src/cli/pbkdf.cpp"
    "src/cli/pk_crypt.cpp"
    "src/cli/psk.cpp"
    "src/cli/pubkey.cpp"
    "src/cli/roughtime.cpp"
    "src/cli/sandbox.cpp"
    "src/cli/speed.cpp"
    "src/cli/timing_tests.cpp"
    "src/cli/tls_client.cpp"
    "src/cli/tls_http_server.cpp"
    "src/cli/tls_proxy.cpp"
    "src/cli/tls_server.cpp"
    "src/cli/tls_utils.cpp"
    "src/cli/tss.cpp"
    "src/cli/utils.cpp"
    "src/cli/x509.cpp"
    "src/cli/zfec.cpp"

)

set(BOTAN_TESTS
    "src/tests/main.cpp"
    "src/tests/runner/test_reporter.cpp"
    "src/tests/runner/test_runner.cpp"
    "src/tests/runner/test_stdout_reporter.cpp"
    "src/tests/test_aead.cpp"
    "src/tests/test_asn1.cpp"
    "src/tests/test_bigint.cpp"
    "src/tests/test_block.cpp"
    "src/tests/test_blowfish.cpp"
    "src/tests/test_c25519.cpp"
    "src/tests/test_certstor.cpp"
    "src/tests/test_certstor_flatfile.cpp"
    "src/tests/test_certstor_system.cpp"
    "src/tests/test_certstor_utils.cpp"
    "src/tests/test_clang_bug.cpp"
    "src/tests/test_codec.cpp"
    "src/tests/test_compression.cpp"
    "src/tests/test_cryptobox.cpp"
    "src/tests/test_dh.cpp"
    "src/tests/test_dl_group.cpp"
    "src/tests/test_dlies.cpp"
    "src/tests/test_dsa.cpp"
    "src/tests/test_ec_group.cpp"
    "src/tests/test_ecc_h2c.cpp"
    "src/tests/test_ecc_pointmul.cpp"
    "src/tests/test_ecdh.cpp"
    "src/tests/test_ecdsa.cpp"
    "src/tests/test_ecgdsa.cpp"
    "src/tests/test_ecies.cpp"
    "src/tests/test_eckcdsa.cpp"
    "src/tests/test_ed25519.cpp"
    "src/tests/test_elgamal.cpp"
    "src/tests/test_entropy.cpp"
    "src/tests/test_ffi.cpp"
    "src/tests/test_filters.cpp"
    "src/tests/test_fpe.cpp"
    "src/tests/test_gf2m.cpp"
    "src/tests/test_gost_3410.cpp"
    "src/tests/test_hash.cpp"
    "src/tests/test_hash_id.cpp"
    "src/tests/test_kdf.cpp"
    "src/tests/test_keywrap.cpp"
    "src/tests/test_kyber.cpp"
    "src/tests/test_mac.cpp"
    "src/tests/test_mceliece.cpp"
    "src/tests/test_modes.cpp"
    "src/tests/test_mp.cpp"
    "src/tests/test_name_constraint.cpp"
    "src/tests/test_newhope.cpp"
    "src/tests/test_ocb.cpp"
    "src/tests/test_ocsp.cpp"
    "src/tests/test_octetstring.cpp"
    "src/tests/test_oid.cpp"
    "src/tests/test_os_utils.cpp"
    "src/tests/test_otp.cpp"
    "src/tests/test_pad.cpp"
    "src/tests/test_passhash.cpp"
    "src/tests/test_pbkdf.cpp"
    "src/tests/test_pem.cpp"
    "src/tests/test_pk_pad.cpp"
    "src/tests/test_pkcs11_high_level.cpp"
    "src/tests/test_pkcs11_low_level.cpp"
    "src/tests/test_psk_db.cpp"
    "src/tests/test_pubkey.cpp"
    "src/tests/test_rfc6979.cpp"
    "src/tests/test_rng.cpp"
    "src/tests/test_rng_kat.cpp"
    "src/tests/test_roughtime.cpp"
    "src/tests/test_rsa.cpp"
    "src/tests/test_simd.cpp"
    "src/tests/test_siv.cpp"
    "src/tests/test_sm2.cpp"
    "src/tests/test_sodium.cpp"
    "src/tests/test_srp6.cpp"
    "src/tests/test_stream.cpp"
    "src/tests/test_tests.cpp"
    "src/tests/test_thread_utils.cpp"
    "src/tests/test_tls.cpp"
    "src/tests/test_tls_cipher_state.cpp"
    "src/tests/test_tls_handshake_layer_13.cpp"
    "src/tests/test_tls_handshake_state_13.cpp"
    "src/tests/test_tls_handshake_transitions.cpp"
    "src/tests/test_tls_messages.cpp"
    "src/tests/test_tls_record_layer_13.cpp"
    "src/tests/test_tls_rfc8448.cpp"
    "src/tests/test_tls_signature_scheme.cpp"
    "src/tests/test_tls_stream_integration.cpp"
    "src/tests/test_tls_transcript_hash_13.cpp"
    "src/tests/test_tls_utils.cpp"
    "src/tests/test_tpm.cpp"
    "src/tests/test_tss.cpp"
    "src/tests/test_uri.cpp"
    "src/tests/test_utils.cpp"
    "src/tests/test_workfactor.cpp"
    "src/tests/test_x509_dn.cpp"
    "src/tests/test_x509_path.cpp"
    "src/tests/test_xmss.cpp"
    "src/tests/test_zfec.cpp"
    "src/tests/tests.cpp"
    "src/tests/unit_asio_stream.cpp"
    "src/tests/unit_ecdh.cpp"
    "src/tests/unit_ecdsa.cpp"
    "src/tests/unit_tls.cpp"
    "src/tests/unit_tls_policy.cpp"
    "src/tests/unit_x509.cpp"

)

set_source_files_properties("src/lib/block/aes/aes_ni/aes_ni.cpp" PROPERTIES COMPILE_FLAGS "-maes -mpclmul -msse2 -mssse3")

set_source_files_properties("src/lib/block/aes/aes_vperm/aes_vperm.cpp" PROPERTIES COMPILE_FLAGS "-msse2 -mssse3")

set_source_files_properties("src/lib/block/idea/idea_sse2/idea_sse2.cpp" PROPERTIES COMPILE_FLAGS "-msse2")

set_source_files_properties("src/lib/block/noekeon/noekeon_simd/noekeon_simd.cpp" PROPERTIES COMPILE_FLAGS "-msse2")

set_source_files_properties("src/lib/block/serpent/serpent_avx2/serpent_avx2.cpp" PROPERTIES COMPILE_FLAGS "-mavx2")

set_source_files_properties("src/lib/block/serpent/serpent_simd/serpent_simd.cpp" PROPERTIES COMPILE_FLAGS "-msse2")

set_source_files_properties("src/lib/block/shacal2/shacal2_avx2/shacal2_avx2.cpp" PROPERTIES COMPILE_FLAGS "-mavx2")

set_source_files_properties("src/lib/block/shacal2/shacal2_simd/shacal2_simd.cpp" PROPERTIES COMPILE_FLAGS "-msse2")

set_source_files_properties("src/lib/block/shacal2/shacal2_x86/shacal2_x86.cpp" PROPERTIES COMPILE_FLAGS "-msha -msse2 -mssse3")

set_source_files_properties("src/lib/block/threefish_512/threefish_512_avx2/threefish_512_avx2.cpp" PROPERTIES COMPILE_FLAGS "-mavx2")

set_source_files_properties("src/lib/entropy/rdseed/rdseed.cpp" PROPERTIES COMPILE_FLAGS "-mrdseed -msse2")

set_source_files_properties("src/lib/hash/sha1/sha1_sse2/sha1_sse2.cpp" PROPERTIES COMPILE_FLAGS "-msse2")

set_source_files_properties("src/lib/hash/sha1/sha1_x86/sha1_x86.cpp" PROPERTIES COMPILE_FLAGS "-msha -msse2 -msse4.1 -mssse3")

set_source_files_properties("src/lib/hash/sha2_32/sha2_32_bmi2/sha2_32_bmi2.cpp" PROPERTIES COMPILE_FLAGS "-mbmi -mbmi2")

set_source_files_properties("src/lib/hash/sha2_32/sha2_32_x86/sha2_32_x86.cpp" PROPERTIES COMPILE_FLAGS "-msha -msse2 -msse4.1 -mssse3")

set_source_files_properties("src/lib/hash/sha2_64/sha2_64_bmi2/sha2_64_bmi2.cpp" PROPERTIES COMPILE_FLAGS "-mbmi -mbmi2")

set_source_files_properties("src/lib/hash/sha3/sha3_bmi2/sha3_bmi2.cpp" PROPERTIES COMPILE_FLAGS "-mbmi -mbmi2")

set_source_files_properties("src/lib/misc/zfec/zfec_sse2/zfec_sse2.cpp" PROPERTIES COMPILE_FLAGS "-msse2")

set_source_files_properties("src/lib/misc/zfec/zfec_vperm/zfec_vperm.cpp" PROPERTIES COMPILE_FLAGS "-msse2 -mssse3")

set_source_files_properties("src/lib/pbkdf/argon2/argon2_ssse3/argon2_ssse3.cpp" PROPERTIES COMPILE_FLAGS "-mssse3")

set_source_files_properties("src/lib/stream/chacha/chacha_avx2/chacha_avx2.cpp" PROPERTIES COMPILE_FLAGS "-mavx2")

set_source_files_properties("src/lib/stream/chacha/chacha_simd32/chacha_simd32.cpp" PROPERTIES COMPILE_FLAGS "-msse2")

set_source_files_properties("src/lib/utils/ghash/ghash_cpu/ghash_cpu.cpp" PROPERTIES COMPILE_FLAGS "-maes -mpclmul -msse2 -mssse3")

set_source_files_properties("src/lib/utils/ghash/ghash_vperm/ghash_vperm.cpp" PROPERTIES COMPILE_FLAGS "-msse2 -mssse3")

set_source_files_properties("src/tests/test_simd.cpp" PROPERTIES COMPILE_FLAGS "-msse2")



option(ENABLED_OPTIONAL_WARINIGS "If enabled more strict warning policy will be used" OFF)
option(ENABLED_LTO "If enabled link time optimization will be used" OFF)

set(COMPILER_FEATURES_RELEASE -std=c++17 -D_REENTRANT -O3 -fstack-protector -m64 -pthread -stdlib=libc++)
set(COMPILER_FEATURES_DEBUG -std=c++17 -D_REENTRANT -g -fstack-protector -m64 -pthread -stdlib=libc++)
set(COMPILER_FEATURES $<$<NOT:$<CONFIG:DEBUG>>:${COMPILER_FEATURES_RELEASE}>  $<$<CONFIG:DEBUG>:${COMPILER_FEATURES_DEBUG}>)
set(SHARED_FEATURES -fPIC -fvisibility=hidden)
set(STATIC_FEATURES -DBOTAN_DLL=)
set(COMPILER_WARNINGS -Wall -Wextra -Wpedantic -Wshadow -Wstrict-aliasing -Wstrict-overflow=5 -Wcast-align -Wmissing-declarations -Wpointer-arith -Wcast-qual -Wshorten-64-to-32 -Wcomma -Wdocumentation)
set(COMPILER_INCLUDE_DIRS build/include build/include/external)
if(ENABLED_LTO)
    set(COMPILER_FEATURES ${COMPILER_FEATURES} -lto)
endif()
if(ENABLED_OPTIONAL_WARINIGS)
    set(COMPILER_OPTIONAL_WARNINGS -Wsign-promo -Wctor-dtor-privacy -Wdeprecated -Winit-self -Wnon-virtual-dtor -Wunused-macros -Wold-style-cast -Wuninitialized)
endif()

add_library(${PROJECT_NAME} STATIC ${BOTAN_SOURCES})
target_link_libraries(${PROJECT_NAME} PUBLIC  dl "-framework CoreFoundation" "-framework Security")
target_compile_options(${PROJECT_NAME} PUBLIC ${COMPILER_WARNINGS} ${COMPILER_FEATURES} ${COMPILER_OPTIONAL_WARNINGS} PRIVATE ${STATIC_FEATURES})
target_include_directories(${PROJECT_NAME} PUBLIC ${COMPILER_INCLUDE_DIRS})

set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME}-static)

add_library(${PROJECT_NAME}_shared SHARED ${BOTAN_SOURCES})
target_link_libraries(${PROJECT_NAME}_shared PUBLIC  dl "-framework CoreFoundation" "-framework Security")
target_compile_options(${PROJECT_NAME}_shared PUBLIC ${COMPILER_WARNINGS} ${COMPILER_FEATURES} ${COMPILER_OPTIONAL_WARNINGS} PRIVATE ${SHARED_FEATURES})
target_include_directories(${PROJECT_NAME}_shared PUBLIC ${COMPILER_INCLUDE_DIRS})
set_target_properties(${PROJECT_NAME}_shared PROPERTIES OUTPUT_NAME ${PROJECT_NAME})

add_executable(${PROJECT_NAME}_cli ${BOTAN_CLI})
target_link_libraries(${PROJECT_NAME}_cli PRIVATE ${PROJECT_NAME}_shared  )
set_target_properties(${PROJECT_NAME}_cli PROPERTIES OUTPUT_NAME ${PROJECT_NAME}-cli)

add_executable(${PROJECT_NAME}_tests ${BOTAN_TESTS})
target_link_libraries(${PROJECT_NAME}_tests PRIVATE ${PROJECT_NAME}_shared  )
set_target_properties(${PROJECT_NAME}_tests PROPERTIES OUTPUT_NAME botan-test)

set(GLOBAL_CONFIGURATION_FILES configure.py .gitignore news.rst readme.rst)
file(GLOB_RECURSE CONFIGURATION_FILES src/configs/* )
file(GLOB_RECURSE DOCUMENTATION_FILES doc/* )
file(GLOB_RECURSE HEADER_FILES src/*.h )
file(GLOB_RECURSE INFO_FILES src/lib/*info.txt )
add_custom_target(CONFIGURATION_DUMMY SOURCES ${GLOBAL_CONFIGURATION_FILES} ${CONFIGURATION_FILES} ${DOCUMENTATION_FILES} ${INFO_FILES} ${HEADER_FILES})


Botan目录脑图

【Botan源码阅读】开篇词

参考资料

  • https://github.com/randombit/botan[2]

  • https://botan.randombit.net/[3]

  • https://en.wikipedia.org/wiki/ASN.1[4]

Reference

[1]

https://github.com/randombit/botan: https://github.com/randombit/botan

[2]

https://github.com/randombit/botan: https://github.com/randombit/botan

[3]

https://botan.randombit.net/: https://botan.randombit.net/

[4]

https://en.wikipedia.org/wiki/ASN.1: https://en.wikipedia.org/wiki/ASN.1


原文始发于微信公众号(Coder小Q):【Botan源码阅读】开篇词

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月29日14:30:57
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【Botan源码阅读】开篇词http://cn-sec.com/archives/1378786.html

发表评论

匿名网友 填写信息