@ttsc/linux-x64 0.14.0-dev.20260529.2 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/bin/go/LICENSE +27 -0
  2. package/bin/go/PATENTS +22 -0
  3. package/bin/go/VERSION +2 -2
  4. package/bin/go/bin/go +0 -0
  5. package/bin/go/bin/gofmt +0 -0
  6. package/bin/go/lib/time/zoneinfo.zip +0 -0
  7. package/bin/go/pkg/tool/linux_amd64/asm +0 -0
  8. package/bin/go/pkg/tool/linux_amd64/cgo +0 -0
  9. package/bin/go/pkg/tool/linux_amd64/compile +0 -0
  10. package/bin/go/pkg/tool/linux_amd64/cover +0 -0
  11. package/bin/go/pkg/tool/linux_amd64/fix +0 -0
  12. package/bin/go/pkg/tool/linux_amd64/link +0 -0
  13. package/bin/go/pkg/tool/linux_amd64/preprofile +0 -0
  14. package/bin/go/pkg/tool/linux_amd64/vet +0 -0
  15. package/bin/go/src/archive/tar/format.go +6 -0
  16. package/bin/go/src/archive/tar/reader.go +24 -4
  17. package/bin/go/src/builtin/builtin.go +13 -4
  18. package/bin/go/src/crypto/fips140/fips140.go +6 -0
  19. package/bin/go/src/crypto/internal/fips140/drbg/entropy_fips140.go +97 -0
  20. package/bin/go/src/crypto/internal/fips140/drbg/entropy_wasm.go +11 -0
  21. package/bin/go/src/crypto/internal/fips140/drbg/rand.go +1 -75
  22. package/bin/go/src/crypto/tls/conn.go +7 -3
  23. package/bin/go/src/crypto/tls/handshake_client_tls13.go +2 -2
  24. package/bin/go/src/crypto/tls/handshake_server_tls13.go +2 -2
  25. package/bin/go/src/crypto/tls/key_schedule.go +24 -3
  26. package/bin/go/src/crypto/x509/constraints.go +33 -33
  27. package/bin/go/src/crypto/x509/verify.go +28 -13
  28. package/bin/go/src/go/types/builtins.go +2 -2
  29. package/bin/go/src/go/types/signature.go +3 -0
  30. package/bin/go/src/go/types/under.go +3 -3
  31. package/bin/go/src/go.mod +1 -1
  32. package/bin/go/src/go.sum +2 -2
  33. package/bin/go/src/html/template/attr_string.go +3 -2
  34. package/bin/go/src/html/template/context.go +21 -1
  35. package/bin/go/src/html/template/element_string.go +3 -2
  36. package/bin/go/src/html/template/escape.go +16 -2
  37. package/bin/go/src/html/template/js.go +1 -0
  38. package/bin/go/src/html/template/state_string.go +5 -3
  39. package/bin/go/src/html/template/transition.go +43 -6
  40. package/bin/go/src/internal/buildcfg/zbootstrap.go +2 -2
  41. package/bin/go/src/internal/godebugs/table.go +1 -0
  42. package/bin/go/src/internal/poll/fd_windows.go +64 -38
  43. package/bin/go/src/internal/poll/fstatat_unix.go +22 -0
  44. package/bin/go/src/internal/poll/sendfile_windows.go +3 -1
  45. package/bin/go/src/internal/runtime/syscall/linux/defs_linux_386.go +1 -0
  46. package/bin/go/src/internal/runtime/syscall/linux/defs_linux_amd64.go +1 -0
  47. package/bin/go/src/internal/runtime/syscall/linux/defs_linux_arm.go +1 -0
  48. package/bin/go/src/internal/runtime/syscall/linux/defs_linux_arm64.go +1 -0
  49. package/bin/go/src/internal/runtime/syscall/linux/defs_linux_loong64.go +1 -0
  50. package/bin/go/src/internal/runtime/syscall/linux/defs_linux_mips64x.go +1 -0
  51. package/bin/go/src/internal/runtime/syscall/linux/defs_linux_mipsx.go +1 -0
  52. package/bin/go/src/internal/runtime/syscall/linux/defs_linux_ppc64x.go +1 -0
  53. package/bin/go/src/internal/runtime/syscall/linux/defs_linux_riscv64.go +1 -0
  54. package/bin/go/src/internal/runtime/syscall/linux/defs_linux_s390x.go +1 -0
  55. package/bin/go/src/internal/runtime/syscall/linux/syscall_linux.go +14 -0
  56. package/bin/go/src/internal/syscall/unix/at.go +0 -17
  57. package/bin/go/src/internal/syscall/unix/at_sysnum_linux.go +2 -1
  58. package/bin/go/src/internal/syscall/unix/fchmodat_linux.go +51 -0
  59. package/bin/go/src/internal/syscall/unix/fchmodat_other.go +29 -0
  60. package/bin/go/src/internal/syscall/windows/at_windows.go +20 -3
  61. package/bin/go/src/internal/syscall/windows/registry/key.go +10 -2
  62. package/bin/go/src/internal/syscall/windows/registry/value.go +5 -1
  63. package/bin/go/src/internal/syscall/windows/syscall_windows.go +4 -0
  64. package/bin/go/src/internal/syscall/windows/types_windows.go +82 -0
  65. package/bin/go/src/internal/syscall/windows/zsyscall_windows.go +27 -0
  66. package/bin/go/src/net/cgo_unix.go +4 -1
  67. package/bin/go/src/net/http/doc.go +0 -1
  68. package/bin/go/src/net/http/h2_bundle.go +3 -3
  69. package/bin/go/src/net/http/httputil/reverseproxy.go +14 -0
  70. package/bin/go/src/net/lookup_windows.go +16 -3
  71. package/bin/go/src/net/mail/message.go +20 -9
  72. package/bin/go/src/net/sendfile.go +2 -0
  73. package/bin/go/src/net/sendfile_stub.go +2 -0
  74. package/bin/go/src/net/sendfile_windows.go +3 -0
  75. package/bin/go/src/net/url/url.go +22 -16
  76. package/bin/go/src/os/dir_darwin.go +2 -2
  77. package/bin/go/src/os/dir_unix.go +2 -2
  78. package/bin/go/src/os/file.go +0 -3
  79. package/bin/go/src/os/file_unix.go +9 -5
  80. package/bin/go/src/os/removeall_at.go +6 -2
  81. package/bin/go/src/os/removeall_unix.go +0 -8
  82. package/bin/go/src/os/removeall_windows.go +0 -4
  83. package/bin/go/src/os/root_unix.go +1 -0
  84. package/bin/go/src/os/stat.go +3 -0
  85. package/bin/go/src/os/statat.go +24 -0
  86. package/bin/go/src/os/statat_other.go +12 -0
  87. package/bin/go/src/os/statat_unix.go +20 -0
  88. package/bin/go/src/reflect/value.go +3 -2
  89. package/bin/go/src/runtime/defs_linux_386.go +4 -3
  90. package/bin/go/src/runtime/defs_linux_arm.go +4 -3
  91. package/bin/go/src/runtime/defs_linux_mips64x.go +1 -1
  92. package/bin/go/src/runtime/defs_linux_mipsx.go +5 -4
  93. package/bin/go/src/runtime/malloc.go +1 -53
  94. package/bin/go/src/runtime/mem.go +104 -9
  95. package/bin/go/src/runtime/metrics/doc.go +5 -0
  96. package/bin/go/src/runtime/os_linux.go +62 -0
  97. package/bin/go/src/runtime/os_linux32.go +14 -24
  98. package/bin/go/src/runtime/os_linux64.go +2 -0
  99. package/bin/go/src/runtime/print.go +16 -4
  100. package/bin/go/src/runtime/race/README +9 -9
  101. package/bin/go/src/runtime/race/internal/amd64v1/race_darwin.patch +63 -0
  102. package/bin/go/src/runtime/race/internal/amd64v1/race_darwin.syso +0 -0
  103. package/bin/go/src/runtime/race/internal/amd64v1/race_freebsd.patch +63 -0
  104. package/bin/go/src/runtime/race/internal/amd64v1/race_freebsd.syso +0 -0
  105. package/bin/go/src/runtime/race/internal/amd64v1/race_linux.patch +63 -0
  106. package/bin/go/src/runtime/race/internal/amd64v1/race_linux.syso +0 -0
  107. package/bin/go/src/runtime/race/internal/amd64v1/race_windows.patch +63 -0
  108. package/bin/go/src/runtime/race/internal/amd64v1/race_windows.syso +0 -0
  109. package/bin/go/src/runtime/race/internal/amd64v3/race_linux.patch +63 -0
  110. package/bin/go/src/runtime/race/internal/amd64v3/race_linux.syso +0 -0
  111. package/bin/go/src/runtime/race/race_darwin_arm64.patch +63 -0
  112. package/bin/go/src/runtime/race/race_darwin_arm64.syso +0 -0
  113. package/bin/go/src/runtime/race/race_linux_arm64.patch +63 -0
  114. package/bin/go/src/runtime/race/race_linux_arm64.syso +0 -0
  115. package/bin/go/src/runtime/race/race_linux_loong64.patch +63 -0
  116. package/bin/go/src/runtime/race/race_linux_loong64.syso +0 -0
  117. package/bin/go/src/runtime/race/race_linux_s390x.patch +63 -0
  118. package/bin/go/src/runtime/race/race_linux_s390x.syso +0 -0
  119. package/bin/go/src/syscall/mksyscall.pl +1 -1
  120. package/bin/go/src/syscall/mksyscall_libc.pl +1 -1
  121. package/bin/go/src/syscall/mksysctl_openbsd.pl +1 -1
  122. package/bin/go/src/syscall/mksysnum_dragonfly.pl +1 -1
  123. package/bin/go/src/syscall/mksysnum_freebsd.pl +1 -1
  124. package/bin/go/src/syscall/mksysnum_linux.pl +1 -1
  125. package/bin/go/src/syscall/mksysnum_netbsd.pl +1 -1
  126. package/bin/go/src/syscall/mksysnum_openbsd.pl +1 -1
  127. package/bin/go/src/syscall/syscall_windows.go +5 -1
  128. package/bin/go/src/vendor/modules.txt +1 -1
  129. package/bin/ttsc +0 -0
  130. package/bin/ttscserver +0 -0
  131. package/package.json +1 -1
