| // 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 pbkdf2 |
| |
| import ( |
| "bytes" |
| "crypto/internal/fips140" |
| _ "crypto/internal/fips140/check" |
| "crypto/internal/fips140/sha256" |
| "errors" |
| ) |
| |
| func init() { |
| // Per IG 10.3.A: |
| // "if the module implements an approved PBKDF (SP 800-132), the module |
| // shall perform a CAST, at minimum, on the derivation of the Master |
| // Key (MK) as specified in Section 5.3 of SP 800-132" |
| // "The Iteration Count parameter does not need to be among those |
| // supported by the module in the approved mode but shall be at least |
| // two." |
| fips140.CAST("PBKDF2", func() error { |
| salt := []byte{ |
| 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, |
| 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, |
| } |
| want := []byte{ |
| 0xC7, 0x58, 0x76, 0xC0, 0x71, 0x1C, 0x29, 0x75, |
| 0x2D, 0x3A, 0xA6, 0xDF, 0x29, 0x96, |
| } |
| |
| mk, err := Key(sha256.New, "password", salt, 2, 14) |
| if err != nil { |
| return err |
| } |
| if !bytes.Equal(mk, want) { |
| return errors.New("unexpected result") |
| } |
| |
| return nil |
| }) |
| } |