Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How do you use this library? #4

Closed
Lagrang3 opened this issue Sep 12, 2020 · 9 comments
Closed

How do you use this library? #4

Lagrang3 opened this issue Sep 12, 2020 · 9 comments
Assignees
Labels
bug Something isn't working

Comments

@Lagrang3
Copy link

Hi @nemothenoone, I've just subscribed to boost mailing list. I am interested in c++ in general but I find cryptography particularly interesting. Thus I decided to have a look a your newly proposed library.

However I am stuck at the first step one would do, ie. try to run some examples.
The first code snippet described in the documentation does not compile.

I am using meson 0.54.2 build system, for the auto-config, compile and linking---it uses pkgconfig under the hood.

So this is the example:

#include <boost/crypto3/block/aes.hpp>
#include <boost/crypto3/block/algorithm/encrypt.hpp>

#include <string>
#include <cassert>

using namespace boost::crypto3;

int main()
{
    std::string input = 
        "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
        "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
        "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
        "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
        "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
        "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
        "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
        "\xad\x2b\x41\x7b\xe6\x6c\x37\x10";

    std::string key = 
        "\x2b\x7e\x15\x16\x28\xae\xd2\xa6"
        "\xab\xf7\x15\x88\x09\xcf\x4f\x3c";


    std::string out = encrypt<block::aes<128>>(input.begin(), input.end(), key);

    assert(out == "3ad77bb40d7a3660a89ecaf32466ef97f5d3d58503b9699de785895a96fdbaaf"
                  "43b1cd7f598ece23881b00e3ed0306887b0c785e27e8ad3f8223207104725dd4");
    return 0;
}

the compiler execution:

c++ -Iexample@exe -I. -I.. -I/opt/boost/1.73.0/include -I/opt/boost-crypto3/include -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wnon-virtual-dtor -g -maes -mpclmul -mssse3 -DCRYPTO3_HAS_RIJNDAEL_NI -maes -mpclmul -mssse3 -MD -MQ 'example@exe/example.cpp.o' -MF 'example@exe/example.cpp.o.d' -o 'example@exe/example.cpp.o' -c ../example.cpp

and the error messages:

In file included from /opt/boost-crypto3/include/boost/crypto3/detail/exploder.hpp:15,
                 from /opt/boost-crypto3/include/boost/crypto3/detail/pack.hpp:15,
                 from /opt/boost-crypto3/include/boost/crypto3/block/detail/block_stream_processor.hpp:17,
                 from /opt/boost-crypto3/include/boost/crypto3/block/rijndael.hpp:15,
                 from /opt/boost-crypto3/include/boost/crypto3/block/aes.hpp:12,
                 from ../example.cpp:1:
/opt/boost-crypto3/include/boost/crypto3/detail/reverser.hpp:54:2: error: #error "BOOST_ARCH_CURRENT_WORD_BITS not set"
 #error "BOOST_ARCH_CURRENT_WORD_BITS not set"
  ^~~~~
In file included from /opt/boost-crypto3/include/boost/crypto3/block/rijndael.hpp:15,
                 from /opt/boost-crypto3/include/boost/crypto3/block/aes.hpp:12,
                 from ../example.cpp:1:
/opt/boost-crypto3/include/boost/crypto3/block/detail/block_stream_processor.hpp:125: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
In file included from /opt/boost-crypto3/include/boost/crypto3/detail/basic_functions.hpp:15,
                 from /opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_functions.hpp:16,
                 from /opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_policy.hpp:12,
                 from /opt/boost-crypto3/include/boost/crypto3/block/rijndael.hpp:18,
                 from /opt/boost-crypto3/include/boost/crypto3/block/aes.hpp:12,
                 from ../example.cpp:1:
/opt/boost-crypto3/include/boost/crypto3/detail/make_uint_t.hpp:30: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
In file included from /opt/boost-crypto3/include/boost/crypto3/block/rijndael.hpp:19,
                 from /opt/boost-crypto3/include/boost/crypto3/block/aes.hpp:12,
                 from ../example.cpp:1:
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:44: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:54: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:64: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:67: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:71: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:76: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:88: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:90: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:92: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:109: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:111: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:137: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:158: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:180: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_impl.hpp:198: warning: ignoring #pragma clang loop [-Wunknown-pragmas]
 #pragma clang loop unroll(full)
 
