Initial QSfera import
This commit is contained in:
+86
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright 2017-2019 Kopano
|
||||
*
|
||||
* 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 oidc
|
||||
|
||||
import (
|
||||
"crypto"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// LeftmostHashBytes defines []bytes with Base64URL encoder via String().
|
||||
type LeftmostHashBytes []byte
|
||||
|
||||
// LeftmostHash hashes the provided data with the provided hash function and
|
||||
// returns the left-most half the hashed bytes.
|
||||
func LeftmostHash(data []byte, hash crypto.Hash) LeftmostHashBytes {
|
||||
hasher := hash.New()
|
||||
hasher.Write(data)
|
||||
result := hasher.Sum(nil)
|
||||
|
||||
return LeftmostHashBytes(result[:len(result)/2])
|
||||
}
|
||||
|
||||
// String returns the Base64URL encoded string of the accociated bytes.
|
||||
func (lmhb LeftmostHashBytes) String() string {
|
||||
return base64.RawURLEncoding.EncodeToString(lmhb)
|
||||
}
|
||||
|
||||
// HashFromSigningMethod returns the matching crypto.Hash for the provided
|
||||
// signing alg.
|
||||
func HashFromSigningMethod(alg string) (hash crypto.Hash, err error) {
|
||||
switch alg {
|
||||
case "HS256":
|
||||
fallthrough
|
||||
case "RS256":
|
||||
fallthrough
|
||||
case "PS256":
|
||||
fallthrough
|
||||
case "ES256":
|
||||
hash = crypto.SHA256
|
||||
|
||||
case "HS386":
|
||||
fallthrough
|
||||
case "RS384":
|
||||
fallthrough
|
||||
case "PS384":
|
||||
fallthrough
|
||||
case "ES384":
|
||||
hash = crypto.SHA384
|
||||
|
||||
case "HS512":
|
||||
fallthrough
|
||||
case "RS512":
|
||||
fallthrough
|
||||
case "PS512":
|
||||
fallthrough
|
||||
case "ES512":
|
||||
hash = crypto.SHA512
|
||||
|
||||
case "EdDSA":
|
||||
hash = crypto.SHA512
|
||||
|
||||
default:
|
||||
err = fmt.Errorf("Unkown alg %s", alg)
|
||||
}
|
||||
|
||||
if !hash.Available() {
|
||||
err = fmt.Errorf("Hash for %s is not available", alg)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user