package/bin/go/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ Copyright 2009 The Go Authors.
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions are
5
+ met:
6
+
7
+ * Redistributions of source code must retain the above copyright
8
+ notice, this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above
10
+ copyright notice, this list of conditions and the following disclaimer
11
+ in the documentation and/or other materials provided with the
12
+ distribution.
13
+ * Neither the name of Google LLC nor the names of its
14
+ contributors may be used to endorse or promote products derived from
15
+ this software without specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/bin/go/PATENTS ADDED
@@ -0,0 +1,22 @@
1
+ Additional IP Rights Grant (Patents)
2
+
3
+ "This implementation" means the copyrightable works distributed by
4
+ Google as part of the Go project.
5
+
6
+ Google hereby grants to You a perpetual, worldwide, non-exclusive,
7
+ no-charge, royalty-free, irrevocable (except as stated in this section)
8
+ patent license to make, have made, use, offer to sell, sell, import,
9
+ transfer and otherwise run, modify and propagate the contents of this
10
+ implementation of Go, where such license applies only to those patent
11
+ claims, both currently owned or controlled by Google and acquired in
12
+ the future, licensable by Google that are necessarily infringed by this
13
+ implementation of Go. This grant does not include claims that would be
14
+ infringed only as a consequence of further modification of this
15
+ implementation. If you or your agent or exclusive licensee institute or
16
+ order or agree to the institution of patent litigation against any
17
+ entity (including a cross-claim or counterclaim in a lawsuit) alleging
18
+ that this implementation of Go or any code incorporated within this
19
+ implementation of Go constitutes direct or contributory patent
20
+ infringement, or inducement of patent infringement, then any patent
21
+ rights granted to you under this License for this implementation of Go
22
+ shall terminate as of the date such litigation is filed.
package/bin/go/VERSION CHANGED
@@ -1,2 +1,2 @@
1
- go1.26.0
2
- time 2026-02-10T01:22:00Z
1
+ go1.26.3
2
+ time 2026-05-04T20:36:18Z
package/bin/go/bin/go CHANGED
Binary file
package/bin/go/bin/gofmt CHANGED
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -147,6 +147,12 @@ const (
147
147
  // Max length of a special file (PAX header, GNU long name or link).
148
148
  // This matches the limit used by libarchive.
149
149
  maxSpecialFileSize = 1 << 20
150
+
151
+ // Maximum number of sparse file entries.
152
+ // We should never actually hit this limit
153
+ // (every sparse encoding will first be limited by maxSpecialFileSize),
154
+ // but this adds an additional layer of defense.
155
+ maxSparseFileEntries = 1 << 20
150
156
  )
