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版本。