Files
teleport/lib/utils/bcrypt.go
T
Mike Jensen eafa23404e Update crypto fork to v0.6.0-1 tag (#22564)
This tag includes the most recent updates from the upstream in order to address recently fixed CVE's.
Changes included: https://github.com/gravitational/crypto/compare/903e65687e59...c3f983bc73dcf711908e49d91bda9cffbecb13cd

In addition this adds `utils/bcrypto.go` to restore the prior crypto behavior of truncating input > 72 chars.
This commit in Crypto breaks functionality with long passwords or more commonly our reset tokens which are > 72 characters: https://github.com/gravitational/crypto/commit/bc7d1d1eb54b3530da4f5ec31625c95d7df40231
As described in the commit message, the prior behavior was to ignore the extra data.  Since 72 bytes are plenty of data to prevent brute force attacks, there is not a significant need to report this error to the user.
2023-03-15 16:05:13 +00:00

40 lines
1.4 KiB
Go

/*
Copyright 2023 Gravitational, 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 utils
import (
"golang.org/x/crypto/bcrypt"
)
const maxInputSize = 72
// truncateToMaxSize Make sure input is truncated to the maximum length crypto accepts. Crypto changed the behavior
// from ignoring the extra input to returning an error, this truncation is necessary to maintain compatibility with
// customers who have long passwords, or more commonly our recovery codes.
func truncateToMaxSize(input []byte) []byte {
if len(input) > maxInputSize {
return input[:maxInputSize]
}
return input
}
// BcryptFromPassword delegates to bcrypt.GenerateFromPassword, but maintains the prior behavior of only hashing the
// first 72 bytes. BCrypt as an algorithm can not hash inputs > 72 bytes.
func BcryptFromPassword(password []byte, cost int) ([]byte, error) {
return bcrypt.GenerateFromPassword(truncateToMaxSize(password), cost)
}