151
157
 
152
158
  // blockPadding computes the number of bytes needed to pad offset up to the
@@ -490,7 +490,8 @@ func (tr *Reader) readOldGNUSparseMap(hdr *Header, blk *block) (sparseDatas, err
490
490
  }
491
491
  s := blk.toGNU().sparse()
492
492
  spd := make(sparseDatas, 0, s.maxEntries())
493
- for {
493
+ totalSize := len(s)
494
+ for totalSize < maxSpecialFileSize {
494
495
  for i := 0; i < s.maxEntries(); i++ {
495
496
  // This termination condition is identical to GNU and BSD tar.
496
497
  if s.entry(i).offset()[0] == 0x00 {
@@ -501,7 +502,11 @@ func (tr *Reader) readOldGNUSparseMap(hdr *Header, blk *block) (sparseDatas, err
501
502
  if p.err != nil {
502
503
  return nil, p.err
503
504
  }
504
- spd = append(spd, sparseEntry{Offset: offset, Length: length})
505
+ var err error
506
+ spd, err = appendSparseEntry(spd, sparseEntry{Offset: offset, Length: length})
507
+ if err != nil {
508
+ return nil, err
509
+ }
505
510
  }
506
511
 
507
512
  if s.isExtended()[0] > 0 {
@@ -510,10 +515,12 @@ func (tr *Reader) readOldGNUSparseMap(hdr *Header, blk *block) (sparseDatas, err
510
515
  return nil, err
511
516
  }
512
517
  s = blk.toSparse()
518
+ totalSize += len(s)
513
519
  continue
514
520
  }
515
521
  return spd, nil // Done
516
522
  }
523
+ return nil, errSparseTooLong
517
524
  }
518
525
 
519
526
  // readGNUSparseMap1x0 reads the sparse map as stored in GNU's PAX sparse format
@@ -586,7 +593,10 @@ func readGNUSparseMap1x0(r io.Reader) (sparseDatas, error) {
586
593
  if err1 != nil || err2 != nil {
587
594
  return nil, ErrHeader
588
595
  }
589
- spd = append(spd, sparseEntry{Offset: offset, Length: length})
596
+ spd, err = appendSparseEntry(spd, sparseEntry{Offset: offset, Length: length})
597
+ if err != nil {
598
+ return nil, err
599
+ }
590
600
  }
591
601
  return spd, nil
592
602
  }
@@ -620,12 +630,22 @@ func readGNUSparseMap0x1(paxHdrs map[string]string) (sparseDatas, error) {
620
630
  if err1 != nil || err2 != nil {
621
631
  return nil, ErrHeader
622
632
  }
623
- spd = append(spd, sparseEntry{Offset: offset, Length: length})
633
+ spd, err = appendSparseEntry(spd, sparseEntry{Offset: offset, Length: length})
634
+ if err != nil {
635
+ return nil, err
636
+ }
624
637
  sparseMap = sparseMap[2:]
625
638
  }
626
639
  return spd, nil
627
640
  }
