- memset(&cryp,'\0',sizeof cryp);
- cryp.ses=CDATA(ctx)->ses;
- cryp.op=ctx->encrypt ? COP_ENCRYPT : COP_DECRYPT;
- cryp.flags=0;
- cryp.len=inl;
- assert((inl&(ctx->cipher->block_size-1)) == 0);
- cryp.src=(caddr_t)in;
- cryp.dst=(caddr_t)out;
- cryp.mac=0;
- if(ctx->cipher->iv_len)
- cryp.iv=(caddr_t)ctx->iv;
-
- if(!ctx->encrypt)
- memcpy(lb,&in[cryp.len-ctx->cipher->iv_len],ctx->cipher->iv_len);
-
- if(ioctl(fd, CIOCCRYPT, &cryp) == -1)
- {
- if(errno == EINVAL) /* buffers are misaligned */
- {
- unsigned int cinl=0;
- char *cin=NULL;
- char *cout=NULL;
-
- /* NB: this can only make cinl != inl with stream ciphers */
- cinl=(inl+3)/4*4;
-
- if(((unsigned long)in&3) || cinl != inl)
- {
- cin=OPENSSL_malloc(cinl);
- if (cin == NULL)
- return 0;
- memcpy(cin,in,inl);
- cryp.src=cin;
- }
-
- if(((unsigned long)out&3) || cinl != inl)
- {
- cout=OPENSSL_malloc(cinl);
- if (cout == NULL)
- {
- if (cin != NULL)
- OPENSSL_free(cin);
- return 0;
- }
- cryp.dst=cout;
- }
-
- cryp.len=cinl;
-
- if(ioctl(fd, CIOCCRYPT, &cryp) == -1)
- {
- err("CIOCCRYPT(2) failed");
- printf("src=%p dst=%p\n",cryp.src,cryp.dst);
- abort();
- return 0;
- }
-
- if(cout)
- {
- memcpy(out,cout,inl);
- OPENSSL_free(cout);
- }
- if(cin)
- OPENSSL_free(cin);
- }
- else
- {
- err("CIOCCRYPT failed");
- abort();
- return 0;
- }
- }
-
- if(ctx->encrypt)
- memcpy(ctx->iv,&out[cryp.len-ctx->cipher->iv_len],ctx->cipher->iv_len);
+ memset(&cryp, '\0', sizeof cryp);
+ cryp.ses = CDATA(ctx)->ses;
+ cryp.op = ctx->encrypt ? COP_ENCRYPT : COP_DECRYPT;
+ cryp.flags = 0;
+ cryp.len = inl;
+ assert((inl & (ctx->cipher->block_size - 1)) == 0);
+ cryp.src = (caddr_t) in;
+ cryp.dst = (caddr_t) out;
+ cryp.mac = 0;
+ if (ctx->cipher->iv_len)
+ cryp.iv = (caddr_t) ctx->iv;
+
+ if (!ctx->encrypt)
+ memcpy(lb, &in[cryp.len - ctx->cipher->iv_len], ctx->cipher->iv_len);
+
+ if (ioctl(fd, CIOCCRYPT, &cryp) == -1) {
+ if (errno == EINVAL) { /* buffers are misaligned */
+ unsigned int cinl = 0;
+ char *cin = NULL;
+ char *cout = NULL;
+
+ /* NB: this can only make cinl != inl with stream ciphers */
+ cinl = (inl + 3) / 4 * 4;
+
+ if (((unsigned long)in & 3) || cinl != inl) {
+ cin = OPENSSL_malloc(cinl);
+ if (cin == NULL)
+ return 0;
+ memcpy(cin, in, inl);
+ cryp.src = cin;
+ }
+
+ if (((unsigned long)out & 3) || cinl != inl) {
+ cout = OPENSSL_malloc(cinl);
+ if (cout == NULL) {
+ if (cin != NULL)
+ OPENSSL_free(cin);
+ return 0;
+ }
+ cryp.dst = cout;
+ }
+
+ cryp.len = cinl;
+
+ if (ioctl(fd, CIOCCRYPT, &cryp) == -1) {
+ err("CIOCCRYPT(2) failed");
+ printf("src=%p dst=%p\n", cryp.src, cryp.dst);
+ abort();
+ return 0;
+ }
+
+ if (cout) {
+ memcpy(out, cout, inl);
+ OPENSSL_free(cout);
+ }
+ if (cin)
+ OPENSSL_free(cin);
+ } else {
+ err("CIOCCRYPT failed");
+ abort();
+ return 0;
+ }
+ }
+
+ if (ctx->encrypt)
+ memcpy(ctx->iv, &out[cryp.len - ctx->cipher->iv_len],
+ ctx->cipher->iv_len);