-
-
Notifications
You must be signed in to change notification settings - Fork 167
/
encrypt_service.go
executable file
·101 lines (94 loc) · 2.83 KB
/
encrypt_service.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package advanced_nego
import (
"errors"
"fmt"
"github.com/sijms/go-ora/v2/network/security"
)
type encryptService struct {
defaultService
algoID int
}
func NewEncryptService(comm *AdvancedNegoComm) (*encryptService, error) {
output := &encryptService{
defaultService: defaultService{
comm: comm,
level: comm.session.Context.ConnOption.EncServiceLevel,
serviceType: 2,
version: 0xB200200,
availableServiceNames: []string{"", "RC4_40", "RC4_56", "RC4_128", "RC4_256",
"DES40C", "DES56C", "3DES112", "3DES168", "AES128", "AES192", "AES256"},
availableServiceIDs: []int{0, 1, 8, 10, 6, 3, 2, 11, 12, 15, 16, 17},
},
}
err := output.buildServiceList([]string{"RC4_40", "RC4_56", "RC4_128", "RC4_256", "DES56C", "AES128", "AES192", "AES256"}, true, true)
//output.selectedServ, err = output.validate(strings.Split(str,","), true)
if err != nil {
return nil, err
}
return output, nil
}
func (serv *encryptService) readServiceData(subPacketnum int) error {
var err error
comm := serv.comm
serv.version, err = comm.readVersion()
if err != nil {
return err
}
resp, err := comm.readUB1()
if err != nil {
return err
}
serv.algoID = int(resp)
return nil
}
func (serv *encryptService) writeServiceData() error {
serv.writeHeader(3)
comm := serv.comm
comm.writeVersion(serv.getVersion())
selectedIndices := make([]byte, len(serv.selectedIndices))
for i := 0; i < len(serv.selectedIndices); i++ {
index := serv.selectedIndices[i]
selectedIndices[i] = uint8(serv.availableServiceIDs[index])
}
comm.writeBytes(selectedIndices)
// send selected driver
comm.writeUB1(1)
return nil
}
func (serv *encryptService) getServiceDataLength() int {
return 17 + len(serv.selectedIndices)
}
func (serv *encryptService) activateAlgorithm() error {
key := serv.comm.session.Context.AdvancedService.SessionKey
iv := serv.comm.session.Context.AdvancedService.IV
//iv := make([]byte, 16)
var algo security.OracleNetworkEncryption = nil
var err error
switch serv.algoID {
case 0:
return nil
case 1:
algo, err = security.NewOracleNetworkRC4Cryptor(key, iv, 40)
case 2:
algo, err = security.NewOracleNetworkDESCryptor(key[:8], nil)
case 6:
algo, err = security.NewOracleNetworkRC4Cryptor(key, iv, 256)
case 8:
algo, err = security.NewOracleNetworkRC4Cryptor(key, iv, 56)
case 10:
algo, err = security.NewOracleNetworkRC4Cryptor(key, iv, 128)
case 15:
algo, err = security.NewOracleNetworkCBCEncrypter(key[:16], nil)
case 16:
algo, err = security.NewOracleNetworkCBCEncrypter(key[:24], nil)
case 17:
algo, err = security.NewOracleNetworkCBCEncrypter(key[:32], nil)
default:
err = errors.New(fmt.Sprintf("advanced negotiation error: encryption service algorithm: %d still not supported", serv.algoID))
}
if err != nil {
return err
}
serv.comm.session.Context.AdvancedService.CryptAlgo = algo
return nil
}