628
641
 
642
+ func appendSparseEntry(spd sparseDatas, ent sparseEntry) (sparseDatas, error) {
643
+ if len(spd) >= maxSparseFileEntries {
644
+ return nil, errSparseTooLong
645
+ }
646
+ return append(spd, ent), nil
647
+ }
648
+
629
649
  // Read reads from the current file in the tar archive.
630
650
  // It returns (0, io.EOF) when it reaches the end of that file,
631
651
  // until [Next] is called to advance to the next file.
@@ -122,6 +122,10 @@ type Type int
122
122
  // invocation.
123
123
  type Type1 int
124
124
 
125
+ // TypeOrExpr is here for the purposes of documentation only. It is a stand-in
126
+ // for either a Go type or an expression.
127
+ type TypeOrExpr int
128
+
125
129
  // IntegerType is here for the purposes of documentation only. It is a stand-in
126
130
  // for any integer type: int, uint, int8 etc.
127
131
  type IntegerType int
@@ -220,10 +224,15 @@ func max[T cmp.Ordered](x T, y ...T) T
220
224
  // min will return NaN.
221
225
  func min[T cmp.Ordered](x T, y ...T) T
222
226
 
223
- // The new built-in function allocates memory. The first argument is a type,
224
- // not a value, and the value returned is a pointer to a newly
225
- // allocated zero value of that type.
226
- func new(Type) *Type
227
+ // The built-in function new allocates a new, initialized variable and returns
228
+ // a pointer to it. It accepts a single argument, which may be either a type
229
+ // or an expression.
230
+ // If the argument is a type T, then new(T) allocates a variable of type T
231
+ // initialized to its zero value.
232
+ // Otherwise, the argument is an expression x and new(x) allocates a variable
233
+ // of the type of x initialized to the value of x. If that value is an untyped
234
+ // constant, it is first implicitly converted to its default type.
235
+ func new(TypeOrExpr) *Type
227
236
 
