如何解决Erlang加密新API crypto_one_time / 5不接受选项:[{encrypt,true}]
Erlang Crypto新API不适用于crypto_ops()
Erts:10.6.4
http://erlang.org/doc/apps/crypto/new_api.html#example-of-crypto_one_time-5
示例:
Key = <<1:128>>.
IV = <<0:128>>.
crypto:crypto_one_time(aes_128_ctr,Key,IV,<<"test">>,true).
按预期工作:
<<113,32,217,161>>
根据文档:
FlagOrOptions = crypto_opts() | boolean()
crypto_opts() = boolean() | [crypto_opt()]
crypto_opt() = {encrypt,boolean()} | {padding,padding()}
“在新API中选择加密({encrypt,true})或解密({encrypt,false})。”
当我这样做时:
Key = <<1:128>>.
IV = <<0:128>>.
crypto:crypto_one_time(aes_128_ctr,[{encrypt,true}]).
我收到错误消息:
* exception error: {badarg,{"api_ng.c",72},"Bad enc flag"}
in function crypto:ng_crypto_one_time_nif/5
called as crypto:ng_crypto_one_time_nif(aes_128_ctr,<<0,1>>,0>>,true}])
解决方法
对github上的Erlang存储库进行了一些调查之后,我发现功能class PlotlyChartDirective(Directive):
""" Top-level plotly chart directive """
has_content = True
def px_value(argument):
# This is not callable as self.align. We cannot make it a
# staticmethod because we're saving an unbound method in
# option_spec below.
return directives.length_or_percentage_or_unitless(argument,'px')
required_arguments = 1
optional_arguments = 0
option_spec = {
# TODO allow static images for PDF renders 'altimage': directives.unchanged,'height': px_value,'width': px_value,}
def run(self):
""" Parse a plotly chart directive """
self.assert_has_content()
env = self.state.document.settings.env
# Ensure the current chart ID is initialised in the environment
if 'next_plotly_chart_id' not in env.temp_data:
env.temp_data['next_plotly_chart_id'] = 0
# Get the ID of this chart
id = env.temp_data['next_plotly_chart_id']
# Handle the src and destination URI of the *.json asset
uri = directives.uri(self.arguments[0])
src_uri = os.path.join(env.app.builder.srcdir,uri)
build_uri = os.path.join(env.app.builder.outdir,'_static',uri)
# Create the main node container and store the URI of the file which will be collected later
node = nodes.container()
node['classes'] = ['sphinx-plotly']
# Increment the ID counter ready for the next chart
env.temp_data['next_plotly_chart_id'] += 1
# Only if its a supported builder do we proceed (otherwise return an empty node)
if env.app.builder.name in get_compatible_builders(env.app):
# Make the directories and copy file (if file has changed)
destdir = os.path.dirname(build_uri)
if not os.path.exists(destdir):
os.makedirs(destdir)
copyfile(src_uri,build_uri)
width = self.options.pop('width',DEFAULT_WIDTH)
height = self.options.pop('height',DEFAULT_HEIGHT)
chart_node = nodes.container()
chart_node['classes'] = ['sphinx-plotly-chart',f"sphinx-plotly-chart-id-{id}",f"sphinx-plotly-chart-uri-{uri}"]
placeholder_node = nodes.container()
placeholder_node['classes'] = ['sphinx-plotly-placeholder',f"sphinx-plotly-placeholder-{id}"]
placeholder_node += nodes.caption('','Loading...')
node += chart_node
node += placeholder_node
# Add optional chart caption and legend (as per figure directive)
if self.content:
caption_node = nodes.Element() # Anonymous container for parsing
self.state.nested_parse(self.content,self.content_offset,caption_node)
first_node = caption_node[0]
if isinstance(first_node,nodes.paragraph):
caption = nodes.caption(first_node.rawsource,'',*first_node.children)
caption.source = first_node.source
caption.line = first_node.line
node += caption
elif not (isinstance(first_node,nodes.comment) and len(first_node) == 0):
error = self.state_machine.reporter.error(
'Chart caption must be a paragraph or empty comment.',nodes.literal_block(self.block_text,self.block_text),line=self.lineno)
return [node,error]
if len(caption_node) > 1:
node += nodes.legend('',*caption_node[1:])
return [node]
已更改为可使用选项,请参见OTP-22.2.8,而比较时请参见OTP-23.0.3。另外,如果您查看crypto_init/3 function in OTP-22.2.8并尝试与crypto_init/3 function in OTP-23.0.3进行比较,您会发现变量的规格和变量的名称已从crypto:crypto_one_time/5
更改为{{1} }。因此,这意味着EncryptFlag :: boolean()
中根本没有实现FlagOrOptions :: crypto_opts() | boolean()
和[{encrypt,true/false}]
这样的选项传递,而要开始使用这些选项,您需要升级Erlang直到最新版本
看起来ERTS 10.6.4在crypto_one_time实现中存在错误。我正在运行erts 11.0,并且工作正常:
alexei@MacBook-Pro src % erl
Erlang/OTP 23 [erts-11.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace]
Eshell V11.0 (abort with ^G)
1> Key = <<1:128>>.
<<0,1>>
2> IV = <<0:128>>.
<<0,0>>
3> crypto:crypto_one_time(aes_128_ctr,Key,IV,<<"test">>,[{encrypt,true}]).
<<113,32,217,161>>
只需更新Erlang版本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。