In file included from /opt/boost-crypto3/include/boost/crypto3/block/rijndael.hpp:23,
                 from /opt/boost-crypto3/include/boost/crypto3/block/aes.hpp:12,
                 from ../example.cpp:1:
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:28:39: error: expected constructor, destructor, or type conversion before ‘(’ token
                 BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:37:39: error: expected constructor, destructor, or type conversion before ‘(’ token
                 BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:67:39: error: expected constructor, destructor, or type conversion before ‘(’ token
                 BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:93:44: error: expected identifier before string constant
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                            ^~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:93:44: error: expected ‘,’ or ‘...’ before string constant
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:93:55: error: ISO C++ forbids declaration of ‘BOOST_ATTRIBUTE_TARGET’ with no type [-fpermissive]
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:93:55: error: expected ‘;’ at end of member declaration
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
                                                        ;
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:134:44: error: expected identifier before string constant
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                            ^~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:134:44: error: expected ‘,’ or ‘...’ before string constant
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:134:55: error: ISO C++ forbids declaration of ‘BOOST_ATTRIBUTE_TARGET’ with no type [-fpermissive]
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:134:55: error: expected ‘;’ at end of member declaration
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
                                                        ;
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:134:21: error: ‘int boost::crypto3::block::detail::rijndael_ni_impl<128, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’ cannot be overloaded with ‘int boost::crypto3::block::detail::rijndael_ni_impl<128, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:93:21: note: previous declaration ‘int boost::crypto3::block::detail::rijndael_ni_impl<128, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:175:44: error: expected identifier before string constant
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                            ^~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:175:44: error: expected ‘,’ or ‘...’ before string constant
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:175:55: error: ISO C++ forbids declaration of ‘BOOST_ATTRIBUTE_TARGET’ with no type [-fpermissive]
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:175:55: error: expected ‘;’ at end of member declaration
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
                                                        ;
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:175:21: error: ‘int boost::crypto3::block::detail::rijndael_ni_impl<128, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’ cannot be overloaded with ‘int boost::crypto3::block::detail::rijndael_ni_impl<128, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:93:21: note: previous declaration ‘int boost::crypto3::block::detail::rijndael_ni_impl<128, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp: In static member function ‘static void boost::crypto3::block::detail::rijndael_ni_impl<128, 128, PolicyType>::schedule_key(const key_type&, boost::crypto3::block::detail::rijndael_ni_impl<128, 128, PolicyType>::key_schedule_type&, boost::crypto3::block::detail::rijndael_ni_impl<128, 128, PolicyType>::key_schedule_type&)’:
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:179:48: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
 #define AES_128_KEY_EXPANSION(K, RCON) detail::aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON))
                                                ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:182:44: note: in expansion of macro ‘AES_128_KEY_EXPANSION’
                         const __m128i K1 = AES_128_KEY_EXPANSION(K0, 0x01);
                                            ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:179:48: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
 #define AES_128_KEY_EXPANSION(K, RCON) detail::aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON))
                                                ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:183:44: note: in expansion of macro ‘AES_128_KEY_EXPANSION’
                         const __m128i K2 = AES_128_KEY_EXPANSION(K1, 0x02);
                                            ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:179:48: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
 #define AES_128_KEY_EXPANSION(K, RCON) detail::aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON))
                                                ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:184:44: note: in expansion of macro ‘AES_128_KEY_EXPANSION’
                         const __m128i K3 = AES_128_KEY_EXPANSION(K2, 0x04);
                                            ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:179:48: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
 #define AES_128_KEY_EXPANSION(K, RCON) detail::aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON))
                                                ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:185:44: note: in expansion of macro ‘AES_128_KEY_EXPANSION’
                         const __m128i K4 = AES_128_KEY_EXPANSION(K3, 0x08);
                                            ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:179:48: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
 #define AES_128_KEY_EXPANSION(K, RCON) detail::aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON))
                                                ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:186:44: note: in expansion of macro ‘AES_128_KEY_EXPANSION’
                         const __m128i K5 = AES_128_KEY_EXPANSION(K4, 0x10);
                                            ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:179:48: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
 #define AES_128_KEY_EXPANSION(K, RCON) detail::aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON))
                                                ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:187:44: note: in expansion of macro ‘AES_128_KEY_EXPANSION’
                         const __m128i K6 = AES_128_KEY_EXPANSION(K5, 0x20);
                                            ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:179:48: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
 #define AES_128_KEY_EXPANSION(K, RCON) detail::aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON))
                                                ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:188:44: note: in expansion of macro ‘AES_128_KEY_EXPANSION’
                         const __m128i K7 = AES_128_KEY_EXPANSION(K6, 0x40);
                                            ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:179:48: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
 #define AES_128_KEY_EXPANSION(K, RCON) detail::aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON))
                                                ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:189:44: note: in expansion of macro ‘AES_128_KEY_EXPANSION’
                         const __m128i K8 = AES_128_KEY_EXPANSION(K7, 0x80);
                                            ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:179:48: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
 #define AES_128_KEY_EXPANSION(K, RCON) detail::aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON))
                                                ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:190:44: note: in expansion of macro ‘AES_128_KEY_EXPANSION’
                         const __m128i K9 = AES_128_KEY_EXPANSION(K8, 0x1B);
                                            ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:179:48: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
 #define AES_128_KEY_EXPANSION(K, RCON) detail::aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON))
                                                ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:191:45: note: in expansion of macro ‘AES_128_KEY_EXPANSION’
                         const __m128i K10 = AES_128_KEY_EXPANSION(K9, 0x36);
                                             ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp: At global scope:
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:236:44: error: expected identifier before string constant
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                            ^~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:236:44: error: expected ‘,’ or ‘...’ before string constant
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:236:55: error: ISO C++ forbids declaration of ‘BOOST_ATTRIBUTE_TARGET’ with no type [-fpermissive]
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:236:55: error: expected ‘;’ at end of member declaration
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
                                                        ;
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:281:44: error: expected identifier before string constant
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                            ^~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:281:44: error: expected ‘,’ or ‘...’ before string constant
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:281:55: error: ISO C++ forbids declaration of ‘BOOST_ATTRIBUTE_TARGET’ with no type [-fpermissive]
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:281:55: error: expected ‘;’ at end of member declaration
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
                                                        ;
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:281:21: error: ‘int boost::crypto3::block::detail::rijndael_ni_impl<192, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’ cannot be overloaded with ‘int boost::crypto3::block::detail::rijndael_ni_impl<192, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:236:21: note: previous declaration ‘int boost::crypto3::block::detail::rijndael_ni_impl<192, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:355:44: error: expected identifier before string constant
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                            ^~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:355:44: error: expected ‘,’ or ‘...’ before string constant
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:355:55: error: ISO C++ forbids declaration of ‘BOOST_ATTRIBUTE_TARGET’ with no type [-fpermissive]
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:355:55: error: expected ‘;’ at end of member declaration
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
                                                        ;
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:355:21: error: ‘int boost::crypto3::block::detail::rijndael_ni_impl<192, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’ cannot be overloaded with ‘int boost::crypto3::block::detail::rijndael_ni_impl<192, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:236:21: note: previous declaration ‘int boost::crypto3::block::detail::rijndael_ni_impl<192, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp: In static member function ‘static void boost::crypto3::block::detail::rijndael_ni_impl<192, 128, PolicyType>::schedule_key(const key_type&, boost::crypto3::block::detail::rijndael_ni_impl<192, 128, PolicyType>::key_schedule_type&, boost::crypto3::block::detail::rijndael_ni_impl<192, 128, PolicyType>::key_schedule_type&)’:
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:366:13: error: ‘aes_192_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
     detail::aes_192_key_expansion(&K0, &K1, _mm_aeskeygenassist_si128(K1, RCON), &encryption_key[EK_OFF], EK_OFF == 48)
             ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:368:25: note: in expansion of macro ‘AES_192_KEY_EXPANSION’
                         AES_192_KEY_EXPANSION(0x01, 6);
                         ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:366:13: error: ‘aes_192_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
     detail::aes_192_key_expansion(&K0, &K1, _mm_aeskeygenassist_si128(K1, RCON), &encryption_key[EK_OFF], EK_OFF == 48)
             ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:369:25: note: in expansion of macro ‘AES_192_KEY_EXPANSION’
                         AES_192_KEY_EXPANSION(0x02, 12);
                         ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:366:13: error: ‘aes_192_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
     detail::aes_192_key_expansion(&K0, &K1, _mm_aeskeygenassist_si128(K1, RCON), &encryption_key[EK_OFF], EK_OFF == 48)
             ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:370:25: note: in expansion of macro ‘AES_192_KEY_EXPANSION’
                         AES_192_KEY_EXPANSION(0x04, 18);
                         ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:366:13: error: ‘aes_192_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
     detail::aes_192_key_expansion(&K0, &K1, _mm_aeskeygenassist_si128(K1, RCON), &encryption_key[EK_OFF], EK_OFF == 48)
             ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:371:25: note: in expansion of macro ‘AES_192_KEY_EXPANSION’
                         AES_192_KEY_EXPANSION(0x08, 24);
                         ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:366:13: error: ‘aes_192_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
     detail::aes_192_key_expansion(&K0, &K1, _mm_aeskeygenassist_si128(K1, RCON), &encryption_key[EK_OFF], EK_OFF == 48)
             ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:372:25: note: in expansion of macro ‘AES_192_KEY_EXPANSION’
                         AES_192_KEY_EXPANSION(0x10, 30);
                         ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:366:13: error: ‘aes_192_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
     detail::aes_192_key_expansion(&K0, &K1, _mm_aeskeygenassist_si128(K1, RCON), &encryption_key[EK_OFF], EK_OFF == 48)
             ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:373:25: note: in expansion of macro ‘AES_192_KEY_EXPANSION’
                         AES_192_KEY_EXPANSION(0x20, 36);
                         ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:366:13: error: ‘aes_192_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
     detail::aes_192_key_expansion(&K0, &K1, _mm_aeskeygenassist_si128(K1, RCON), &encryption_key[EK_OFF], EK_OFF == 48)
             ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:374:25: note: in expansion of macro ‘AES_192_KEY_EXPANSION’
                         AES_192_KEY_EXPANSION(0x40, 42);
                         ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:366:13: error: ‘aes_192_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
     detail::aes_192_key_expansion(&K0, &K1, _mm_aeskeygenassist_si128(K1, RCON), &encryption_key[EK_OFF], EK_OFF == 48)
             ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:375:25: note: in expansion of macro ‘AES_192_KEY_EXPANSION’
                         AES_192_KEY_EXPANSION(0x80, 48);
                         ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp: At global scope:
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:410:44: error: expected identifier before string constant
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                            ^~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:410:44: error: expected ‘,’ or ‘...’ before string constant
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:410:55: error: ISO C++ forbids declaration of ‘BOOST_ATTRIBUTE_TARGET’ with no type [-fpermissive]
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:410:55: error: expected ‘;’ at end of member declaration
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
                                                        ;
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:459:44: error: expected identifier before string constant
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                            ^~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:459:44: error: expected ‘,’ or ‘...’ before string constant
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:459:55: error: ISO C++ forbids declaration of ‘BOOST_ATTRIBUTE_TARGET’ with no type [-fpermissive]
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:459:55: error: expected ‘;’ at end of member declaration
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
                                                        ;
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:459:21: error: ‘int boost::crypto3::block::detail::rijndael_ni_impl<256, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’ cannot be overloaded with ‘int boost::crypto3::block::detail::rijndael_ni_impl<256, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:410:21: note: previous declaration ‘int boost::crypto3::block::detail::rijndael_ni_impl<256, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:508:44: error: expected identifier before string constant
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                            ^~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:508:44: error: expected ‘,’ or ‘...’ before string constant
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:508:55: error: ISO C++ forbids declaration of ‘BOOST_ATTRIBUTE_TARGET’ with no type [-fpermissive]
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:508:55: error: expected ‘;’ at end of member declaration
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                                                       ^
                                                        ;
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:508:21: error: ‘int boost::crypto3::block::detail::rijndael_ni_impl<256, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’ cannot be overloaded with ‘int boost::crypto3::block::detail::rijndael_ni_impl<256, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:410:21: note: previous declaration ‘int boost::crypto3::block::detail::rijndael_ni_impl<256, 128, PolicyType>::BOOST_ATTRIBUTE_TARGET(int)’
                     BOOST_ATTRIBUTE_TARGET("ssse3,aes")
                     ^~~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp: In static member function ‘static void boost::crypto3::block::detail::rijndael_ni_impl<256, 128, PolicyType>::schedule_key(const key_type&, boost::crypto3::block::detail::rijndael_ni_impl<256, 128, PolicyType>::key_schedule_type&, boost::crypto3::block::detail::rijndael_ni_impl<256, 128, PolicyType>::key_schedule_type&)’:
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:515:52: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K2 = detail::aes_128_key_expansion(K0, _mm_aeskeygenassist_si128(K1, 0x01));
                                                    ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:516:52: error: ‘aes_256_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K3 = detail::aes_256_key_expansion(K1, K2);
                                                    ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:518:52: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K4 = detail::aes_128_key_expansion(K2, _mm_aeskeygenassist_si128(K3, 0x02));
                                                    ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:519:52: error: ‘aes_256_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K5 = detail::aes_256_key_expansion(K3, K4);
                                                    ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:521:52: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K6 = detail::aes_128_key_expansion(K4, _mm_aeskeygenassist_si128(K5, 0x04));
                                                    ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:522:52: error: ‘aes_256_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K7 = detail::aes_256_key_expansion(K5, K6);
                                                    ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:524:52: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K8 = detail::aes_128_key_expansion(K6, _mm_aeskeygenassist_si128(K7, 0x08));
                                                    ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:525:52: error: ‘aes_256_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K9 = detail::aes_256_key_expansion(K7, K8);
                                                    ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:527:53: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K10 = detail::aes_128_key_expansion(K8, _mm_aeskeygenassist_si128(K9, 0x10));
                                                     ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:528:53: error: ‘aes_256_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K11 = detail::aes_256_key_expansion(K9, K10);
                                                     ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:530:53: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K12 = detail::aes_128_key_expansion(K10, _mm_aeskeygenassist_si128(K11, 0x20));
                                                     ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:531:53: error: ‘aes_256_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K13 = detail::aes_256_key_expansion(K11, K12);
                                                     ^~~~~~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/rijndael/rijndael_ni_impl.hpp:533:53: error: ‘aes_128_key_expansion’ is not a member of ‘boost::crypto3::block::detail’
                         const __m128i K14 = detail::aes_128_key_expansion(K12, _mm_aeskeygenassist_si128(K13, 0x40));
                                                     ^~~~~~~~~~~~~~~~~~~~~
In file included from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp: In instantiation of ‘OutputRange& boost::crypto3::encrypt(const SinglePassRange&, const KeyPassRange&, OutputRange&) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; KeyPassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; OutputRange = std::__cxx11::basic_string<char>]’:
../example.cpp:26:79:   required from here
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:275:20: error: no matching function for call to ‘boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int> > >::range_cipher_impl(const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >&, std::remove_reference<std::__cxx11::basic_string<char>&>::type, CipherAccumulator)’
             return EncrypterImpl(
                    ^~~~~~~~~~~~~~
                 rng, std::move(out),
                 ~~~~~~~~~~~~~~~~~~~~
                 CipherAccumulator(EncryptionMode(BlockCipher(block::detail::key_value<BlockCipher>(key)))));
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:17,
                 from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:90:21: note: candidate: ‘template<class InputIterator> boost::crypto3::block::detail::range_cipher_impl<CipherStateImpl>::range_cipher_impl(InputIterator, InputIterator, const accumulator_set_type&)’
                     range_cipher_impl(InputIterator first, InputIterator last, const accumulator_set_type &ise) :
                     ^~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:90:21: note:   template argument deduction/substitution failed:
In file included from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:275:20: note:   deduced conflicting types for parameter ‘InputIterator’ (‘__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’ and ‘std::__cxx11::basic_string<char>’)
             return EncrypterImpl(
                    ^~~~~~~~~~~~~~
                 rng, std::move(out),
                 ~~~~~~~~~~~~~~~~~~~~
                 CipherAccumulator(EncryptionMode(BlockCipher(block::detail::key_value<BlockCipher>(key)))));
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:17,
                 from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:74:21: note: candidate: ‘template<class SinglePassRange> boost::crypto3::block::detail::range_cipher_impl<CipherStateImpl>::range_cipher_impl(const SinglePassRange&, const accumulator_set_type&)’
                     range_cipher_impl(const SinglePassRange &range, const accumulator_set_type &ise) :
                     ^~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:74:21: note:   template argument deduction/substitution failed:
In file included from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:275:20: note:   candidate expects 2 arguments, 3 provided
             return EncrypterImpl(
                    ^~~~~~~~~~~~~~
                 rng, std::move(out),
                 ~~~~~~~~~~~~~~~~~~~~
                 CipherAccumulator(EncryptionMode(BlockCipher(block::detail::key_value<BlockCipher>(key)))));
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:17,
                 from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:61:24: note: candidate: ‘constexpr boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int> > >::range_cipher_impl(const boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int> > >&)’
                 struct range_cipher_impl : public CipherStateImpl {
                        ^~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:61:24: note:   candidate expects 1 argument, 3 provided
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:61:24: note: candidate: ‘constexpr boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int> > >::range_cipher_impl(boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int> > >&&)’
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:61:24: note:   candidate expects 1 argument, 3 provided
In file included from /opt/boost/1.73.0/include/boost/range/size_type.hpp:20,
                 from /opt/boost/1.73.0/include/boost/range/adaptor/sliced.hpp:15,
                 from /opt/boost-crypto3/include/boost/crypto3/block/rijndael.hpp:13,
                 from /opt/boost-crypto3/include/boost/crypto3/block/aes.hpp:12,
                 from ../example.cpp:1:
/opt/boost/1.73.0/include/boost/range/concepts.hpp: In instantiation of ‘struct boost::SinglePassRangeConcept<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> > >’:
/opt/boost/1.73.0/include/boost/concept/detail/has_constraints.hpp:32:62:   required by substitution of ‘template<class Model> boost::concepts::detail::yes boost::concepts::detail::has_constraints_(Model*, boost::concepts::detail::wrap_constraints<Model, (& Model::constraints)>*) [with Model = boost::SinglePassRangeConcept<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> > >]’
/opt/boost/1.73.0/include/boost/concept/detail/has_constraints.hpp:42:5:   required from ‘const bool boost::concepts::not_satisfied<boost::SinglePassRangeConcept<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> > > >::value’
/opt/boost/1.73.0/include/boost/concept/detail/has_constraints.hpp:45:51:   required from ‘struct boost::concepts::not_satisfied<boost::SinglePassRangeConcept<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> > > >’
/opt/boost/1.73.0/include/boost/concept/detail/general.hpp:51:8:   required from ‘struct boost::concepts::requirement_<void (*)(boost::SinglePassRangeConcept<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> > >)>’
/opt/boost/1.73.0/include/boost/range/algorithm/equal.hpp:175:13:   required from ‘typename Cipher::key_type boost::crypto3::block::detail::key_value(const SinglePassRange&) [with Cipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; typename Cipher::key_type = std::array<unsigned char, 16>]’
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:277:99:   required from ‘OutputRange& boost::crypto3::encrypt(const SinglePassRange&, const KeyPassRange&, OutputRange&) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; KeyPassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; OutputRange = std::__cxx11::basic_string<char>]’
../example.cpp:26:79:   required from here
/opt/boost/1.73.0/include/boost/range/concepts.hpp:274:17: error: no type named ‘type’ in ‘struct boost::range_iterator<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >, void>’
         >::type const_iterator;
                 ^~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/range/concepts.hpp:276:66: error: no type named ‘type’ in ‘struct boost::range_iterator<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >, void>’
         typedef BOOST_DEDUCED_TYPENAME range_iterator<Rng>::type iterator;
                                                                  ^~~~~~~~
In file included from /opt/boost/1.73.0/include/boost/concept/assert.hpp:35,
                 from /opt/boost/1.73.0/include/boost/concept_check.hpp:20,
                 from /opt/boost/1.73.0/include/boost/range/concepts.hpp:19,
                 from /opt/boost/1.73.0/include/boost/range/size_type.hpp:20,
                 from /opt/boost/1.73.0/include/boost/range/adaptor/sliced.hpp:15,
                 from /opt/boost-crypto3/include/boost/crypto3/block/rijndael.hpp:13,
                 from /opt/boost-crypto3/include/boost/crypto3/block/aes.hpp:12,
                 from ../example.cpp:1:
/opt/boost/1.73.0/include/boost/concept/detail/general.hpp:71:5: error: no type named ‘type’ in ‘struct boost::range_iterator<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >, void>’
     &::boost::concepts::requirement_<ModelFnPtr>::failed>    \
     ^
/opt/boost/1.73.0/include/boost/concept/assert.hpp:43:5: note: in expansion of macro ‘BOOST_CONCEPT_ASSERT_FN’
     BOOST_CONCEPT_ASSERT_FN(void(*)ModelInParens)
     ^~~~~~~~~~~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/range/concepts.hpp:104:45: note: in expansion of macro ‘BOOST_CONCEPT_ASSERT’
     #define BOOST_RANGE_CONCEPT_ASSERT( x ) BOOST_CONCEPT_ASSERT( x )
                                             ^~~~~~~~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/range/concepts.hpp:278:9: note: in expansion of macro ‘BOOST_RANGE_CONCEPT_ASSERT’
         BOOST_RANGE_CONCEPT_ASSERT((
         ^~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/concept/detail/general.hpp:71:5: error: no type named ‘type’ in ‘struct boost::range_iterator<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >, void>’
     &::boost::concepts::requirement_<ModelFnPtr>::failed>    \
     ^
/opt/boost/1.73.0/include/boost/concept/assert.hpp:43:5: note: in expansion of macro ‘BOOST_CONCEPT_ASSERT_FN’
     BOOST_CONCEPT_ASSERT_FN(void(*)ModelInParens)
     ^~~~~~~~~~~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/range/concepts.hpp:104:45: note: in expansion of macro ‘BOOST_CONCEPT_ASSERT’
     #define BOOST_RANGE_CONCEPT_ASSERT( x ) BOOST_CONCEPT_ASSERT( x )
                                             ^~~~~~~~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/range/concepts.hpp:281:9: note: in expansion of macro ‘BOOST_RANGE_CONCEPT_ASSERT’
         BOOST_RANGE_CONCEPT_ASSERT((
         ^~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:21,
                 from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/detail/key_value.hpp: In instantiation of ‘typename Cipher::key_type boost::crypto3::block::detail::key_value(const SinglePassRange&) [with Cipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; typename Cipher::key_type = std::array<unsigned char, 16>]’:
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:277:99:   required from ‘OutputRange& boost::crypto3::encrypt(const SinglePassRange&, const KeyPassRange&, OutputRange&) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; KeyPassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; OutputRange = std::__cxx11::basic_string<char>]’
../example.cpp:26:79:   required from here
/opt/boost-crypto3/include/boost/crypto3/block/detail/key_value.hpp:36:107: error: no type named ‘iterator’ in ‘class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’
                     typedef typename std::iterator_traits<typename SinglePassRange::iterator>::value_type value_type;
                                                                                                           ^~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/key_value.hpp:50:31: error: no type named ‘iterator’ in ‘class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’
                     return key;
                               ^
/opt/boost-crypto3/include/boost/crypto3/block/detail/key_value.hpp:40:65: error: no type named ‘iterator’ in ‘class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’
                         std::numeric_limits<value_type>::digits + std::numeric_limits<value_type>::is_signed;
                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/key_value.hpp:40:65: error: no type named ‘iterator’ in ‘class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’
/opt/boost-crypto3/include/boost/crypto3/block/detail/key_value.hpp:47:100: error: ‘const class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’ has no member named ‘begin’
                     boost::crypto3::detail::pack_to<endian_type, value_bits, key_value_bits>(range.begin(), range.end(),
                                                                                              ~~~~~~^~~~~
/opt/boost-crypto3/include/boost/crypto3/block/detail/key_value.hpp:47:115: error: ‘const class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’ has no member named ‘end’
                     boost::crypto3::detail::pack_to<endian_type, value_bits, key_value_bits>(range.begin(), range.end(),
                                                                                                             ~~~~~~^~~

Am I missing some trivial step, or is it that this is still work in progress?

Best regards,
Eduardo

@nemothenoone
Copy link
Member

Hello, @Lagrang3!

Looks like this particular issue you've faced with is connected to additional definitions (e.g. BOOST_ARCH_CURRENT_WORD_BITS) we've introduced (and made pull requests to original repos with) to Boost.Predef and Boost.Config. In here: boostorg/predef#108, boostorg/predef#107, boostorg/config#339, boostorg/config#338. But for now they does not seem to be merged pretty soon, so I've updated the library to be more independent of them. Latest master branch revision should be fine to compile and work with.

@Lagrang3
Copy link
Author

Lagrang3 commented Sep 13, 2020

@nemothenoone, now it works.
But the input std::string key has to be const, otherwise the compiler is not able to decide among template candidates:

../example.cpp: In function ‘int main()’:
../example.cpp:26:79: error: call of overloaded ‘encrypt<boost::crypto3::block::aes<128> >(std::__cxx11::basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, std::__cxx11::string&)’ is ambiguous
     std::string out = encrypt<block::aes<128>>(input.begin(), input.end(), key);
                                                                               ^
In file included from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:236:13: note: candidate: ‘boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<CipherAccumulator> > boost::crypto3::encrypt(InputIterator, InputIterator, const KeySinglePassRange&) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; InputIterator = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; KeySinglePassRange = std::__cxx11::basic_string<char>; CipherAccumulator = boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int>]’
             encrypt(InputIterator first, InputIterator last, const KeySinglePassRange &key) {
             ^~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:265:13: note: candidate: ‘boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<CipherAccumulator> > boost::crypto3::encrypt(InputIterator, InputIterator, const boost::crypto3::block::cipher_key<BlockCipher>&) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; InputIterator = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; CipherAccumulator = boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int>]’
             encrypt(InputIterator first, InputIterator last, const block::cipher_key<BlockCipher> &key) {
             ^~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:293:24: note: candidate: ‘OutputIterator boost::crypto3::encrypt(const SinglePassRange&, const KeySinglePassRange&, OutputIterator) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; KeySinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; OutputIterator = std::__cxx11::basic_string<char>]’
         OutputIterator encrypt(const SinglePassRange &rng, const KeySinglePassRange &key, OutputIterator out) {
                        ^~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:322:24: note: candidate: ‘OutputIterator boost::crypto3::encrypt(const SinglePassRange&, const boost::crypto3::block::cipher_key<BlockCipher>&, OutputIterator) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; OutputIterator = std::__cxx11::basic_string<char>]’
         OutputIterator encrypt(const SinglePassRange &rng, const block::cipher_key<BlockCipher> &key,
                        ^~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:350:22: note: candidate: ‘OutputRange& boost::crypto3::encrypt(const SinglePassRange&, const KeySinglePassRange&, OutputRange&) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; KeySinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; OutputRange = std::__cxx11::basic_string<char>]’
         OutputRange &encrypt(const SinglePassRange &rng, const KeySinglePassRange &key, OutputRange &out) {
                      ^~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:378:22: note: candidate: ‘OutputRange& boost::crypto3::encrypt(const SinglePassRange&, const boost::crypto3::block::cipher_key<BlockCipher>&, OutputRange&) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; OutputRange = std::__cxx11::basic_string<char>]’
         OutputRange &encrypt(const SinglePassRange &rng, const block::cipher_key<BlockCipher> &key, OutputRange &out) {
                      ^~~~~~~

@nemothenoone
Copy link
Member

nemothenoone commented Sep 13, 2020

@Lagrang3 Yep. It is not supposed to be like that. Since the deduction fails to choose among functions with cipher_key and various template container as a key, I think making cipher_key initialization explicit would fix such a failure: 84d6452.

@nemothenoone nemothenoone self-assigned this Sep 13, 2020
@nemothenoone nemothenoone added the bug Something isn't working label Sep 13, 2020
@nemothenoone
Copy link
Member

So, I think, I can close this.

@Lagrang3
Copy link
Author

@nemothenoone Does the example work for you?
I am still getting compiler errors if the key is not const:

In file included from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp: In instantiation of ‘OutputRange& boost::crypto3::encrypt(const SinglePassRange&, const KeySinglePassRange&, OutputRange&) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; KeySinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; OutputRange = std::__cxx11::basic_string<char>]’:
../example.cpp:26:79:   required from here
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:359:20: error: no matching function for call to ‘boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int> > >::range_cipher_impl(const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >&, std::remove_reference<std::__cxx11::basic_string<char>&>::type, CipherAccumulator)’
             return EncrypterImpl(
                    ^~~~~~~~~~~~~~
                 rng, std::move(out),
                 ~~~~~~~~~~~~~~~~~~~~
                 CipherAccumulator(EncryptionMode(BlockCipher(block::cipher_key<BlockCipher>(key).key))));
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:17,
                 from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:90:21: note: candidate: ‘template<class InputIterator> boost::crypto3::block::detail::range_cipher_impl<CipherStateImpl>::range_cipher_impl(InputIterator, InputIterator, const accumulator_set_type&)’
                     range_cipher_impl(InputIterator first, InputIterator last, const accumulator_set_type &ise) :
                     ^~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:90:21: note:   template argument deduction/substitution failed:
In file included from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:359:20: note:   deduced conflicting types for parameter ‘InputIterator’ (‘__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’ and ‘std::__cxx11::basic_string<char>’)
             return EncrypterImpl(
                    ^~~~~~~~~~~~~~
                 rng, std::move(out),
                 ~~~~~~~~~~~~~~~~~~~~
                 CipherAccumulator(EncryptionMode(BlockCipher(block::cipher_key<BlockCipher>(key).key))));
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:17,
                 from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:74:21: note: candidate: ‘template<class SinglePassRange> boost::crypto3::block::detail::range_cipher_impl<CipherStateImpl>::range_cipher_impl(const SinglePassRange&, const accumulator_set_type&)’
                     range_cipher_impl(const SinglePassRange &range, const accumulator_set_type &ise) :
                     ^~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:74:21: note:   template argument deduction/substitution failed:
In file included from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:359:20: note:   candidate expects 2 arguments, 3 provided
             return EncrypterImpl(
                    ^~~~~~~~~~~~~~
                 rng, std::move(out),
                 ~~~~~~~~~~~~~~~~~~~~
                 CipherAccumulator(EncryptionMode(BlockCipher(block::cipher_key<BlockCipher>(key).key))));
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:17,
                 from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:61:24: note: candidate: ‘constexpr boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int> > >::range_cipher_impl(const boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int> > >&)’
                 struct range_cipher_impl : public CipherStateImpl {
                        ^~~~~~~~~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:61:24: note:   candidate expects 1 argument, 3 provided
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:61:24: note: candidate: ‘constexpr boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int> > >::range_cipher_impl(boost::crypto3::block::detail::range_cipher_impl<boost::crypto3::block::detail::value_cipher_impl<boost::accumulators::accumulator_set<boost::crypto3::digest<128>, boost::accumulators::features<boost::crypto3::accumulators::tag::block<boost::crypto3::block::detail::isomorphic<boost::crypto3::block::detail::isomorphic_encryption_policy<boost::crypto3::block::rijndael<128, 128>, boost::crypto3::block::nop_padding<boost::crypto3::block::rijndael<128, 128> > > > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, long unsigned int> > >&&)’
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:61:24: note:   candidate expects 1 argument, 3 provided
In file included from /opt/boost/1.73.0/include/boost/range/size_type.hpp:20,
                 from /opt/boost/1.73.0/include/boost/range/adaptor/sliced.hpp:15,
                 from /opt/boost-crypto3/include/boost/crypto3/block/rijndael.hpp:13,
                 from /opt/boost-crypto3/include/boost/crypto3/block/aes.hpp:12,
                 from ../example.cpp:1:
/opt/boost/1.73.0/include/boost/range/concepts.hpp: In instantiation of ‘struct boost::SinglePassRangeConcept<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> > >’:
/opt/boost/1.73.0/include/boost/concept/detail/has_constraints.hpp:32:62:   required by substitution of ‘template<class Model> boost::concepts::detail::yes boost::concepts::detail::has_constraints_(Model*, boost::concepts::detail::wrap_constraints<Model, (& Model::constraints)>*) [with Model = boost::SinglePassRangeConcept<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> > >]’
/opt/boost/1.73.0/include/boost/concept/detail/has_constraints.hpp:42:5:   required from ‘const bool boost::concepts::not_satisfied<boost::SinglePassRangeConcept<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> > > >::value’
/opt/boost/1.73.0/include/boost/concept/detail/has_constraints.hpp:45:51:   required from ‘struct boost::concepts::not_satisfied<boost::SinglePassRangeConcept<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> > > >’
/opt/boost/1.73.0/include/boost/concept/detail/general.hpp:51:8:   required from ‘struct boost::concepts::requirement_<void (*)(boost::SinglePassRangeConcept<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> > >)>’
/opt/boost-crypto3/include/boost/crypto3/block/cipher_value.hpp:76:25:   required from ‘boost::crypto3::block::cipher_key<BlockCipher>::cipher_key(const SinglePassRange&) [with SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; BlockCipher = boost::crypto3::block::rijndael<128, 128>]’
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:361:69:   required from ‘OutputRange& boost::crypto3::encrypt(const SinglePassRange&, const KeySinglePassRange&, OutputRange&) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; KeySinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; OutputRange = std::__cxx11::basic_string<char>]’
../example.cpp:26:79:   required from here
/opt/boost/1.73.0/include/boost/range/concepts.hpp:274:17: error: no type named ‘type’ in ‘struct boost::range_iterator<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >, void>’
         >::type const_iterator;
                 ^~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/range/concepts.hpp:276:66: error: no type named ‘type’ in ‘struct boost::range_iterator<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >, void>’
         typedef BOOST_DEDUCED_TYPENAME range_iterator<Rng>::type iterator;
                                                                  ^~~~~~~~
In file included from /opt/boost/1.73.0/include/boost/concept/assert.hpp:35,
                 from /opt/boost/1.73.0/include/boost/concept_check.hpp:20,
                 from /opt/boost/1.73.0/include/boost/range/concepts.hpp:19,
                 from /opt/boost/1.73.0/include/boost/range/size_type.hpp:20,
                 from /opt/boost/1.73.0/include/boost/range/adaptor/sliced.hpp:15,
                 from /opt/boost-crypto3/include/boost/crypto3/block/rijndael.hpp:13,
                 from /opt/boost-crypto3/include/boost/crypto3/block/aes.hpp:12,
                 from ../example.cpp:1:
/opt/boost/1.73.0/include/boost/concept/detail/general.hpp:71:5: error: no type named ‘type’ in ‘struct boost::range_iterator<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >, void>’
     &::boost::concepts::requirement_<ModelFnPtr>::failed>    \
     ^
/opt/boost/1.73.0/include/boost/concept/assert.hpp:43:5: note: in expansion of macro ‘BOOST_CONCEPT_ASSERT_FN’
     BOOST_CONCEPT_ASSERT_FN(void(*)ModelInParens)
     ^~~~~~~~~~~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/range/concepts.hpp:104:45: note: in expansion of macro ‘BOOST_CONCEPT_ASSERT’
     #define BOOST_RANGE_CONCEPT_ASSERT( x ) BOOST_CONCEPT_ASSERT( x )
                                             ^~~~~~~~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/range/concepts.hpp:278:9: note: in expansion of macro ‘BOOST_RANGE_CONCEPT_ASSERT’
         BOOST_RANGE_CONCEPT_ASSERT((
         ^~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/concept/detail/general.hpp:71:5: error: no type named ‘type’ in ‘struct boost::range_iterator<const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >, void>’
     &::boost::concepts::requirement_<ModelFnPtr>::failed>    \
     ^
/opt/boost/1.73.0/include/boost/concept/assert.hpp:43:5: note: in expansion of macro ‘BOOST_CONCEPT_ASSERT_FN’
     BOOST_CONCEPT_ASSERT_FN(void(*)ModelInParens)
     ^~~~~~~~~~~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/range/concepts.hpp:104:45: note: in expansion of macro ‘BOOST_CONCEPT_ASSERT’
     #define BOOST_RANGE_CONCEPT_ASSERT( x ) BOOST_CONCEPT_ASSERT( x )
                                             ^~~~~~~~~~~~~~~~~~~~
/opt/boost/1.73.0/include/boost/range/concepts.hpp:281:9: note: in expansion of macro ‘BOOST_RANGE_CONCEPT_ASSERT’
         BOOST_RANGE_CONCEPT_ASSERT((
         ^~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:19,
                 from ../example.cpp:2:
/opt/boost-crypto3/include/boost/crypto3/block/cipher_key.hpp: In instantiation of ‘boost::crypto3::block::cipher_key<BlockCipher>::cipher_key(const SinglePassRange&) [with SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; BlockCipher = boost::crypto3::block::rijndael<128, 128>]’:
/opt/boost-crypto3/include/boost/crypto3/block/algorithm/encrypt.hpp:361:69:   required from ‘OutputRange& boost::crypto3::encrypt(const SinglePassRange&, const KeySinglePassRange&, OutputRange&) [with BlockCipher = boost::crypto3::block::rijndael<128, 128>; SinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; KeySinglePassRange = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; OutputRange = std::__cxx11::basic_string<char>]’
../example.cpp:26:79:   required from here
/opt/boost-crypto3/include/boost/crypto3/block/cipher_key.hpp:37:107: error: no type named ‘iterator’ in ‘class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’
                     typedef typename std::iterator_traits<typename SinglePassRange::iterator>::value_type value_type;
                                                                                                           ^~~~~~~~~~
/opt/boost-crypto3/include/boost/crypto3/block/cipher_key.hpp:44:102: error: no type named ‘iterator’ in ‘class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’
                     pack_to<endian_type, value_bits, key_value_bits>(r.begin(), r.end(), key.begin());
                                                                                                      ^
/opt/boost-crypto3/include/boost/crypto3/block/cipher_key.hpp:42:65: error: no type named ‘iterator’ in ‘class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’
                         std::numeric_limits<value_type>::digits + std::numeric_limits<value_type>::is_signed;
                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
/opt/boost-crypto3/include/boost/crypto3/block/cipher_key.hpp:42:65: error: no type named ‘iterator’ in ‘class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’
/opt/boost-crypto3/include/boost/crypto3/block/cipher_key.hpp:44:72: error: ‘const class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’ has no member named ‘begin’
                     pack_to<endian_type, value_bits, key_value_bits>(r.begin(), r.end(), key.begin());
                                                                      ~~^~~~~
/opt/boost-crypto3/include/boost/crypto3/block/cipher_key.hpp:44:83: error: ‘const class __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’ has no member named ‘end’
                     pack_to<endian_type, value_bits, key_value_bits>(r.begin(), r.end(), key.begin());

@nemothenoone nemothenoone reopened this Sep 15, 2020
@nkaskov
Copy link
Contributor

nkaskov commented Sep 15, 2020

@Lagrang3 Could you please share the code you are trying to run?

@Lagrang3
Copy link
Author

Sure, it is simply this one:

#include <boost/crypto3/block/aes.hpp>
#include <boost/crypto3/block/algorithm/encrypt.hpp>

#include <string>
#include <cassert>

using namespace boost::crypto3;

int main()
{
    std::string input = 
        "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
        "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
        "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
        "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
        "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
        "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
        "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
        "\xad\x2b\x41\x7b\xe6\x6c\x37\x10";

    std::string key = 
        "\x2b\x7e\x15\x16\x28\xae\xd2\xa6"
        "\xab\xf7\x15\x88\x09\xcf\x4f\x3c";

    std::string out = encrypt<block::aes<128>>(input.begin(), input.end(), key);

    assert(out == "3ad77bb40d7a3660a89ecaf32466ef97f5d3d58503b9699de785895a96fdbaaf"
                  "43b1cd7f598ece23881b00e3ed0306887b0c785e27e8ad3f8223207104725dd4");
    return 0;
}

@nemothenoone
Copy link
Member

@Lagrang3 I've updated the encryption interface. Looks like there was no type traits required implemented.

The example you brought was also put into example directory, so we could indicate it reviewed.

Try it again with the latest commit?

@Lagrang3
Copy link
Author

Lagrang3 commented Sep 18, 2020

@nemothenoone Now it compiles. The example was taken from the documentation, anyways is nice to find an examples directory.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants