forked from gokalkan/gokalkan
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkc_sign_xml.go
More file actions
96 lines (74 loc) · 2.57 KB
/
Copy pathkc_sign_xml.go
File metadata and controls
96 lines (74 loc) · 2.57 KB
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
package gokalkan
// #cgo LDFLAGS: -ldl
// #include <dlfcn.h>
// #include "KalkanCrypt.h"
//
// unsigned long signXML(char *alias, int flags, char *inData, int inDataLength, unsigned char *outSign, int *outSignLength, char *signNodeId, char *parentSignNode, char *parentNameSpace) {
// return kc_funcs->SignXML(alias, flags, inData, inDataLength, outSign, outSignLength, signNodeId, parentSignNode, parentNameSpace);
// }
import "C"
import (
"fmt"
"unsafe"
)
// KCSignXML подписывает данные в формате XML.
//
// Параметры:
//
// xml - входящий xml.
//
// alias - label (alias) сертификата.
//
// flags - флаги.
//
// signNodeID - идентификатор тэга, который необходимо подписать.
// Передать "", если необходимо подписать все содержимое документа.
//
// parentSignNode - идентификатор тэга, в который необходимо поместить значение подписи.
//
// parentNameSpace - пространство имен тэга, в который необходимо поместить значение подписи.
// Если пространство имен есть, но не будет указано - то тег не найдется.
func (cli *KCClient) KCSignXML(xml, alias string, flags KCFlag, signNodeID, parentSignNode, parentNameSpace string) (signedXML string, err error) {
defer func() {
if r := recover(); r != nil {
if err != nil {
err = fmt.Errorf("%w: panic: %s", err, r)
return
}
err = fmt.Errorf("%w: %s", ErrPanic, r)
}
}()
cli.mu.Lock()
defer cli.mu.Unlock()
cAlias := C.CString(alias)
defer C.free(unsafe.Pointer(cAlias))
cInData := C.CString(xml)
defer C.free(unsafe.Pointer(cInData))
inDataLength := len(xml)
outSignLength := 50000 + inDataLength
outSign := C.malloc(C.ulong(C.sizeof_uchar * outSignLength))
defer C.free(outSign)
cSignNodeID := C.CString(signNodeID)
defer C.free(unsafe.Pointer(cSignNodeID))
cParentSignNode := C.CString(parentSignNode)
defer C.free(unsafe.Pointer(cParentSignNode))
cParentNameSpace := C.CString(parentNameSpace)
defer C.free(unsafe.Pointer(cParentNameSpace))
rc := int(C.signXML(
cAlias,
C.int(flags),
cInData,
C.int(inDataLength),
(*C.uchar)(outSign),
(*C.int)(unsafe.Pointer(&outSignLength)),
cSignNodeID,
cParentSignNode,
cParentNameSpace,
))
err = cli.wrapError(rc)
if err != nil {
return signedXML, err
}
signedXML = C.GoString((*C.char)(outSign))
return signedXML, nil
}