Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1001; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR1002; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,1003; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,1004; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR1005; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF1006; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING1007; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS1008; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.1009;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1010;1011; Example YASM command lines:1012; Windows: yasm -Xvc -f x64 -rnasm -pnasm -o sha256_sse4.obj -g cv8 sha256_sse4.asm1013; Linux: yasm -f x64 -f elf64 -X gnu -g dwarf2 -D LINUX -o sha256_sse4.o sha256_sse4.asm1014;1015;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1016;1017; This code is described in an Intel White-Paper:1018; "Fast SHA-256 Implementations on Intel Architecture Processors"1019;1020; To find it, surf to https://www.intel.com/p/en_US/embedded1021; and search for that title.1022; The paper is expected to be released roughly at the end of April, 20121023;1024;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1025; This code schedules 1 blocks at a time, with 4 lanes per block1026;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1028%define MOVDQ movdqu ;; assume buffers not aligned1030;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Define Macros1032; addm [mem], reg1033; Add reg to mem using reg-mem add and store1034%macro addm 21035add %2, %11036mov %1, %21037%endm1039;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1041; COPY_XMM_AND_BSWAP xmm, [mem], byte_flip_mask1042; Load xmm with mem and byte swap each dword1043%macro COPY_XMM_AND_BSWAP 31044MOVDQ %1, %21045pshufb %1, %31046%endmacro1048;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1050%define X0 xmm41051%define X1 xmm51052%define X2 xmm61053%define X3 xmm71055%define XTMP0 xmm01056%define XTMP1 xmm11057%define XTMP2 xmm21058%define XTMP3 xmm31059%define XTMP4 xmm81060%define XFER xmm91062%define SHUF_00BA xmm10 ; shuffle xBxA -> 00BA1063%define SHUF_DC00 xmm11 ; shuffle xDxC -> DC001064%define BYTE_FLIP_MASK xmm121066%ifdef LINUX1067%define NUM_BLKS rdx ; 3rd arg1068%define CTX rsi ; 2nd arg1069%define INP rdi ; 1st arg1071%define SRND rdi ; clobbers INP1072%define c ecx1073%define d r8d1074%define e edx1075%else1076%define NUM_BLKS r8 ; 3rd arg1077%define CTX rdx ; 2nd arg1078%define INP rcx ; 1st arg1080%define SRND rcx ; clobbers INP1081%define c edi1082%define d esi1083%define e r8d1085%endif1086%define TBL rbp1087%define a eax1088%define b ebx1090%define f r9d1091%define g r10d1092%define h r11d1094%define y0 r13d1095%define y1 r14d1096%define y2 r15d1100_INP_END_SIZE equ 81101_INP_SIZE equ 81102_XFER_SIZE equ 81103%ifdef LINUX1104_XMM_SAVE_SIZE equ 01105%else1106_XMM_SAVE_SIZE equ 7*161107%endif1108; STACK_SIZE plus pushes must be an odd multiple of 81109_ALIGN_SIZE equ 81111_INP_END equ 01112_INP equ _INP_END + _INP_END_SIZE1113_XFER equ _INP + _INP_SIZE1114_XMM_SAVE equ _XFER + _XFER_SIZE + _ALIGN_SIZE1115STACK_SIZE equ _XMM_SAVE + _XMM_SAVE_SIZE1117; rotate_Xs1118; Rotate values of symbols X0...X31119%macro rotate_Xs 01120%xdefine X_ X01121%xdefine X0 X11122%xdefine X1 X21123%xdefine X2 X31124%xdefine X3 X_1125%endm1127; ROTATE_ARGS1128; Rotate values of symbols a...h1129%macro ROTATE_ARGS 01130%xdefine TMP_ h1131%xdefine h g1132%xdefine g f1133%xdefine f e1134%xdefine e d1135%xdefine d c1136%xdefine c b1137%xdefine b a1138%xdefine a TMP_1139%endm1141%macro FOUR_ROUNDS_AND_SCHED 01142;; compute s0 four at a time and s1 two at a time1143;; compute W[-16] + W[-7] 4 at a time1144movdqa XTMP0, X31145mov y0, e ; y0 = e1146ror y0, (25-11) ; y0 = e >> (25-11)1147mov y1, a ; y1 = a1148palignr XTMP0, X2, 4 ; XTMP0 = W[-7]1149ror y1, (22-13) ; y1 = a >> (22-13)1150xor y0, e ; y0 = e ^ (e >> (25-11))1151mov y2, f ; y2 = f1152ror y0, (11-6) ; y0 = (e >> (11-6)) ^ (e >> (25-6))1153movdqa XTMP1, X11154xor y1, a ; y1 = a ^ (a >> (22-13)1155xor y2, g ; y2 = f^g1156paddd XTMP0, X0 ; XTMP0 = W[-7] + W[-16]1157xor y0, e ; y0 = e ^ (e >> (11-6)) ^ (e >> (25-6))1158and y2, e ; y2 = (f^g)&e1159ror y1, (13-2) ; y1 = (a >> (13-2)) ^ (a >> (22-2))1160;; compute s01161palignr XTMP1, X0, 4 ; XTMP1 = W[-15]1162xor y1, a ; y1 = a ^ (a >> (13-2)) ^ (a >> (22-2))1163ror y0, 6 ; y0 = S1 = (e>>6) & (e>>11) ^ (e>>25)1164xor y2, g ; y2 = CH = ((f^g)&e)^g1165movdqa XTMP2, XTMP1 ; XTMP2 = W[-15]1166ror y1, 2 ; y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22)1167add y2, y0 ; y2 = S1 + CH1168add y2, [rsp + _XFER + 0*4] ; y2 = k + w + S1 + CH1169movdqa XTMP3, XTMP1 ; XTMP3 = W[-15]1170mov y0, a ; y0 = a1171add h, y2 ; h = h + S1 + CH + k + w1172mov y2, a ; y2 = a1173pslld XTMP1, (32-7)1174or y0, c ; y0 = a|c1175add d, h ; d = d + h + S1 + CH + k + w1176and y2, c ; y2 = a&c1177psrld XTMP2, 71178and y0, b ; y0 = (a|c)&b1179add h, y1 ; h = h + S1 + CH + k + w + S01180por XTMP1, XTMP2 ; XTMP1 = W[-15] ror 71181or y0, y2 ; y0 = MAJ = (a|c)&b)|(a&c)1182add h, y0 ; h = h + S1 + CH + k + w + S0 + MAJ1184ROTATE_ARGS1185movdqa XTMP2, XTMP3 ; XTMP2 = W[-15]1186mov y0, e ; y0 = e1187mov y1, a ; y1 = a1188movdqa XTMP4, XTMP3 ; XTMP4 = W[-15]1189ror y0, (25-11) ; y0 = e >> (25-11)1190xor y0, e ; y0 = e ^ (e >> (25-11))1191mov y2, f ; y2 = f1192ror y1, (22-13) ; y1 = a >> (22-13)1193pslld XTMP3, (32-18)1194xor y1, a ; y1 = a ^ (a >> (22-13)1195ror y0, (11-6) ; y0 = (e >> (11-6)) ^ (e >> (25-6))1196xor y2, g ; y2 = f^g1197psrld XTMP2, 181198ror y1, (13-2) ; y1 = (a >> (13-2)) ^ (a >> (22-2))1199xor y0, e ; y0 = e ^ (e >> (11-6)) ^ (e >> (25-6))1200and y2, e ; y2 = (f^g)&e1201ror y0, 6 ; y0 = S1 = (e>>6) & (e>>11) ^ (e>>25)1202pxor XTMP1, XTMP31203xor y1, a ; y1 = a ^ (a >> (13-2)) ^ (a >> (22-2))1204xor y2, g ; y2 = CH = ((f^g)&e)^g1205psrld XTMP4, 3 ; XTMP4 = W[-15] >> 31206add y2, y0 ; y2 = S1 + CH1207add y2, [rsp + _XFER + 1*4] ; y2 = k + w + S1 + CH1208ror y1, 2 ; y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22)1209pxor XTMP1, XTMP2 ; XTMP1 = W[-15] ror 7 ^ W[-15] ror 181210mov y0, a ; y0 = a1211add h, y2 ; h = h + S1 + CH + k + w1212mov y2, a ; y2 = a1213pxor XTMP1, XTMP4 ; XTMP1 = s01214or y0, c ; y0 = a|c1215add d, h ; d = d + h + S1 + CH + k + w1216and y2, c ; y2 = a&c1217;; compute low s11218pshufd XTMP2, X3, 11111010b ; XTMP2 = W[-2] {BBAA}1219and y0, b ; y0 = (a|c)&b1220add h, y1 ; h = h + S1 + CH + k + w + S01221paddd XTMP0, XTMP1 ; XTMP0 = W[-16] + W[-7] + s01222or y0, y2 ; y0 = MAJ = (a|c)&b)|(a&c)1223add h, y0 ; h = h + S1 + CH + k + w + S0 + MAJ1225ROTATE_ARGS1226movdqa XTMP3, XTMP2 ; XTMP3 = W[-2] {BBAA}1227mov y0, e ; y0 = e1228mov y1, a ; y1 = a1229ror y0, (25-11) ; y0 = e >> (25-11)1230movdqa XTMP4, XTMP2 ; XTMP4 = W[-2] {BBAA}1231xor y0, e ; y0 = e ^ (e >> (25-11))1232ror y1, (22-13) ; y1 = a >> (22-13)1233mov y2, f ; y2 = f1234xor y1, a ; y1 = a ^ (a >> (22-13)1235ror y0, (11-6) ; y0 = (e >> (11-6)) ^ (e >> (25-6))1236psrlq XTMP2, 17 ; XTMP2 = W[-2] ror 17 {xBxA}1237xor y2, g ; y2 = f^g1238psrlq XTMP3, 19 ; XTMP3 = W[-2] ror 19 {xBxA}1239xor y0, e ; y0 = e ^ (e >> (11-6)) ^ (e >> (25-6))1240and y2, e ; y2 = (f^g)&e1241psrld XTMP4, 10 ; XTMP4 = W[-2] >> 10 {BBAA}1242ror y1, (13-2) ; y1 = (a >> (13-2)) ^ (a >> (22-2))1243xor y1, a ; y1 = a ^ (a >> (13-2)) ^ (a >> (22-2))1244xor y2, g ; y2 = CH = ((f^g)&e)^g1245ror y0, 6 ; y0 = S1 = (e>>6) & (e>>11) ^ (e>>25)1246pxor XTMP2, XTMP31247add y2, y0 ; y2 = S1 + CH1248ror y1, 2 ; y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22)1249add y2, [rsp + _XFER + 2*4] ; y2 = k + w + S1 + CH1250pxor XTMP4, XTMP2 ; XTMP4 = s1 {xBxA}
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.