228
237
  // The complex built-in function constructs a complex value from two
229
238
  // floating-point values. The real and imaginary parts must be of the same
@@ -2,6 +2,12 @@
2
2
  // Use of this source code is governed by a BSD-style
3
3
  // license that can be found in the LICENSE file.
4
4
 
5
+ // Package fips140 provides information about the FIPS 140-3 Go Cryptographic
6
+ // Module and FIPS 140-3 mode.
7
+ //
8
+ // For more details, see the [FIPS 140-3 documentation].
9
+ //
10
+ // [FIPS 140-3 documentation]: https://go.dev/doc/security/fips140
5
11
  package fips140
6
12
 
7
13
  import (
@@ -0,0 +1,97 @@
1
+ // Copyright 2026 The Go Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style
3
+ // license that can be found in the LICENSE file.
4
+
5
+ //go:build !wasm
6
+
7
+ // This file contains reading from from entropy sources in FIPS-140
8
+ // mode. It uses a scratch buffer in the BSS section (see below),
9
+ // which usually doesn't cost much, except on Wasm, due to the way
10
+ // the linear memory works. FIPS-140 mode is not supported on Wasm,
11
+ // so we just use a build tag to exclude it. (Could also exclude other
12
+ // platforms that does not support FIPS-140 mode, but as the BSS
13
+ // variable doesn't cost much, don't bother.)
14
+
15
+ package drbg
16
+
17
+ import (
18
+ entropy "crypto/internal/entropy/v1.0.0"
19
+ "crypto/internal/sysrand"
20
+ "sync"
21
+ "sync/atomic"
22
+ )
23
+
24
+ // memory is a scratch buffer that is accessed between samples by the entropy
25
+ // source to expose it to memory access timings.
26
+ //
27
+ // We reuse it and share it between Seed calls to avoid the significant (~500µs)
28
+ // cost of zeroing a new allocation every time. The entropy source accesses it
29
+ // using atomics (and doesn't care about its contents).
30
+ //
31
+ // It should end up in the .noptrbss section, and become backed by physical pages
32
+ // at first use. This ensures that programs that do not use the FIPS 140-3 module
33
+ // do not incur any memory use or initialization penalties.
34
+ var memory entropy.ScratchBuffer
35
+
36
+ func getEntropy() *[SeedSize]byte {
37
+ var retries int
38
+ seed, err := entropy.Seed(&memory)
39
+ for err != nil {
40
+ // The CPU jitter-based SP 800-90B entropy source has a non-negligible
41
+ // chance of failing the startup health tests.
42
+ //
43
+ // Each time it does, it enters a permanent failure state, and we
44
+ // restart it anew. This is not expected to happen more than a few times
45
+ // in a row.
46
+ if retries++; retries > 100 {
47
+ panic("fips140/drbg: failed to obtain initial entropy")
48
+ }
49
+ seed, err = entropy.Seed(&memory)
50
+ }
51
+ return &seed
52
+ }
53
+
54
+ // getEntropy is very slow (~500µs), so we don't want it on the hot path.
55
+ // We keep both a persistent DRBG instance and a pool of additional instances.
56
+ // Occasional uses will use drbgInstance, even if the pool was emptied since the
57
+ // last use. Frequent concurrent uses will fill the pool and use it.
58
+ var drbgInstance atomic.Pointer[Counter]
59
+ var drbgPool = sync.Pool{
60
+ New: func() any {
61
+ return NewCounter(getEntropy())
62
+ },
63
+ }
64
+
65
+ func readFromEntropy(b []byte) {
66
+ // At every read, 128 random bits from the operating system are mixed as
67
+ // additional input, to make the output as strong as non-FIPS randomness.
68
+ // This is not credited as entropy for FIPS purposes, as allowed by Section
69
+ // 8.7.2: "Note that a DRBG does not rely on additional input to provide
70
+ // entropy, even though entropy could be provided in the additional input".
71
+ additionalInput := new([SeedSize]byte)
72
+ sysrand.Read(additionalInput[:16])
73
+
74
+ drbg := drbgInstance.Swap(nil)
75
+ if drbg == nil {
76
+ drbg = drbgPool.Get().(*Counter)
77
+ }
78
+ defer func() {
79
+ if !drbgInstance.CompareAndSwap(nil, drbg) {
80
+ drbgPool.Put(drbg)
81
+ }
82
+ }()
83
+
84
+ for len(b) > 0 {
85
+ size := min(len(b), maxRequestSize)
86
+ if reseedRequired := drbg.Generate(b[:size], additionalInput); reseedRequired {
87
+ // See SP 800-90A Rev. 1, Section 9.3.1, Steps 6-8, as explained in
88
+ // Section 9.3.2: if Generate reports a reseed is required, the
89
+ // additional input is passed to Reseed along with the entropy and
90
+ // then nulled before the next Generate call.
91
+ drbg.Reseed(getEntropy(), additionalInput)
92
+ additionalInput = nil
93
+ continue
94
+ }
95
+ b = b[size:]
96
+ }
97
+ }
@@ -0,0 +1,11 @@
1
+ // Copyright 2026 The Go Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style
3
+ // license that can be found in the LICENSE file.
4
+
5
+ //go:build wasm
6
+
7
+ package drbg
8
+
9
+ func readFromEntropy(b []byte) {
10
+ panic("FIPS-140 entropy generation is not supported on Wasm")
11
+ }
@@ -9,55 +9,11 @@
9
9
  package drbg
10
10
 
11
11
  import (
12
- entropy "crypto/internal/entropy/v1.0.0"
13
12
  "crypto/internal/fips140"
14
13
  "crypto/internal/sysrand"
15
14
  "io"
16
- "sync"
17
- "sync/atomic"
18
15
  )
19
16
 
20
- // memory is a scratch buffer that is accessed between samples by the entropy
21
- // source to expose it to memory access timings.
22
- //
23
- // We reuse it and share it between Seed calls to avoid the significant (~500µs)
24
- // cost of zeroing a new allocation every time. The entropy source accesses it
25
- // using atomics (and doesn't care about its contents).
26
- //
27
- // It should end up in the .noptrbss section, and become backed by physical pages
28
- // at first use. This ensures that programs that do not use the FIPS 140-3 module
29
- // do not incur any memory use or initialization penalties.
30
- var memory entropy.ScratchBuffer
31
-
32
- func getEntropy() *[SeedSize]byte {
33
- var retries int
34
- seed, err := entropy.Seed(&memory)
35
- for err != nil {
36
- // The CPU jitter-based SP 800-90B entropy source has a non-negligible
37
- // chance of failing the startup health tests.
38
- //
39
- // Each time it does, it enters a permanent failure state, and we
40
- // restart it anew. This is not expected to happen more than a few times
41
- // in a row.
42
- if retries++; retries > 100 {
43
- panic("fips140/drbg: failed to obtain initial entropy")
44
- }
45
- seed, err = entropy.Seed(&memory)
46
- }
47
- return &seed
48
- }
49
-
50
- // getEntropy is very slow (~500µs), so we don't want it on the hot path.
51
- // We keep both a persistent DRBG instance and a pool of additional instances.
52
- // Occasional uses will use drbgInstance, even if the pool was emptied since the
53
- // last use. Frequent concurrent uses will fill the pool and use it.
54
- var drbgInstance atomic.Pointer[Counter]
55
- var drbgPool = sync.Pool{
56
- New: func() any {
57
- return NewCounter(getEntropy())
58
- },
59
- }
60
-
61
17
  // Read fills b with cryptographically secure random bytes. In FIPS mode, it
62
18
  // uses an SP 800-90A Rev. 1 Deterministic Random Bit Generator (DRBG).
63
19
  // Otherwise, it uses the operating system's random number generator.
@@ -76,37 +32,7 @@ func Read(b []byte) {
76
32
  return
77
33
  }
78
34
 
79
- // At every read, 128 random bits from the operating system are mixed as
80
- // additional input, to make the output as strong as non-FIPS randomness.
81
- // This is not credited as entropy for FIPS purposes, as allowed by Section
82
- // 8.7.2: "Note that a DRBG does not rely on additional input to provide
83
- // entropy, even though entropy could be provided in the additional input".
84
- additionalInput := new([SeedSize]byte)
85
- sysrand.Read(additionalInput[:16])
86
-
87
- drbg := drbgInstance.Swap(nil)
88
- if drbg == nil {
89
- drbg = drbgPool.Get().(*Counter)
90
- }
91
- defer func() {
92
- if !drbgInstance.CompareAndSwap(nil, drbg) {
93
- drbgPool.Put(drbg)
94
- }
95
- }()
96
-
97
- for len(b) > 0 {
98
- size := min(len(b), maxRequestSize)
99
- if reseedRequired := drbg.Generate(b[:size], additionalInput); reseedRequired {
100
- // See SP 800-90A Rev. 1, Section 9.3.1, Steps 6-8, as explained in
101
- // Section 9.3.2: if Generate reports a reseed is required, the
102
- // additional input is passed to Reseed along with the entropy and
103
- // then nulled before the next Generate call.
104
- drbg.Reseed(getEntropy(), additionalInput)
105
- additionalInput = nil
106
- continue
107
- }
108
- b = b[size:]
109
- }
35
+ readFromEntropy(b)
110
36
  }
