Some checks failed
Bearer / scan (push) Successful in 9s
Go Build Multi-Platform / build (amd64, linux) (push) Successful in 42s
Go Build Multi-Platform / build (amd64, darwin) (push) Successful in 44s
Go Build Multi-Platform / build (arm, freebsd) (push) Successful in 41s
Go Build Multi-Platform / build (arm, windows) (push) Successful in 39s
Go Build Multi-Platform / build (arm64, windows) (push) Successful in 1m8s
Go Build Multi-Platform / build (wasm, js) (push) Successful in 1m6s
TinyGo Build / tinygo-build (tinygo-wasm, tinygo-wasm, reticulum-go.wasm, wasm) (pull_request) Failing after 1m2s
TinyGo Build / tinygo-build (tinygo-build, tinygo-default, reticulum-go-tinygo, ) (pull_request) Failing after 1m4s
Go Revive Lint / lint (push) Successful in 1m4s
Go Test Multi-Platform / Test (ubuntu-latest, arm64) (push) Successful in 1m24s
Run Gosec / tests (push) Successful in 1m29s
Go Test Multi-Platform / Test (ubuntu-latest, amd64) (push) Successful in 2m31s
Go Build Multi-Platform / build (amd64, freebsd) (push) Successful in 9m28s
Go Build Multi-Platform / build (arm, linux) (push) Successful in 9m28s
Go Build Multi-Platform / build (amd64, windows) (push) Successful in 9m30s
Go Build Multi-Platform / build (arm64, darwin) (push) Successful in 9m27s
Go Build Multi-Platform / build (arm64, linux) (push) Successful in 9m26s
Go Build Multi-Platform / build (arm64, freebsd) (push) Successful in 9m29s
Go Build Multi-Platform / Create Release (push) Has been skipped
51 lines
1005 B
Go
51 lines
1005 B
Go
// SPDX-License-Identifier: 0BSD
|
|
// Copyright (c) 2024-2026 Sudo-Ivan / Quad4.io
|
|
package cryptography
|
|
|
|
import (
|
|
"crypto/hmac"
|
|
"crypto/sha256"
|
|
"errors"
|
|
"math"
|
|
)
|
|
|
|
func DeriveKey(secret, salt, info []byte, length int) ([]byte, error) {
|
|
hashLen := 32
|
|
|
|
if length < 1 {
|
|
return nil, errors.New("invalid output key length")
|
|
}
|
|
|
|
if len(secret) == 0 {
|
|
return nil, errors.New("cannot derive key from empty input material")
|
|
}
|
|
|
|
if len(salt) == 0 {
|
|
salt = make([]byte, hashLen)
|
|
}
|
|
|
|
if info == nil {
|
|
info = []byte{}
|
|
}
|
|
|
|
pseudorandomKey := hmac.New(sha256.New, salt)
|
|
pseudorandomKey.Write(secret)
|
|
prk := pseudorandomKey.Sum(nil)
|
|
|
|
block := []byte{}
|
|
derived := []byte{}
|
|
|
|
iterations := int(math.Ceil(float64(length) / float64(hashLen)))
|
|
for i := 0; i < iterations; i++ {
|
|
h := hmac.New(sha256.New, prk)
|
|
h.Write(block)
|
|
h.Write(info)
|
|
counter := byte((i + 1) % (0xFF + 1))
|
|
h.Write([]byte{counter})
|
|
block = h.Sum(nil)
|
|
derived = append(derived, block...)
|
|
}
|
|
|
|
return derived[:length], nil
|
|
}
|