<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: "Courier New", monospace; font-size: 10pt; color: rgb(0, 0, 0);">
<br>
</div>
<div id="appendonsend"></div>
<div style="font-family:"Courier New",monospace; font-size:10pt; color:rgb(0,0,0)">
The "State" could not be re-used in OTP-22.0 or later.<br>
</div>
<div style="font-family:"Courier New",monospace; font-size:10pt; color:rgb(0,0,0)">
/Hans Nilsson<br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>Från:</b> erlang-questions-bounces@erlang.org <erlang-questions-bounces@erlang.org> för Zhengji Li <foldl@outlook.com><br>
<b>Skickat:</b> den 12 oktober 2019 12:15<br>
<b>Till:</b> Lista de Erlang <erlang-questions@erlang.org><br>
<b>Ämne:</b> [erlang-questions] crypto stream_state() used to be "self-contained" before OTP 22.0</font>
<div> </div>
</div>
<div dir="ltr">
<div style="color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif; font-size:12pt">
<span>Hi all,</span></div>
<div style="color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif; font-size:12pt">
<span><br>
</span></div>
<div style="color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif; font-size:12pt">
Could we infer that "State" is a "self-contained" piece of raw data that we can pass </div>
<div style="color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif; font-size:12pt">
to different function calls?</div>
<div style="color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif; font-size:12pt">
<br>
</div>
<div style="color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif; font-size:12pt">
<span style="color:rgb(0,0,0); font-family:calibri,helvetica,sans-serif; font-size:12pt; background-color:transparent"><span>stream_encrypt(State, PlainText) -> {NewState, CipherText}</span></span></div>
<div style="color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif; font-size:12pt">
<span style="color:rgb(0,0,0); font-family:calibri,helvetica,sans-serif; font-size:12pt; background-color:transparent"><span><br>
</span></span></div>
<div style="color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif; font-size:12pt">
<span style="color:rgb(0,0,0); font-family:calibri,helvetica,sans-serif; font-size:12pt; background-color:transparent">
<div>Compare it with:</div>
<div>file:<span>write(IoDevice, Bytes) -> ok | {error, Reason}</span><span><br>
</span></div>
<div><span><br>
</span></div>
<div><span>I think the answer should be "Yes". And things truly works before OTP 22.0.</span></div>
<div><span><br>
</span></div>
<div>Although codes can be fixed for OTP 22 easily, my concern is that, if a function in OTP is declared as</div>
<div><br>
</div>
<div>f(State, ...) -> {NewState, ...}</div>
<div><br>
</div>
<div>Can we infer that the old State can be used again?</div>
<div><span><br>
</span></div>
<div><span>Below is a simple test.</span></div>
<div><span><br>
</span><span></span></div>
<div>```</div>
<div><span>t() -><br>
</span>
<div>    Key = <<12,137,124,112,128,97,39,1,112,248,35,27,186,168,219,244>>,​</div>
<div>    IVec = <<78,237,251,180,107,173,97,170,32,214,233,193,147,64,117, 126>>,​</div>
<div>    Data = <<1,2,3,4>>,​</div>
<div>    Enc0 = enc(Key, IVec, Data),​</div>
<div>    Dec0 = dec(Key, IVec, Enc0),​</div>
<div>    show({Data, Enc0, Dec0}),​</div>
<div>​</div>
<div>    Cipher = crypto:stream_init(aes_ctr, Key, IVec),​</div>
<div>    Enc1 = enc(Cipher, Data),​</div>
<div>    Dec1 = dec(Cipher, Enc1),​</div>
<div>    show({Data, Enc1, Dec1}).​   % FAIL in OTP 22.0</div>
<div>​</div>
<div>enc(Key, IVec, Data) ->​</div>
<div>    Cipher = crypto:stream_init(aes_ctr, Key, IVec),​</div>
<div>    {_, Enc} = crypto:stream_encrypt(Cipher, Data),​</div>
<div>    Enc.​</div>
<div>​</div>
<div>dec(Key, IVec, Data) ->​</div>
<div>    Cipher = crypto:stream_init(aes_ctr, Key, IVec),​</div>
<div>    {_, Dec} = crypto:stream_decrypt(Cipher, Data),​</div>
<div>    Dec.​</div>
<div>​</div>
<div>enc(Cipher, Data) ->​</div>
<div>    {_, Enc} = crypto:stream_encrypt(Cipher, Data),​</div>
<div>    Enc.​</div>
<div>​</div>
<div>dec(Cipher, Data) ->​</div>
<div>    {_, Dec} = crypto:stream_decrypt(Cipher, Data),​</div>
<div>    Dec.​</div>
<div>​</div>
<div>show({A, B, A}) -> io:format("GOOD: ~p -> ~p -> ~p~n", [A,B,A]);​</div>
<span>show({A, B, C}) -> io:format(" BAD: ~p -> ~p -> ~p~n", [A,B,C]).</span></div>
<div>```</div>
</span></div>
</div>
</body>
</html>