111
37
 
112
38
  var testingReader io.Reader
@@ -1363,7 +1363,7 @@ func (c *Conn) handleKeyUpdate(keyUpdate *keyUpdateMsg) error {
1363
1363
  }
1364
1364
 
1365
1365
  newSecret := cipherSuite.nextTrafficSecret(c.in.trafficSecret)
1366
- if err := c.setReadTrafficSecret(cipherSuite, QUICEncryptionLevelInitial, newSecret); err != nil {
1366
+ if err := c.setReadTrafficSecret(cipherSuite, QUICEncryptionLevelInitial, newSecret, keyUpdate.updateRequested); err != nil {
1367
1367
  return err
1368
1368
  }
1369
1369
 
@@ -1683,12 +1683,16 @@ func (c *Conn) VerifyHostname(host string) error {
1683
1683
  // setReadTrafficSecret sets the read traffic secret for the given encryption level. If
1684
1684
  // being called at the same time as setWriteTrafficSecret, the caller must ensure the call
1685
1685
  // to setWriteTrafficSecret happens first so any alerts are sent at the write level.
1686
- func (c *Conn) setReadTrafficSecret(suite *cipherSuiteTLS13, level QUICEncryptionLevel, secret []byte) error {
1686
+ func (c *Conn) setReadTrafficSecret(suite *cipherSuiteTLS13, level QUICEncryptionLevel, secret []byte, locked bool) error {
1687
1687
  // Ensure that there are no buffered handshake messages before changing the
1688
1688
  // read keys, since that can cause messages to be parsed that were encrypted
1689
1689
  // using old keys which are no longer appropriate.
1690
1690
  if c.hand.Len() != 0 {
1691
- c.sendAlert(alertUnexpectedMessage)
1691
+ if locked {
1692
+ c.sendAlertLocked(alertUnexpectedMessage)
1693
+ } else {
1694
+ c.sendAlert(alertUnexpectedMessage)
1695
+ }
1692
1696
  return errors.New("tls: handshake buffer not empty before setting read traffic secret")
1693
1697
  }
1694
1698
  c.in.setTrafficSecret(suite, level, secret)
@@ -492,7 +492,7 @@ func (hs *clientHandshakeStateTLS13) establishHandshakeKeys() error {
492
492
  clientSecret := handshakeSecret.ClientHandshakeTrafficSecret(hs.transcript)
493
493
  c.setWriteTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, clientSecret)
494
494
  serverSecret := handshakeSecret.ServerHandshakeTrafficSecret(hs.transcript)
495
- if err := c.setReadTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, serverSecret); err != nil {
495
+ if err := c.setReadTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, serverSecret, false); err != nil {
496
496
  return err
497
497
  }
498
498
 
@@ -711,7 +711,7 @@ func (hs *clientHandshakeStateTLS13) readServerFinished() error {
711
711
 
712
712
  hs.trafficSecret = hs.masterSecret.ClientApplicationTrafficSecret(hs.transcript)
713
713
  serverSecret := hs.masterSecret.ServerApplicationTrafficSecret(hs.transcript)
714
- if err := c.setReadTrafficSecret(hs.suite, QUICEncryptionLevelApplication, serverSecret); err != nil {
714
+ if err := c.setReadTrafficSecret(hs.suite, QUICEncryptionLevelApplication, serverSecret, false); err != nil {
715
715
  return err
716
716
  }
717
717
 
@@ -752,7 +752,7 @@ func (hs *serverHandshakeStateTLS13) sendServerParameters() error {
752
752
  serverSecret := hs.handshakeSecret.ServerHandshakeTrafficSecret(hs.transcript)
753
753
  c.setWriteTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, serverSecret)
754
754
  clientSecret := hs.handshakeSecret.ClientHandshakeTrafficSecret(hs.transcript)
755
- if err := c.setReadTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, clientSecret); err != nil {
755
+ if err := c.setReadTrafficSecret(hs.suite, QUICEncryptionLevelHandshake, clientSecret, false); err != nil {
756
756
  return err
757
757
  }
758
758
 
@@ -1136,7 +1136,7 @@ func (hs *serverHandshakeStateTLS13) readClientFinished() error {
1136
1136
  return errors.New("tls: invalid client finished hash")
1137
1137
  }
1138
1138
 
1139
- if err := c.setReadTrafficSecret(hs.suite, QUICEncryptionLevelApplication, hs.trafficSecret); err != nil {
1139
+ if err := c.setReadTrafficSecret(hs.suite, QUICEncryptionLevelApplication, hs.trafficSecret, false); err != nil {
1140
1140
  return err
1141
1141
  }
1142
1142
 
@@ -7,6 +7,7 @@ package tls
7
7
  import (
8
8
  "crypto"
9
9
  "crypto/ecdh"
10
+ "crypto/fips140"
10
11
  "crypto/hmac"
11
12
  "crypto/internal/fips140/tls13"
12
13
  "crypto/mlkem"
@@ -165,7 +166,14 @@ type hybridKeyExchange struct {
165
166
  }
166
167
 
167
168
  func (ke *hybridKeyExchange) keyShares(rand io.Reader) (*keySharePrivateKeys, []keyShare, error) {
168
- priv, ecdhShares, err := ke.ecdh.keyShares(rand)
169
+ var (
170
+ priv *keySharePrivateKeys
171
+ ecdhShares []keyShare
172
+ err error
173
+ )
174
+ fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved.
175
+ priv, ecdhShares, err = ke.ecdh.keyShares(rand)
176
+ })
169
177
  if err != nil {
170
178
  return nil, nil, err
171
179
  }
@@ -201,7 +209,14 @@ func (ke *hybridKeyExchange) serverSharedSecret(rand io.Reader, clientKeyShare [
201
209
  ecdhShareData = clientKeyShare[:ke.ecdhElementSize]
202
210
  mlkemShareData = clientKeyShare[ke.ecdhElementSize:]
203
211
  }
204
- ecdhSharedSecret, ks, err := ke.ecdh.serverSharedSecret(rand, ecdhShareData)
212
+ var (
213
+ ecdhSharedSecret []byte
214
+ ks keyShare
215
+ err error
216
+ )
217
+ fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved.
218
+ ecdhSharedSecret, ks, err = ke.ecdh.serverSharedSecret(rand, ecdhShareData)
219
+ })
205
220
  if err != nil {
206
221
  return nil, keyShare{}, err
207
222
  }
@@ -234,7 +249,13 @@ func (ke *hybridKeyExchange) clientSharedSecret(priv *keySharePrivateKeys, serve
234
249
  ecdhShareData = serverKeyShare[:ke.ecdhElementSize]
235
250
  mlkemShareData = serverKeyShare[ke.ecdhElementSize:]
236
251
  }
237
- ecdhSharedSecret, err := ke.ecdh.clientSharedSecret(priv, ecdhShareData)
252
+ var (
253
+ ecdhSharedSecret []byte
254
+ err error
255
+ )
256
+ fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved.
257
+ ecdhSharedSecret, err = ke.ecdh.clientSharedSecret(priv, ecdhShareData)
258
+ })
238
259
  if err != nil {
239
260
  return nil, err
240
261
  }