diff --git a/pkg/utils/crypto/sha1/.gitignore b/pkg/utils/crypto/sha1/.gitignore new file mode 100644 index 000000000..a11ae5b8a --- /dev/null +++ b/pkg/utils/crypto/sha1/.gitignore @@ -0,0 +1 @@ +*.syso \ No newline at end of file diff --git a/pkg/utils/crypto/sha1/LICENSE b/pkg/utils/crypto/sha1/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/pkg/utils/crypto/sha1/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/utils/crypto/sha1/sha1.go b/pkg/utils/crypto/sha1/sha1.go index 866dc4a38..7158a4038 100644 --- a/pkg/utils/crypto/sha1/sha1.go +++ b/pkg/utils/crypto/sha1/sha1.go @@ -1,3 +1,12 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file of +// Golang project: +// https://github.com/golang/go/blob/master/LICENSE + +// Using this part of Minio codebase under the license +// Apache License Version 2.0 with modifications + // Package sha1 implements the SHA1 hash algorithm as defined in RFC 3174. package sha1 @@ -52,6 +61,8 @@ func block(dig *digest, p []byte) { switch true { case cpu.HasAVX2() == true: blockAVX2(dig, p) + case cpu.HasSSE41() == true: + blockSSE3(dig, p) default: blockGeneric(dig, p) } diff --git a/pkg/utils/crypto/sha1/sha1_amd64.S b/pkg/utils/crypto/sha1/sha1_amd64.S index 2599b70c3..49887325d 100644 --- a/pkg/utils/crypto/sha1/sha1_amd64.S +++ b/pkg/utils/crypto/sha1/sha1_amd64.S @@ -59,14 +59,19 @@ * SHA-1 implementation with Intel(R) AVX2 instruction set extensions. * *This implementation is based on the previous SSSE3 release: - *Visit http://software.intel.com/en-us/articles/ - *and refer to improving-the-performance-of-the-secure-hash-algorithm-1/ + * https://software.intel.com/en-us/articles/improving-the-performance-of-the-secure-hash-algorithm-1 * *Updates 20-byte SHA-1 record in 'hash' for even number of *'num_blocks' consecutive 64-byte blocks * */ +/* + * Using this part of Minio codebase under the license + * Apache License Version 2.0 with modifications + * + */ + #ifdef HAS_AVX2 #ifndef ENTRY #define ENTRY(name) \ diff --git a/pkg/utils/crypto/sha1/sha1_gen.go b/pkg/utils/crypto/sha1/sha1_gen.go index ecd1c842c..6386d80e9 100644 --- a/pkg/utils/crypto/sha1/sha1_gen.go +++ b/pkg/utils/crypto/sha1/sha1_gen.go @@ -1,5 +1,21 @@ // +build ignore +// +// Mini Object Storage, (C) 2015 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + package main import ( diff --git a/pkg/utils/crypto/sha1/sha1_sse3_amd64.asm b/pkg/utils/crypto/sha1/sha1_sse3_amd64.asm new file mode 100644 index 000000000..e91967a6f --- /dev/null +++ b/pkg/utils/crypto/sha1/sha1_sse3_amd64.asm @@ -0,0 +1,579 @@ +;--------------------- +; https://software.intel.com/en-us/articles/improving-the-performance-of-the-secure-hash-algorithm-1 +; +; License information: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; This implementation notably advances the performance of SHA-1 algorithm compared to existing +; implementations. We are encouraging all projects utilizing SHA-1 to integrate this new fast +; implementation and are ready to help if issues or concerns arise (you are welcome to leave +; a comment or write an email to the authors). It is provided 'as is' and free for either +; commercial or non-commercial use. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; This code implements two interfaces of SHA-1 update function: 1) working on a single +; 64-byte block and 2) working on a buffer of multiple 64-bit blocks. Multiple blocks +; version of code is software pipelined and faster overall, it is a default. Assemble +; with -DINTEL_SHA1_SINGLEBLOCK to select single 64-byte block function interface. +; +; C++ prototypes of implemented functions are below: +; +; #ifndef INTEL_SHA1_SINGLEBLOCK +; // Updates 20-byte SHA-1 record in 'hash' for 'num_blocks' consequtive 64-byte blocks +; extern "C" void sha1_update_intel(int *hash, const char* input, size_t num_blocks ); +; #else +; // Updates 20-byte SHA-1 record in 'hash' for one 64-byte block pointed by 'input' +; extern "C" void sha1_update_intel(int *hash, const char* input); +; #endif +; +; Function name 'sha1_update_intel' can be changed in the source or via macro: +; -DINTEL_SHA1_UPDATE_FUNCNAME=my_sha1_update_func_name +; +; It implements both UNIX(default) and Windows ABIs, use -DWIN_ABI on Windows +; +; Code checks CPU for SSSE3 support via CPUID feature flag (CPUID.1.ECX.SSSE3[bit 9]==1), +; and performs dispatch. Since in most cases the functionality on non-SSSE3 supporting CPUs +; is also required, the default (e.g. one being replaced) function can be provided for +; dispatch on such CPUs, the name of old function can be changed in the source or via macro: +; -DINTEL_SHA1_UPDATE_DEFAULT_DISPATCH=default_sha1_update_function_name +; +; Authors: Maxim Locktyukhin and Ronen Zohar at Intel.com +; + +%ifndef INTEL_SHA1_UPDATE_DEFAULT_DISPATCH + ;; can be replaced with a default SHA-1 update function name +%define INTEL_SHA1_UPDATE_DEFAULT_DISPATCH sha1_intel_non_ssse3_cpu_stub_ +%else +extern INTEL_SHA1_UPDATE_DEFAULT_DISPATCH +%endif + +;; provide alternative SHA-1 update function's name here +%ifndef INTEL_SHA1_UPDATE_FUNCNAME +%define INTEL_SHA1_UPDATE_FUNCNAME sha1_update_intel +%endif + +global INTEL_SHA1_UPDATE_FUNCNAME + + +%ifndef INTEL_SHA1_SINGLEBLOCK +%assign multiblock 1 +%else +%assign multiblock 0 +%endif + + +bits 64 +default rel + +%ifdef WIN_ABI + %xdefine arg1 rcx + %xdefine arg2 rdx + %xdefine arg3 r8 +%else + %xdefine arg1 rdi + %xdefine arg2 rsi + %xdefine arg3 rdx +%endif + +%xdefine ctx arg1 +%xdefine buf arg2 +%xdefine cnt arg3 + +%macro REGALLOC 0 + %xdefine A ecx + %xdefine B esi + %xdefine C edi + %xdefine D ebp + %xdefine E edx + + %xdefine T1 eax + %xdefine T2 ebx +%endmacro + +%xdefine K_BASE r8 +%xdefine HASH_PTR r9 +%xdefine BUFFER_PTR r10 +%xdefine BUFFER_END r11 + +%xdefine W_TMP xmm0 +%xdefine W_TMP2 xmm9 + +%xdefine W0 xmm1 +%xdefine W4 xmm2 +%xdefine W8 xmm3 +%xdefine W12 xmm4 +%xdefine W16 xmm5 +%xdefine W20 xmm6 +%xdefine W24 xmm7 +%xdefine W28 xmm8 + +%xdefine XMM_SHUFB_BSWAP xmm10 + +;; we keep window of 64 w[i]+K pre-calculated values in a circular buffer +%xdefine WK(t) (rsp + (t & 15)*4) + +;------------------------------------------------------------------------------ +; +; macro implements SHA-1 function's body for single or several 64-byte blocks +; first param: function's name +; second param: =0 - function implements single 64-byte block hash +; =1 - function implements multiple64-byte blocks hash +; 3rd function's argument is a number, greater 0, of 64-byte blocks to calc hash for +; +%macro SHA1_VECTOR_ASM 2 +align 4096 +%1: + push rbx + push rbp + + %ifdef WIN_ABI + push rdi + push rsi + + %xdefine stack_size (16*4 + 16*5 + 8) + %else + %xdefine stack_size (16*4 + 8) + %endif + + sub rsp, stack_size + + %ifdef WIN_ABI + %xdefine xmm_save_base (rsp + 16*4) + + xmm_mov [xmm_save_base + 0*16], xmm6 + xmm_mov [xmm_save_base + 1*16], xmm7 + xmm_mov [xmm_save_base + 2*16], xmm8 + xmm_mov [xmm_save_base + 3*16], xmm9 + xmm_mov [xmm_save_base + 4*16], xmm10 + %endif + + mov HASH_PTR, ctx + mov BUFFER_PTR, buf + + %if (%2 == 1) + shl cnt, 6 ;; mul by 64 + add cnt, buf + mov BUFFER_END, cnt + %endif + + lea K_BASE, [K_XMM_AR] + xmm_mov XMM_SHUFB_BSWAP, [bswap_shufb_ctl] + + SHA1_PIPELINED_MAIN_BODY %2 + + %ifdef WIN_ABI + xmm_mov xmm6, [xmm_save_base + 0*16] + xmm_mov xmm7, [xmm_save_base + 1*16] + xmm_mov xmm8, [xmm_save_base + 2*16] + xmm_mov xmm9, [xmm_save_base + 3*16] + xmm_mov xmm10,[xmm_save_base + 4*16] + %endif + + add rsp, stack_size + + %ifdef WIN_ABI + pop rsi + pop rdi + %endif + + pop rbp + pop rbx + + ret +%endmacro + +;-------------------------------------------- +; macro implements 80 rounds of SHA-1, for one 64-byte block or multiple blocks with s/w pipelining +; macro param: =0 - process single 64-byte block +; =1 - multiple blocks +; +%macro SHA1_PIPELINED_MAIN_BODY 1 + + REGALLOC + + mov A, [HASH_PTR ] + mov B, [HASH_PTR+ 4] + mov C, [HASH_PTR+ 8] + mov D, [HASH_PTR+12] + + mov E, [HASH_PTR+16] + + %assign i 0 + %rep W_PRECALC_AHEAD + W_PRECALC i + %assign i i+1 + %endrep + + %xdefine F F1 + + %if (%1 == 1) ;; code loops through more than one block + %%_loop: + cmp BUFFER_PTR, K_BASE ;; we use K_BASE value as a signal of a last block, + jne %%_begin ;; it is set below by: cmovae BUFFER_PTR, K_BASE + jmp %%_end + + align 32 + %%_begin: + %endif + RR A,B,C,D,E,0 + RR D,E,A,B,C,2 + RR B,C,D,E,A,4 + RR E,A,B,C,D,6 + RR C,D,E,A,B,8 + + RR A,B,C,D,E,10 + RR D,E,A,B,C,12 + RR B,C,D,E,A,14 + RR E,A,B,C,D,16 + RR C,D,E,A,B,18 + + %xdefine F F2 + + RR A,B,C,D,E,20 + RR D,E,A,B,C,22 + RR B,C,D,E,A,24 + RR E,A,B,C,D,26 + RR C,D,E,A,B,28 + + RR A,B,C,D,E,30 + RR D,E,A,B,C,32 + RR B,C,D,E,A,34 + RR E,A,B,C,D,36 + RR C,D,E,A,B,38 + + %xdefine F F3 + + RR A,B,C,D,E,40 + RR D,E,A,B,C,42 + RR B,C,D,E,A,44 + RR E,A,B,C,D,46 + RR C,D,E,A,B,48 + + RR A,B,C,D,E,50 + RR D,E,A,B,C,52 + RR B,C,D,E,A,54 + RR E,A,B,C,D,56 + RR C,D,E,A,B,58 + + %xdefine F F4 + + %if (%1 == 1) ;; if code loops through more than one block + add BUFFER_PTR, 64 ;; move to next 64-byte block + cmp BUFFER_PTR, BUFFER_END ;; check if current block is the last one + cmovae BUFFER_PTR, K_BASE ;; smart way to signal the last iteration + %else + %xdefine W_NO_TAIL_PRECALC 1 ;; no software pipelining for single block interface + %endif + + RR A,B,C,D,E,60 + RR D,E,A,B,C,62 + RR B,C,D,E,A,64 + RR E,A,B,C,D,66 + RR C,D,E,A,B,68 + + RR A,B,C,D,E,70 + RR D,E,A,B,C,72 + RR B,C,D,E,A,74 + RR E,A,B,C,D,76 + RR C,D,E,A,B,78 + + UPDATE_HASH [HASH_PTR ],A + UPDATE_HASH [HASH_PTR+ 4],B + UPDATE_HASH [HASH_PTR+ 8],C + UPDATE_HASH [HASH_PTR+12],D + UPDATE_HASH [HASH_PTR+16],E + + %if (%1 == 1) + jmp %%_loop + + align 32 + %%_end: + %endif + + + %xdefine W_NO_TAIL_PRECALC 0 + %xdefine F %error + +%endmacro + + +%macro F1 3 + mov T1,%2 + xor T1,%3 + and T1,%1 + xor T1,%3 +%endmacro + +%macro F2 3 + mov T1,%3 + xor T1,%2 + xor T1,%1 +%endmacro + +%macro F3 3 + mov T1,%2 + mov T2,%1 + or T1,%1 + and T2,%2 + and T1,%3 + or T1,T2 +%endmacro + +%define F4 F2 + +%macro UPDATE_HASH 2 + add %2, %1 + mov %1, %2 +%endmacro + + +%macro W_PRECALC 1 + %xdefine i (%1) + + %if (i < 20) + %xdefine K_XMM 0 + %elif (i < 40) + %xdefine K_XMM 16 + %elif (i < 60) + %xdefine K_XMM 32 + %else + %xdefine K_XMM 48 + %endif + + %if (i<16 || (i>=80 && i<(80 + W_PRECALC_AHEAD))) + + %if (W_NO_TAIL_PRECALC == 0) + + %xdefine i ((%1) % 80) ;; pre-compute for the next iteration + + %if (i == 0) + W_PRECALC_RESET + %endif + + + W_PRECALC_00_15 + %endif + + %elif (i < 32) + W_PRECALC_16_31 + %elif (i < 80) ;; rounds 32-79 + W_PRECALC_32_79 + %endif +%endmacro + +%macro W_PRECALC_RESET 0 + %xdefine W W0 + %xdefine W_minus_04 W4 + %xdefine W_minus_08 W8 + %xdefine W_minus_12 W12 + %xdefine W_minus_16 W16 + %xdefine W_minus_20 W20 + %xdefine W_minus_24 W24 + %xdefine W_minus_28 W28 + %xdefine W_minus_32 W +%endmacro + +%macro W_PRECALC_ROTATE 0 + %xdefine W_minus_32 W_minus_28 + %xdefine W_minus_28 W_minus_24 + %xdefine W_minus_24 W_minus_20 + %xdefine W_minus_20 W_minus_16 + %xdefine W_minus_16 W_minus_12 + %xdefine W_minus_12 W_minus_08 + %xdefine W_minus_08 W_minus_04 + %xdefine W_minus_04 W + %xdefine W W_minus_32 +%endmacro + +%xdefine W_PRECALC_AHEAD 16 +%xdefine W_NO_TAIL_PRECALC 0 + + +%xdefine xmm_mov movdqa + +%macro W_PRECALC_00_15 0 + ;; message scheduling pre-compute for rounds 0-15 + %if ((i & 3) == 0) ;; blended SSE and ALU instruction scheduling, 1 vector iteration per 4 rounds + movdqu W_TMP, [BUFFER_PTR + (i * 4)] + %elif ((i & 3) == 1) + pshufb W_TMP, XMM_SHUFB_BSWAP + movdqa W, W_TMP + %elif ((i & 3) == 2) + paddd W_TMP, [K_BASE] + %elif ((i & 3) == 3) + movdqa [WK(i&~3)], W_TMP + + W_PRECALC_ROTATE + %endif +%endmacro + +%macro W_PRECALC_16_31 0 + ;; message scheduling pre-compute for rounds 16-31 + ;; calculating last 32 w[i] values in 8 XMM registers + ;; pre-calculate K+w[i] values and store to mem, for later load by ALU add instruction + ;; + ;; "brute force" vectorization for rounds 16-31 only due to w[i]->w[i-3] dependency + ;; + %if ((i & 3) == 0) ;; blended SSE and ALU instruction scheduling, 1 vector iteration per 4 rounds + movdqa W, W_minus_12 + palignr W, W_minus_16, 8 ;; w[i-14] + movdqa W_TMP, W_minus_04 + psrldq W_TMP, 4 ;; w[i-3] + pxor W, W_minus_08 + %elif ((i & 3) == 1) + pxor W_TMP, W_minus_16 + pxor W, W_TMP + movdqa W_TMP2, W + movdqa W_TMP, W + pslldq W_TMP2, 12 + %elif ((i & 3) == 2) + psrld W, 31 + pslld W_TMP, 1 + por W_TMP, W + movdqa W, W_TMP2 + psrld W_TMP2, 30 + pslld W, 2 + %elif ((i & 3) == 3) + pxor W_TMP, W + pxor W_TMP, W_TMP2 + movdqa W, W_TMP + paddd W_TMP, [K_BASE + K_XMM] + movdqa [WK(i&~3)],W_TMP + + W_PRECALC_ROTATE + %endif +%endmacro + +%macro W_PRECALC_32_79 0 + ;; in SHA-1 specification: w[i] = (w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]) rol 1 + ;; instead we do equal: w[i] = (w[i-6] ^ w[i-16] ^ w[i-28] ^ w[i-32]) rol 2 + ;; allows more efficient vectorization since w[i]=>w[i-3] dependency is broken + ;; + %if ((i & 3) == 0) ;; blended SSE and ALU instruction scheduling, 1 vector iteration per 4 rounds + movdqa W_TMP, W_minus_04 + pxor W, W_minus_28 ;; W is W_minus_32 before xor + palignr W_TMP, W_minus_08, 8 + %elif ((i & 3) == 1) + pxor W, W_minus_16 + pxor W, W_TMP + movdqa W_TMP, W + %elif ((i & 3) == 2) + psrld W, 30 + pslld W_TMP, 2 + por W_TMP, W + %elif ((i & 3) == 3) + movdqa W, W_TMP + paddd W_TMP, [K_BASE + K_XMM] + movdqa [WK(i&~3)],W_TMP + + W_PRECALC_ROTATE + %endif +%endmacro + +%macro RR 6 ;; RR does two rounds of SHA-1 back to back with W pre-calculation + + ;; TEMP = A + ;; A = F( i, B, C, D ) + E + ROTATE_LEFT( A, 5 ) + W[i] + K(i) + ;; C = ROTATE_LEFT( B, 30 ) + ;; D = C + ;; E = D + ;; B = TEMP + + W_PRECALC (%6 + W_PRECALC_AHEAD) + F %2, %3, %4 ;; F returns result in T1 + add %5, [WK(%6)] + rol %2, 30 + mov T2, %1 + add %4, [WK(%6 + 1)] + rol T2, 5 + add %5, T1 + + W_PRECALC (%6 + W_PRECALC_AHEAD + 1) + add T2, %5 + mov %5, T2 + rol T2, 5 + add %4, T2 + F %1, %2, %3 ;; F returns result in T1 + add %4, T1 + rol %1, 30 + +;; write: %1, %2 +;; rotate: %1<=%4, %2<=%5, %3<=%1, %4<=%2, %5<=%3 +%endmacro + + + +;;---------------------- +section .data align=128 + +%xdefine K1 0x5a827999 +%xdefine K2 0x6ed9eba1 +%xdefine K3 0x8f1bbcdc +%xdefine K4 0xca62c1d6 + +align 128 +K_XMM_AR: + DD K1, K1, K1, K1 + DD K2, K2, K2, K2 + DD K3, K3, K3, K3 + DD K4, K4, K4, K4 + +align 16 +bswap_shufb_ctl: + DD 00010203h + DD 04050607h + DD 08090a0bh + DD 0c0d0e0fh + +;; dispatch pointer, points to the init routine for the first invocation +sha1_update_intel_dispatched: + DQ sha1_update_intel_init_ + +;;---------------------- +section .text align=4096 + +SHA1_VECTOR_ASM sha1_update_intel_ssse3_, multiblock + +align 32 +sha1_update_intel_init_: ;; we get here with the first time invocation + call sha1_update_intel_dispacth_init_ +INTEL_SHA1_UPDATE_FUNCNAME: ;; we get here after init + jmp qword [sha1_update_intel_dispatched] + +;; CPUID feature flag based dispatch +sha1_update_intel_dispacth_init_: + push rax + push rbx + push rcx + push rdx + push rsi + + lea rsi, [INTEL_SHA1_UPDATE_DEFAULT_DISPATCH] + + mov eax, 1 + cpuid + + test ecx, 0200h ;; SSSE3 support, CPUID.1.ECX[bit 9] + jz _done + + lea rsi, [sha1_update_intel_ssse3_] + +_done: + mov [sha1_update_intel_dispatched], rsi + + pop rsi + pop rdx + pop rcx + pop rbx + pop rax + ret + +;;---------------------- +;; in the case a default SHA-1 update function implementation was not provided +;; and code was invoked on a non-SSSE3 supporting CPU, dispatch handles this +;; failure in a safest way - jumps to the stub function with UD2 instruction below +sha1_intel_non_ssse3_cpu_stub_: + ud2 ;; in the case no default SHA-1 was provided non-SSSE3 CPUs safely fail here + ret + +; END +;---------------------- diff --git a/pkg/utils/crypto/sha1/sha1_test.go b/pkg/utils/crypto/sha1/sha1_test.go index 325b25d72..bf95ede01 100644 --- a/pkg/utils/crypto/sha1/sha1_test.go +++ b/pkg/utils/crypto/sha1/sha1_test.go @@ -1,3 +1,12 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file of +// Golang project: +// https://github.com/golang/go/blob/master/LICENSE + +// Using this part of Minio codebase under the license +// Apache License Version 2.0 with modifications + // SHA1 hash algorithm. See RFC 3174. package sha1 diff --git a/pkg/utils/crypto/sha1/sha1_yasm_darwin.go b/pkg/utils/crypto/sha1/sha1_yasm_darwin.go new file mode 100644 index 000000000..233c883c2 --- /dev/null +++ b/pkg/utils/crypto/sha1/sha1_yasm_darwin.go @@ -0,0 +1,5 @@ +// !build amd64 + +package sha1 + +//go:generate yasm -f macho64 sha1_sse3_amd64.asm -o sha1_sse3_amd64.syso diff --git a/pkg/utils/crypto/sha1/sha1_yasm_linux.go b/pkg/utils/crypto/sha1/sha1_yasm_linux.go new file mode 100644 index 000000000..383880a02 --- /dev/null +++ b/pkg/utils/crypto/sha1/sha1_yasm_linux.go @@ -0,0 +1,5 @@ +// !build amd64 + +package sha1 + +//go:generate yasm -f elf64 sha1_sse3_amd64.asm -o sha1_sse3_amd64.syso diff --git a/pkg/utils/crypto/sha1/sha1_yasm_windows.go b/pkg/utils/crypto/sha1/sha1_yasm_windows.go new file mode 100644 index 000000000..6d817bc8b --- /dev/null +++ b/pkg/utils/crypto/sha1/sha1_yasm_windows.go @@ -0,0 +1,5 @@ +// !build amd64 + +package sha1 + +//go:generate yasm -f win64 -DWIN_ABI=1 sha1_sse3_amd64.asm -o sha1_sse3_amd64.syso diff --git a/pkg/utils/crypto/sha1/sha1block.go b/pkg/utils/crypto/sha1/sha1block.go index 1d29c2624..82b4c9144 100644 --- a/pkg/utils/crypto/sha1/sha1block.go +++ b/pkg/utils/crypto/sha1/sha1block.go @@ -6,6 +6,7 @@ package sha1 // #include // #include // void sha1_transform(int32_t *hash, const char* input, size_t num_blocks); +// void sha1_update_intel(int32_t *hash, const char* input, size_t num_blocks ); import "C" import "unsafe" @@ -20,6 +21,10 @@ func blockAVX2(dig *digest, p []byte) { C.sha1_transform((*C.int32_t)(unsafe.Pointer(&dig.h[0])), (*C.char)(unsafe.Pointer(&p[0])), (C.size_t)(len(p)/chunk)) } +func blockSSE3(dig *digest, p []byte) { + C.sha1_update_intel((*C.int32_t)(unsafe.Pointer(&dig.h[0])), (*C.char)(unsafe.Pointer(&p[0])), (C.size_t)(len(p)/chunk)) +} + // blockGeneric is a portable, pure Go version of the SHA1 block step. // It's used by sha1block_generic.go and tests. func blockGeneric(dig *digest, p []byte) { diff --git a/pkg/utils/crypto/sha256/LICENSE b/pkg/utils/crypto/sha256/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/pkg/utils/crypto/sha256/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/utils/crypto/sha256/sha256-avx-asm.S b/pkg/utils/crypto/sha256/sha256-avx-asm.S index 435c69ab1..d644491b6 100644 --- a/pkg/utils/crypto/sha256/sha256-avx-asm.S +++ b/pkg/utils/crypto/sha256/sha256-avx-asm.S @@ -46,6 +46,9 @@ ######################################################################## # This code schedules 1 block at a time, with 4 lanes per block ######################################################################## +# Using this part of Minio codebase under the license +# Apache License Version 2.0 with modifications +## #ifdef HAS_AVX #ifndef ENTRY @@ -451,7 +454,7 @@ a = TMP_ or y2, y0 # y0 = MAJ = (a|c)&b)|(a&c) add y0, h # h = h + S1 + CH + k + w + S0 + MAJ ROTATE_ARGS - mov e, y0 # y0 = e + mov e, y0 # y0 = e mov a, y1 # y1 = a MY_ROR (25-11), y0 # y0 = e >> (25-11) xor e, y0 # y0 = e ^ (e >> (25-11)) diff --git a/pkg/utils/crypto/sha256/sha256-avx2-asm.S b/pkg/utils/crypto/sha256/sha256-avx2-asm.S index 2f18569db..ecbd69347 100644 --- a/pkg/utils/crypto/sha256/sha256-avx2-asm.S +++ b/pkg/utils/crypto/sha256/sha256-avx2-asm.S @@ -47,6 +47,9 @@ ######################################################################## # This code schedules 2 blocks at a time, with 4 lanes per block ######################################################################## +# Using this part of Minio codebase under the license +# Apache License Version 2.0 with modifications +## #ifdef HAS_AVX2 #ifndef ENTRY diff --git a/pkg/utils/crypto/sha256/sha256-ssse3-asm.S b/pkg/utils/crypto/sha256/sha256-ssse3-asm.S index 2d8410383..55f8cfb2f 100644 --- a/pkg/utils/crypto/sha256/sha256-ssse3-asm.S +++ b/pkg/utils/crypto/sha256/sha256-ssse3-asm.S @@ -45,6 +45,10 @@ # and search for that title. # ######################################################################## +# +# Using this part of Minio codebase under the license +# Apache License Version 2.0 with modifications +## #ifdef HAS_SSE41 #ifndef ENTRY diff --git a/pkg/utils/crypto/sha256/sha256.go b/pkg/utils/crypto/sha256/sha256.go index 504c5a4cb..70f072c91 100644 --- a/pkg/utils/crypto/sha256/sha256.go +++ b/pkg/utils/crypto/sha256/sha256.go @@ -1,3 +1,12 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file of +// Golang project: +// https://github.com/golang/go/blob/master/LICENSE + +// Using this part of Minio codebase under the license +// Apache License Version 2.0 with modifications + // Package sha256 SHA256SSE3, SHA256AVX, SHA256AVX2 package sha256 diff --git a/pkg/utils/crypto/sha256/sha256_gen.go b/pkg/utils/crypto/sha256/sha256_gen.go index 58ae1ef2d..6c73bce72 100644 --- a/pkg/utils/crypto/sha256/sha256_gen.go +++ b/pkg/utils/crypto/sha256/sha256_gen.go @@ -1,5 +1,21 @@ // +build ignore +// +// Mini Object Storage, (C) 2015 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + package main import ( diff --git a/pkg/utils/crypto/sha256/sha256_test.go b/pkg/utils/crypto/sha256/sha256_test.go index 8fa774e4d..424ff3919 100644 --- a/pkg/utils/crypto/sha256/sha256_test.go +++ b/pkg/utils/crypto/sha256/sha256_test.go @@ -1,3 +1,12 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file of +// Golang project: +// https://github.com/golang/go/blob/master/LICENSE + +// Using this part of Minio codebase under the license +// Apache License Version 2.0 with modifications + // SHA256 hash algorithm. See FIPS 180-2. package sha256 diff --git a/pkg/utils/crypto/sha256/sha256block.go b/pkg/utils/crypto/sha256/sha256block.go index 7bead88e9..3dec8873b 100644 --- a/pkg/utils/crypto/sha256/sha256block.go +++ b/pkg/utils/crypto/sha256/sha256block.go @@ -1,5 +1,21 @@ // +build amd64 +// +// Mini Object Storage, (C) 2015 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + package sha256 // #cgo CFLAGS: -DHAS_SSE41 -DHAS_AVX -DHAS_AVX2 diff --git a/pkg/utils/crypto/sha512/LICENSE b/pkg/utils/crypto/sha512/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/pkg/utils/crypto/sha512/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/utils/crypto/sha512/sha512-avx-asm.S b/pkg/utils/crypto/sha512/sha512-avx-asm.S index 45333f1a4..61971f2de 100644 --- a/pkg/utils/crypto/sha512/sha512-avx-asm.S +++ b/pkg/utils/crypto/sha512/sha512-avx-asm.S @@ -46,6 +46,9 @@ # and search for that title. # ######################################################################## +# Using this part of Minio codebase under the license +# Apache License Version 2.0 with modifications +## #ifdef HAS_AVX #ifndef ENTRY diff --git a/pkg/utils/crypto/sha512/sha512-avx2-asm.S b/pkg/utils/crypto/sha512/sha512-avx2-asm.S index e226155e3..b3a0c66b5 100644 --- a/pkg/utils/crypto/sha512/sha512-avx2-asm.S +++ b/pkg/utils/crypto/sha512/sha512-avx2-asm.S @@ -48,6 +48,9 @@ ######################################################################## # This code schedules 1 blocks at a time, with 4 lanes per block ######################################################################## +# Using this part of Minio codebase under the license +# Apache License Version 2.0 with modifications +## #ifdef HAS_AVX2 #ifndef ENTRY diff --git a/pkg/utils/crypto/sha512/sha512-ssse3-asm.S b/pkg/utils/crypto/sha512/sha512-ssse3-asm.S index 491104990..57c06caea 100644 --- a/pkg/utils/crypto/sha512/sha512-ssse3-asm.S +++ b/pkg/utils/crypto/sha512/sha512-ssse3-asm.S @@ -46,6 +46,9 @@ # and search for that title. # ######################################################################## +# Using this part of Minio codebase under the license +# Apache License Version 2.0 with modifications +## #ifdef HAS_SSE41 #ifndef ENTRY diff --git a/pkg/utils/crypto/sha512/sha512.go b/pkg/utils/crypto/sha512/sha512.go index cc42a25ce..b06109d17 100644 --- a/pkg/utils/crypto/sha512/sha512.go +++ b/pkg/utils/crypto/sha512/sha512.go @@ -1,3 +1,12 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file of +// Golang project: +// https://github.com/golang/go/blob/master/LICENSE + +// Using this part of Minio codebase under the license +// Apache License Version 2.0 with modifications + // Package sha512 implements the SHA512 hash algorithms as defined // in FIPS 180-2. package sha512 diff --git a/pkg/utils/crypto/sha512/sha512_gen.go b/pkg/utils/crypto/sha512/sha512_gen.go index d95aac70c..9641e19f0 100644 --- a/pkg/utils/crypto/sha512/sha512_gen.go +++ b/pkg/utils/crypto/sha512/sha512_gen.go @@ -1,5 +1,21 @@ // +build ignore +// +// Mini Object Storage, (C) 2015 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + package main import ( diff --git a/pkg/utils/crypto/sha512/sha512_test.go b/pkg/utils/crypto/sha512/sha512_test.go index 756cefb9d..d97857c34 100644 --- a/pkg/utils/crypto/sha512/sha512_test.go +++ b/pkg/utils/crypto/sha512/sha512_test.go @@ -1,3 +1,12 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file of +// Golang project: +// https://github.com/golang/go/blob/master/LICENSE + +// Using this part of Minio codebase under the license +// Apache License Version 2.0 with modifications + // SHA512 hash algorithm. See FIPS 180-2. package sha512 diff --git a/pkg/utils/crypto/sha512/sha512block.go b/pkg/utils/crypto/sha512/sha512block.go index a58f25c2e..34a272be4 100644 --- a/pkg/utils/crypto/sha512/sha512block.go +++ b/pkg/utils/crypto/sha512/sha512block.go @@ -1,5 +1,21 @@ // +build amd64 +// +// Mini Object Storage, (C) 2015 Minio, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + package sha512 // #cgo CFLAGS: -DHAS_SSE41 -DHAS_AVX -DHAS_AVX2