|
|
|
// Copyright (c) 2020, The Garble Authors.
|
|
|
|
// See LICENSE for licensing information.
|
|
|
|
|
|
|
|
package literals
|
|
|
|
|
|
|
|
import (
|
|
|
|
"go/ast"
|
|
|
|
"go/token"
|
|
|
|
|
|
|
|
ah "mvdan.cc/garble/internal/asthelper"
|
|
|
|
)
|
|
|
|
|
|
|
|
type simple struct{}
|
|
|
|
|
|
|
|
// check that the obfuscator interface is implemented
|
|
|
|
var _ obfuscator = simple{}
|
|
|
|
|
|
|
|
func (simple) obfuscate(data []byte) *ast.BlockStmt {
|
|
|
|
key := make([]byte, len(data))
|
|
|
|
genRandBytes(key)
|
|
|
|
|
|
|
|
op := randOperator()
|
|
|
|
for i, b := range key {
|
|
|
|
data[i] = evalOperator(op, data[i], b)
|
|
|
|
}
|
|
|
|
|
|
|
|
return ah.BlockStmt(
|
|
|
|
&ast.AssignStmt{
|
|
|
|
Lhs: []ast.Expr{ast.NewIdent("key")},
|
|
|
|
Tok: token.DEFINE,
|
|
|
|
Rhs: []ast.Expr{ah.DataToByteSlice(key)},
|
|
|
|
},
|
|
|
|
&ast.AssignStmt{
|
|
|
|
Lhs: []ast.Expr{ast.NewIdent("data")},
|
|
|
|
Tok: token.DEFINE,
|
|
|
|
Rhs: []ast.Expr{ah.DataToByteSlice(data)},
|
|
|
|
},
|
|
|
|
&ast.RangeStmt{
|
|
|
|
Key: ast.NewIdent("i"),
|
|
|
|
Value: ast.NewIdent("b"),
|
|
|
|
Tok: token.DEFINE,
|
|
|
|
X: ast.NewIdent("key"),
|
|
|
|
Body: &ast.BlockStmt{List: []ast.Stmt{
|
|
|
|
&ast.AssignStmt{
|
|
|
|
Lhs: []ast.Expr{ah.IndexExpr("data", ast.NewIdent("i"))},
|
|
|
|
Tok: token.ASSIGN,
|
|
|
|
Rhs: []ast.Expr{operatorToReversedBinaryExpr(op, ah.IndexExpr("data", ast.NewIdent("i")), ast.NewIdent("b"))},
|
|
|
|
},
|
|
|
|
}},
|
|
|
|
},
|
|
|
|
)
|
|
|
|
}
|