98 lines
2.3 KiB
Go
98 lines
2.3 KiB
Go
|
package transit
|
||
|
|
||
|
import (
|
||
|
"encoding/base64"
|
||
|
"encoding/hex"
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
|
||
|
uuid "github.com/hashicorp/go-uuid"
|
||
|
"github.com/hashicorp/vault/logical"
|
||
|
"github.com/hashicorp/vault/logical/framework"
|
||
|
)
|
||
|
|
||
|
func (b *backend) pathRandom() *framework.Path {
|
||
|
return &framework.Path{
|
||
|
Pattern: "random" + framework.OptionalParamRegex("urlbytes"),
|
||
|
Fields: map[string]*framework.FieldSchema{
|
||
|
"urlbytes": &framework.FieldSchema{
|
||
|
Type: framework.TypeString,
|
||
|
Description: "The number of bytes to generate (POST URL parameter)",
|
||
|
},
|
||
|
|
||
|
"bytes": &framework.FieldSchema{
|
||
|
Type: framework.TypeInt,
|
||
|
Default: 32,
|
||
|
Description: "The number of bytes to generate (POST body parameter). Defaults to 32 (256 bits).",
|
||
|
},
|
||
|
|
||
|
"format": &framework.FieldSchema{
|
||
|
Type: framework.TypeString,
|
||
|
Default: "base64",
|
||
|
Description: `Encoding format to use. Can be "hex" or "base64". Defaults to "base64".`,
|
||
|
},
|
||
|
},
|
||
|
|
||
|
Callbacks: map[logical.Operation]framework.OperationFunc{
|
||
|
logical.UpdateOperation: b.pathRandomWrite,
|
||
|
},
|
||
|
|
||
|
HelpSynopsis: pathRandomHelpSyn,
|
||
|
HelpDescription: pathRandomHelpDesc,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (b *backend) pathRandomWrite(
|
||
|
req *logical.Request, d *framework.FieldData) (*logical.Response, error) {
|
||
|
bytes := 0
|
||
|
var err error
|
||
|
strBytes := d.Get("urlbytes").(string)
|
||
|
if strBytes != "" {
|
||
|
bytes, err = strconv.Atoi(strBytes)
|
||
|
if err != nil {
|
||
|
return logical.ErrorResponse(fmt.Sprintf("error parsing url-set byte count: %s", err)), nil
|
||
|
}
|
||
|
} else {
|
||
|
bytes = d.Get("bytes").(int)
|
||
|
}
|
||
|
format := d.Get("format").(string)
|
||
|
|
||
|
if bytes < 1 {
|
||
|
return logical.ErrorResponse(`"bytes" cannot be less than 1`), nil
|
||
|
}
|
||
|
|
||
|
switch format {
|
||
|
case "hex":
|
||
|
case "base64":
|
||
|
default:
|
||
|
return logical.ErrorResponse(fmt.Sprintf("unsupported encoding format %s; must be \"hex\" or \"base64\"", format)), nil
|
||
|
}
|
||
|
|
||
|
randBytes, err := uuid.GenerateRandomBytes(bytes)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
var retStr string
|
||
|
switch format {
|
||
|
case "hex":
|
||
|
retStr = hex.EncodeToString(randBytes)
|
||
|
case "base64":
|
||
|
retStr = base64.StdEncoding.EncodeToString(randBytes)
|
||
|
}
|
||
|
|
||
|
// Generate the response
|
||
|
resp := &logical.Response{
|
||
|
Data: map[string]interface{}{
|
||
|
"random_bytes": retStr,
|
||
|
},
|
||
|
}
|
||
|
return resp, nil
|
||
|
}
|
||
|
|
||
|
const pathRandomHelpSyn = `Generate random bytes`
|
||
|
|
||
|
const pathRandomHelpDesc = `
|
||
|
This function can be used to generate high-entropy random bytes.
|
||
|
`
|