| // Copyright 2024 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. |
| |
| package subtle |
| |
| import ( |
| "internal/cpu" |
| "internal/runtime/sys" |
| "testing" |
| ) |
| |
| func TestWithDataIndependentTiming(t *testing.T) { |
| if !cpu.ARM64.HasDIT { |
| t.Skip("CPU does not support DIT") |
| } |
| |
| ditAlreadyEnabled := sys.DITEnabled() |
| |
| WithDataIndependentTiming(func() { |
| if !sys.DITEnabled() { |
| t.Fatal("dit not enabled within WithDataIndependentTiming closure") |
| } |
| |
| WithDataIndependentTiming(func() { |
| if !sys.DITEnabled() { |
| t.Fatal("dit not enabled within nested WithDataIndependentTiming closure") |
| } |
| }) |
| |
| if !sys.DITEnabled() { |
| t.Fatal("dit not enabled after return from nested WithDataIndependentTiming closure") |
| } |
| }) |
| |
| if !ditAlreadyEnabled && sys.DITEnabled() { |
| t.Fatal("dit not unset after returning from WithDataIndependentTiming closure") |
| } |
| } |
| |
| func TestDITPanic(t *testing.T) { |
| if !cpu.ARM64.HasDIT { |
| t.Skip("CPU does not support DIT") |
| } |
| |
| ditAlreadyEnabled := sys.DITEnabled() |
| |
| defer func() { |
| e := recover() |
| if e == nil { |
| t.Fatal("didn't panic") |
| } |
| if !ditAlreadyEnabled && sys.DITEnabled() { |
| t.Error("DIT still enabled after panic inside of WithDataIndependentTiming closure") |
| } |
| }() |
| |
| WithDataIndependentTiming(func() { |
| if !sys.DITEnabled() { |
| t.Fatal("dit not enabled within WithDataIndependentTiming closure") |
| } |
| |
| panic("bad") |
| }) |
| } |