<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hello,<div class=""><br class=""></div><div class="">I am relatively new to using OpenSSL libraries in C so please accept my apologies if this may sound simple for most of you.</div><div class=""><br class=""></div><div class="">I have an algorithm that I implemented in 1.0.1c to perform AES-256-CBC encryption, which no longer compiles due to EVP_CIPHER_CTX now being opaque in 1.1.0+.  Here is the algorithm in question (Objective-C mixed in..):</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">+(</span><span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">NSData</span><span style="font-variant-ligatures: no-common-ligatures" class=""> *)encryptReport:(</span><span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">NSData</span><span style="font-variant-ligatures: no-common-ligatures" class=""> *)report usingKey:(</span><span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">NSData</span><span style="font-variant-ligatures: no-common-ligatures" class=""> *)key withIV:(</span><span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">NSData</span><span style="font-variant-ligatures: no-common-ligatures" class=""> *)iv</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">{</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">const</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">unsigned</span><span style="font-variant-ligatures: no-common-ligatures" class=""> BUFSIZE=</span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">4096</span><span style="font-variant-ligatures: no-common-ligatures" class="">;</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">unsigned</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">char</span><span style="font-variant-ligatures: no-common-ligatures" class=""> *read_buf = </span><span style="font-variant-ligatures: no-common-ligatures; color: #3e1e81" class="">malloc</span><span style="font-variant-ligatures: no-common-ligatures" class="">(BUFSIZE);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">unsigned</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">char</span><span style="font-variant-ligatures: no-common-ligatures" class=""> *cipher_buf;</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">unsigned</span><span style="font-variant-ligatures: no-common-ligatures" class=""> blocksize;</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">int</span><span style="font-variant-ligatures: no-common-ligatures" class=""> out_len;</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">int</span><span style="font-variant-ligatures: no-common-ligatures" class=""> reportIndex = </span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">0</span><span style="font-variant-ligatures: no-common-ligatures" class="">;</span></div><div style="margin: 0px; line-height: normal;" class=""><font color="#ff0002" face="Menlo" style="font-size: 11px;" class=""><b class=""><span style="font-variant-ligatures: no-common-ligatures;" class="">    </span><span style="font-variant-ligatures: no-common-ligatures;" class="">EVP_CIPHER_CTX</span><span style="font-variant-ligatures: no-common-ligatures;" class=""> ctx;</span></b></font></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    EVP_CipherInit(&ctx, EVP_aes_256_cbc(), key.bytes, iv.bytes, </span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">1</span><span style="font-variant-ligatures: no-common-ligatures" class="">);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    blocksize = EVP_CIPHER_CTX_block_size(&ctx);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    cipher_buf = </span><span style="font-variant-ligatures: no-common-ligatures; color: #3e1e81" class="">malloc</span><span style="font-variant-ligatures: no-common-ligatures" class="">(BUFSIZE + blocksize);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #78492a" class="">memset</span><span style="font-variant-ligatures: no-common-ligatures" class="">(cipher_buf,</span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">0</span><span style="font-variant-ligatures: no-common-ligatures" class="">,BUFSIZE + blocksize);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">NSMutableData</span><span style="font-variant-ligatures: no-common-ligatures" class=""> *encryptedData = [</span><span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">NSMutableData</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #3e1e81" class="">dataWithCapacity</span><span style="font-variant-ligatures: no-common-ligatures" class="">:report.</span><span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">length</span><span style="font-variant-ligatures: no-common-ligatures" class=""> + blocksize];</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">while</span><span style="font-variant-ligatures: no-common-ligatures" class=""> (</span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">1</span><span style="font-variant-ligatures: no-common-ligatures" class="">) {</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(0, 132, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">        </span><span style="font-variant-ligatures: no-common-ligatures" class="">// Read in data in blocks until EOF. Update the ciphering with each read.</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">int</span><span style="font-variant-ligatures: no-common-ligatures" class=""> numRead = </span><span style="font-variant-ligatures: no-common-ligatures; color: #78492a" class="">MIN</span><span style="font-variant-ligatures: no-common-ligatures" class="">(BUFSIZE,(</span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">int</span><span style="font-variant-ligatures: no-common-ligatures" class="">)report.length-reportIndex);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #78492a" class="">memcpy</span><span style="font-variant-ligatures: no-common-ligatures" class="">(read_buf, &report.bytes[reportIndex], numRead);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        EVP_CipherUpdate(&ctx, cipher_buf, &out_len, read_buf, numRead);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        [encryptedData </span><span style="font-variant-ligatures: no-common-ligatures; color: #3e1e81" class="">appendBytes</span><span style="font-variant-ligatures: no-common-ligatures" class="">:cipher_buf </span><span style="font-variant-ligatures: no-common-ligatures; color: #3e1e81" class="">length</span><span style="font-variant-ligatures: no-common-ligatures" class="">:out_len];</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">if</span><span style="font-variant-ligatures: no-common-ligatures" class=""> (numRead < BUFSIZE) { </span><span style="font-variant-ligatures: no-common-ligatures; color: #008400" class="">// EOF</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">            </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">break</span><span style="font-variant-ligatures: no-common-ligatures" class="">;</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        }</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        reportIndex += numRead;</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    }</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(0, 132, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">    </span><span style="font-variant-ligatures: no-common-ligatures" class="">// Now cipher the final block and write it out.</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    EVP_CipherFinal(&ctx, cipher_buf, &out_len);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    [encryptedData </span><span style="font-variant-ligatures: no-common-ligatures; color: #3e1e81" class="">appendBytes</span><span style="font-variant-ligatures: no-common-ligatures" class="">:cipher_buf </span><span style="font-variant-ligatures: no-common-ligatures; color: #3e1e81" class="">length</span><span style="font-variant-ligatures: no-common-ligatures" class="">:out_len];</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(0, 132, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">    </span><span style="font-variant-ligatures: no-common-ligatures" class="">// Free memory</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #3e1e81" class="">free</span><span style="font-variant-ligatures: no-common-ligatures" class="">(cipher_buf);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #3e1e81" class="">free</span><span style="font-variant-ligatures: no-common-ligatures" class="">(read_buf);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">return</span><span style="font-variant-ligatures: no-common-ligatures" class=""> [</span><span style="font-variant-ligatures: no-common-ligatures; color: #703daa" class="">NSData</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #3e1e81" class="">dataWithData</span><span style="font-variant-ligatures: no-common-ligatures" class="">:encryptedData];</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">}</span></div><div class=""><br class=""></div><div class="">The error I get is “Variable has incomplete type ‘EVP_CIPHER_CTX’ (aka ‘struct evp_cipher_ctx_st’)”.  Looking at the diff between the releases, I can see the structure definition has been removed.  </div><div class=""><br class=""></div><div class=""><b class="">Question 1: Are there other functions I should have been using to implement AES-256-CBC than the EVP methods above?</b></div><div class=""><br class=""></div><div class="">Question 2: If EVP is the way to go for implementing AES-256-CBC, which functions should I be looking at to not require EVP_CIPHER_CTX variable declaration?</div><div class=""><br class=""></div><div class="">Thanks!</div><div class=""><br class=""></div><div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Dave Poirier</div><div class="">skype: ekscrypto</div><div class="">twitter: @ekscrypto</div></div><div class="">facebook: /ekscrypto</div><div class=""><div class="">email: <a href="mailto:ekscrypto@gmail.com" class="">ekscrypto@gmail.com</a></div></div><div class=""><br class=""></div></div><span style="orphans: 2; widows: 2;" class="">All I need is a towel, everything else can be answered by 42.</span><div class=""><span style="orphans: 2; widows: 2;" class=""><br class=""></span></div><br class="Apple-interchange-newline">
</div>

<br class=""></div></body></html>