Bug Summary

File:out/../deps/openssl/openssl/crypto/des/cfb_enc.c
Warning:line 155, column 15
Although the value stored to 'd0' is used in the enclosing expression, the value is never actually read from 'd0'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name cfb_enc.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/home/maurizio/node-v18.6.0/out -resource-dir /usr/local/lib/clang/16.0.0 -D V8_DEPRECATION_WARNINGS -D V8_IMMINENT_DEPRECATION_WARNINGS -D _GLIBCXX_USE_CXX11_ABI=1 -D NODE_OPENSSL_CONF_NAME=nodejs_conf -D NODE_OPENSSL_HAS_QUIC -D __STDC_FORMAT_MACROS -D OPENSSL_NO_PINSHARED -D OPENSSL_THREADS -D OPENSSL_NO_HW -D OPENSSL_API_COMPAT=0x10100001L -D STATIC_LEGACY -D NDEBUG -D OPENSSL_USE_NODELETE -D L_ENDIAN -D OPENSSL_BUILDING_OPENSSL -D AES_ASM -D BSAES_ASM -D CMLL_ASM -D ECP_NISTZ256_ASM -D GHASH_ASM -D KECCAK1600_ASM -D MD5_ASM -D OPENSSL_BN_ASM_GF2m -D OPENSSL_BN_ASM_MONT -D OPENSSL_BN_ASM_MONT5 -D OPENSSL_CPUID_OBJ -D OPENSSL_IA32_SSE2 -D PADLOCK_ASM -D POLY1305_ASM -D SHA1_ASM -D SHA256_ASM -D SHA512_ASM -D VPAES_ASM -D WHIRLPOOL_ASM -D X25519_ASM -D OPENSSL_PIC -D MODULESDIR="/home/maurizio/node-v18.6.0/out/Release/obj.target/deps/openssl/lib/openssl-modules" -D OPENSSLDIR="/home/maurizio/node-v18.6.0/out/Release/obj.target/deps/openssl" -D OPENSSLDIR="/etc/ssl" -D ENGINESDIR="/dev/null" -D TERMIOS -I ../deps/openssl/openssl -I ../deps/openssl/openssl/include -I ../deps/openssl/openssl/crypto -I ../deps/openssl/openssl/crypto/include -I ../deps/openssl/openssl/crypto/modes -I ../deps/openssl/openssl/crypto/ec/curve448 -I ../deps/openssl/openssl/crypto/ec/curve448/arch_32 -I ../deps/openssl/openssl/providers/common/include -I ../deps/openssl/openssl/providers/implementations/include -I ../deps/openssl/config -I ../deps/openssl/config/archs/linux-x86_64/asm -I ../deps/openssl/config/archs/linux-x86_64/asm/include -I ../deps/openssl/config/archs/linux-x86_64/asm/crypto -I ../deps/openssl/config/archs/linux-x86_64/asm/crypto/include/internal -I ../deps/openssl/config/archs/linux-x86_64/asm/providers/common/include -internal-isystem /usr/local/lib/clang/16.0.0/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/8/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -Wno-unused-parameter -Wno-missing-field-initializers -Wno-old-style-declaration -fdebug-compilation-dir=/home/maurizio/node-v18.6.0/out -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2022-08-22-142216-507842-1 -x c ../deps/openssl/openssl/crypto/des/cfb_enc.c
1/*
2 * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10/*
11 * DES low level APIs are deprecated for public use, but still ok for internal
12 * use.
13 */
14#include "internal/deprecated.h"
15
16#include "e_os.h"
17#include "des_local.h"
18#include <assert.h>
19
20/*
21 * The input and output are loaded in multiples of 8 bits. What this means is
22 * that if you hame numbits=12 and length=2 the first 12 bits will be
23 * retrieved from the first byte and half the second. The second 12 bits
24 * will come from the 3rd and half the 4th byte.
25 */
26/*
27 * Until Aug 1 2003 this function did not correctly implement CFB-r, so it
28 * will not be compatible with any encryption prior to that date. Ben.
29 */
30void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits,
31 long length, DES_key_schedule *schedule,
32 DES_cblock *ivec, int enc)
33{
34 register DES_LONG d0, d1, v0, v1;
35 register unsigned long l = length;
36 register int num = numbits / 8, n = (numbits + 7) / 8, i, rem =
37 numbits % 8;
38 DES_LONG ti[2];
39 unsigned char *iv;
40#ifndef L_ENDIAN1
41 unsigned char ovec[16];
42#else
43 unsigned int sh[4];
44 unsigned char *ovec = (unsigned char *)sh;
45
46 /* I kind of count that compiler optimizes away this assertion, */
47 assert(sizeof(sh[0]) == 4)((void) (0)); /* as this holds true for all, */
48 /* but 16-bit platforms... */
49
50#endif
51
52 if (numbits <= 0 || numbits > 64)
53 return;
54 iv = &(*ivec)[0];
55 c2l(iv, v0)(v0 =((DES_LONG)(*((iv)++))) , v0|=((DES_LONG)(*((iv)++)))<<
8L, v0|=((DES_LONG)(*((iv)++)))<<16L, v0|=((DES_LONG)(
*((iv)++)))<<24L)
;
56 c2l(iv, v1)(v1 =((DES_LONG)(*((iv)++))) , v1|=((DES_LONG)(*((iv)++)))<<
8L, v1|=((DES_LONG)(*((iv)++)))<<16L, v1|=((DES_LONG)(
*((iv)++)))<<24L)
;
57 if (enc) {
58 while (l >= (unsigned long)n) {
59 l -= n;
60 ti[0] = v0;
61 ti[1] = v1;
62 DES_encrypt1((DES_LONG *)ti, schedule, DES_ENCRYPT1);
63 c2ln(in, d0, d1, n){ in+=n; d0=d1=0; switch (n) { case 8: d1 =((DES_LONG)(*(--(in
))))<<24L; case 7: d1|=((DES_LONG)(*(--(in))))<<16L
; case 6: d1|=((DES_LONG)(*(--(in))))<< 8L; case 5: d1|=
((DES_LONG)(*(--(in)))); case 4: d0 =((DES_LONG)(*(--(in))))<<
24L; case 3: d0|=((DES_LONG)(*(--(in))))<<16L; case 2: d0
|=((DES_LONG)(*(--(in))))<< 8L; case 1: d0|=((DES_LONG)
(*(--(in)))); } }
;
64 in += n;
65 d0 ^= ti[0];
66 d1 ^= ti[1];
67 l2cn(d0, d1, out, n){ out+=n; switch (n) { case 8: *(--(out))=(unsigned char)(((d1
)>>24L)&0xff); case 7: *(--(out))=(unsigned char)((
(d1)>>16L)&0xff); case 6: *(--(out))=(unsigned char
)(((d1)>> 8L)&0xff); case 5: *(--(out))=(unsigned char
)(((d1) )&0xff); case 4: *(--(out))=(unsigned char)(((d0)
>>24L)&0xff); case 3: *(--(out))=(unsigned char)(((
d0)>>16L)&0xff); case 2: *(--(out))=(unsigned char)
(((d0)>> 8L)&0xff); case 1: *(--(out))=(unsigned char
)(((d0) )&0xff); } }
;
68 out += n;
69 /*
70 * 30-08-94 - eay - changed because l>>32 and l<<32 are bad under
71 * gcc :-(
72 */
73 if (numbits == 32) {
74 v0 = v1;
75 v1 = d0;
76 } else if (numbits == 64) {
77 v0 = d0;
78 v1 = d1;
79 } else {
80#ifndef L_ENDIAN1
81 iv = &ovec[0];
82 l2c(v0, iv)(*((iv)++)=(unsigned char)(((v0) )&0xff), *((iv)++)=(unsigned
char)(((v0)>> 8L)&0xff), *((iv)++)=(unsigned char)
(((v0)>>16L)&0xff), *((iv)++)=(unsigned char)(((v0)
>>24L)&0xff))
;
83 l2c(v1, iv)(*((iv)++)=(unsigned char)(((v1) )&0xff), *((iv)++)=(unsigned
char)(((v1)>> 8L)&0xff), *((iv)++)=(unsigned char)
(((v1)>>16L)&0xff), *((iv)++)=(unsigned char)(((v1)
>>24L)&0xff))
;
84 l2c(d0, iv)(*((iv)++)=(unsigned char)(((d0) )&0xff), *((iv)++)=(unsigned
char)(((d0)>> 8L)&0xff), *((iv)++)=(unsigned char)
(((d0)>>16L)&0xff), *((iv)++)=(unsigned char)(((d0)
>>24L)&0xff))
;
85 l2c(d1, iv)(*((iv)++)=(unsigned char)(((d1) )&0xff), *((iv)++)=(unsigned
char)(((d1)>> 8L)&0xff), *((iv)++)=(unsigned char)
(((d1)>>16L)&0xff), *((iv)++)=(unsigned char)(((d1)
>>24L)&0xff))
;
86#else
87 sh[0] = v0, sh[1] = v1, sh[2] = d0, sh[3] = d1;
88#endif
89 if (rem == 0)
90 memmove(ovec, ovec + num, 8);
91 else
92 for (i = 0; i < 8; ++i)
93 ovec[i] = ovec[i + num] << rem |
94 ovec[i + num + 1] >> (8 - rem);
95#ifdef L_ENDIAN1
96 v0 = sh[0], v1 = sh[1];
97#else
98 iv = &ovec[0];
99 c2l(iv, v0)(v0 =((DES_LONG)(*((iv)++))) , v0|=((DES_LONG)(*((iv)++)))<<
8L, v0|=((DES_LONG)(*((iv)++)))<<16L, v0|=((DES_LONG)(
*((iv)++)))<<24L)
;
100 c2l(iv, v1)(v1 =((DES_LONG)(*((iv)++))) , v1|=((DES_LONG)(*((iv)++)))<<
8L, v1|=((DES_LONG)(*((iv)++)))<<16L, v1|=((DES_LONG)(
*((iv)++)))<<24L)
;
101#endif
102 }
103 }
104 } else {
105 while (l >= (unsigned long)n) {
106 l -= n;
107 ti[0] = v0;
108 ti[1] = v1;
109 DES_encrypt1((DES_LONG *)ti, schedule, DES_ENCRYPT1);
110 c2ln(in, d0, d1, n){ in+=n; d0=d1=0; switch (n) { case 8: d1 =((DES_LONG)(*(--(in
))))<<24L; case 7: d1|=((DES_LONG)(*(--(in))))<<16L
; case 6: d1|=((DES_LONG)(*(--(in))))<< 8L; case 5: d1|=
((DES_LONG)(*(--(in)))); case 4: d0 =((DES_LONG)(*(--(in))))<<
24L; case 3: d0|=((DES_LONG)(*(--(in))))<<16L; case 2: d0
|=((DES_LONG)(*(--(in))))<< 8L; case 1: d0|=((DES_LONG)
(*(--(in)))); } }
;
111 in += n;
112 /*
113 * 30-08-94 - eay - changed because l>>32 and l<<32 are bad under
114 * gcc :-(
115 */
116 if (numbits == 32) {
117 v0 = v1;
118 v1 = d0;
119 } else if (numbits == 64) {
120 v0 = d0;
121 v1 = d1;
122 } else {
123#ifndef L_ENDIAN1
124 iv = &ovec[0];
125 l2c(v0, iv)(*((iv)++)=(unsigned char)(((v0) )&0xff), *((iv)++)=(unsigned
char)(((v0)>> 8L)&0xff), *((iv)++)=(unsigned char)
(((v0)>>16L)&0xff), *((iv)++)=(unsigned char)(((v0)
>>24L)&0xff))
;
126 l2c(v1, iv)(*((iv)++)=(unsigned char)(((v1) )&0xff), *((iv)++)=(unsigned
char)(((v1)>> 8L)&0xff), *((iv)++)=(unsigned char)
(((v1)>>16L)&0xff), *((iv)++)=(unsigned char)(((v1)
>>24L)&0xff))
;
127 l2c(d0, iv)(*((iv)++)=(unsigned char)(((d0) )&0xff), *((iv)++)=(unsigned
char)(((d0)>> 8L)&0xff), *((iv)++)=(unsigned char)
(((d0)>>16L)&0xff), *((iv)++)=(unsigned char)(((d0)
>>24L)&0xff))
;
128 l2c(d1, iv)(*((iv)++)=(unsigned char)(((d1) )&0xff), *((iv)++)=(unsigned
char)(((d1)>> 8L)&0xff), *((iv)++)=(unsigned char)
(((d1)>>16L)&0xff), *((iv)++)=(unsigned char)(((d1)
>>24L)&0xff))
;
129#else
130 sh[0] = v0, sh[1] = v1, sh[2] = d0, sh[3] = d1;
131#endif
132 if (rem == 0)
133 memmove(ovec, ovec + num, 8);
134 else
135 for (i = 0; i < 8; ++i)
136 ovec[i] = ovec[i + num] << rem |
137 ovec[i + num + 1] >> (8 - rem);
138#ifdef L_ENDIAN1
139 v0 = sh[0], v1 = sh[1];
140#else
141 iv = &ovec[0];
142 c2l(iv, v0)(v0 =((DES_LONG)(*((iv)++))) , v0|=((DES_LONG)(*((iv)++)))<<
8L, v0|=((DES_LONG)(*((iv)++)))<<16L, v0|=((DES_LONG)(
*((iv)++)))<<24L)
;
143 c2l(iv, v1)(v1 =((DES_LONG)(*((iv)++))) , v1|=((DES_LONG)(*((iv)++)))<<
8L, v1|=((DES_LONG)(*((iv)++)))<<16L, v1|=((DES_LONG)(
*((iv)++)))<<24L)
;
144#endif
145 }
146 d0 ^= ti[0];
147 d1 ^= ti[1];
148 l2cn(d0, d1, out, n){ out+=n; switch (n) { case 8: *(--(out))=(unsigned char)(((d1
)>>24L)&0xff); case 7: *(--(out))=(unsigned char)((
(d1)>>16L)&0xff); case 6: *(--(out))=(unsigned char
)(((d1)>> 8L)&0xff); case 5: *(--(out))=(unsigned char
)(((d1) )&0xff); case 4: *(--(out))=(unsigned char)(((d0)
>>24L)&0xff); case 3: *(--(out))=(unsigned char)(((
d0)>>16L)&0xff); case 2: *(--(out))=(unsigned char)
(((d0)>> 8L)&0xff); case 1: *(--(out))=(unsigned char
)(((d0) )&0xff); } }
;
149 out += n;
150 }
151 }
152 iv = &(*ivec)[0];
153 l2c(v0, iv)(*((iv)++)=(unsigned char)(((v0) )&0xff), *((iv)++)=(unsigned
char)(((v0)>> 8L)&0xff), *((iv)++)=(unsigned char)
(((v0)>>16L)&0xff), *((iv)++)=(unsigned char)(((v0)
>>24L)&0xff))
;
154 l2c(v1, iv)(*((iv)++)=(unsigned char)(((v1) )&0xff), *((iv)++)=(unsigned
char)(((v1)>> 8L)&0xff), *((iv)++)=(unsigned char)
(((v1)>>16L)&0xff), *((iv)++)=(unsigned char)(((v1)
>>24L)&0xff))
;
155 v0 = v1 = d0 = d1 = ti[0] = ti[1] = 0;
Although the value stored to 'd0' is used in the enclosing expression, the value is never actually read from 'd0'
156}