anchor.diff:       {no_blowfish_cfb64,    [], [no_support, no_block]},
        {no_blowfish_ofb64,    [], [no_support, no_block]},
        {no_aes_ige256,        [], [no_support, no_block]},
  -     {no_chacha20_poly1305, [], [no_support, no_aead]},
  +     {no_chacha20_poly1305, [], [no_support, no_aead, no_aead_ng]},
        {no_chacha20,          [], [no_support, no_stream_ivec]},
        {no_rc2_cbc,           [], [no_support, no_block]},
        {no_rc4,               [], [no_support, no_stream]},
  
positive.code:      {blowfish_ofb64,       [], [block, api_ng, api_ng_one_shot, api_ng_tls]},
       {rc4,                  [], [stream, api_ng, api_ng_one_shot, api_ng_tls]},
       {aes_ctr,              [], [stream]},
       {chacha20_poly1305,    [], [aead, aead_bad_tag]},
       {chacha20,             [], [stream, api_ng, api_ng_one_shot, api_ng_tls]},
       {poly1305,             [], [poly1305]},
       {no_poly1305,          [], [no_poly1305]},
  
negative.code:                      {got, Other1}})
      end.
  
  aead_cipher_ng({Type, Key, PlainText, IV, AAD, CipherText, CipherTag, Info}) ->
      Plain = iolist_to_binary(PlainText),
      case crypto:crypto_one_time_aead(Type, Key, IV, PlainText, AAD, true) of
  	{CipherText, CipherTag} ->
  	    ok;
  	Other0 ->
  	    ct:fail({{crypto,
                        block_encrypt,
                        [{info,Info}, {key,Key}, {pt,PlainText}, {iv,IV}, {aad,AAD}, {ct,CipherText}, {tag,CipherTag}]},
                       {expected, {CipherText, CipherTag}},
                       {got, Other0}})
      end,
      case crypto:crypto_one_time_aead(Type, Key, IV, CipherText, AAD, CipherTag, false) of
  	Plain ->
  	    ok;
  	Other1 ->
  	    ct:fail({{crypto,
                        block_decrypt,
                        [{info,Info}, {key,Key}, {pt,PlainText}, {iv,IV}, {aad,AAD}, {ct,CipherText}, {tag,CipherTag}]},
                       {expected, Plain},
                       {got, Other1}})
      end;
  aead_cipher_ng({Type, Key, PlainText, IV, AAD, CipherText, CipherTag, TagLen, Info}) ->
      <<TruncatedCipherTag:TagLen/binary, _/binary>> = CipherTag,
      Plain = iolist_to_binary(PlainText),
      try crypto:crypto_one_time_aead(Type, Key, IV, PlainText, AAD, TagLen, true) of
  	{CipherText, TruncatedCipherTag} ->
  	    ok;
  	Other0 ->
  	    ct:fail({{crypto,
                        block_encrypt, 
                        [{info,Info}, {key,Key}, {pt,PlainText}, {iv,IV}, {aad,AAD}, {ct,CipherText}, {tag,CipherTag}, {taglen,TagLen}]},
                       {expected, {CipherText, TruncatedCipherTag}},
                       {got, Other0}})
      catch
          error:E ->
              ct:log("~p",[{Type, Key, PlainText, IV, AAD, CipherText, CipherTag, TagLen, Info}]),
              try crypto:crypto_one_time_aead(Type, Key, IV, PlainText, AAD, TagLen, true)
              of
                  RR ->
                      ct:log("Works: ~p",[RR])
              catch
                  CC:EE ->
                      ct:log("~p:~p", [CC,EE])
              end,
              ct:fail("~p",[E])
      end,
      case crypto:crypto_one_time_aead(Type, Key, IV, CipherText, AAD, TruncatedCipherTag, false) of
  	Plain ->
  	    ok;
  	Other1 ->
  	    ct:fail({{crypto,
                        block_decrypt, 
                        [{info,Info}, {key,Key}, {pt,PlainText}, {iv,IV}, {aad,AAD}, {ct,CipherText}, {tag,CipherTag},
                         {truncated,TruncatedCipherTag}]},
                       {expected, Plain},
                       {got, Other1}})
      end.
  
  mk_bad_tag(CipherTag) ->
      case <<0:(size(CipherTag))/unit:8>> of
          CipherTag -> % The correct tag may happen to be a suite of zeroes
  