来自meigk/pkcs11包。是否有办法在Login函数中指定一个负值作为userType?因为我正在使用的HSM模型除了以下标准角色外,还支持另外一个角色,并且我希望使用该角色登录。
标准角色:
CKU_SO uint = 0
CKU_USER uint = 1
CKU_CONTEXT_SPECIFIC uint = 2
登录功能源代码来自https://github.com/miekg/pkcs11/
func (c *Ctx) Login(sh SessionHandle, userType uint, pin string) error {
p := C.CString(pin)
defer C.free(unsafe.Pointer(p))
e := C.Login(c.ctx, C.CK_SESSION_HANDLE(sh), C.CK_USER_TYPE(userType), p, C.CK_ULONG(len(pin)))
return toError(e)
}
在c#。我使用PKCS11Interop包,它的登录函数也只接受int参数作为userType。但是可以使用未选中的关键字。因此,我可以在Login函数中输入负值而不会出现错误。
下面是我在c#中使用https://github.com/Pkcs11Interop 的示例代码public enum SpecialRole
{
CU = -12345
}
session.Login(unchecked((CKU)SpecialRole.CU), Settings.CryptoUserPin);
那么,我如何在Go中做到这一点呢?请建议。
如果参数类型为uint
,则只能传递可分配给uint
类型的值(如Spec: Calls中所述)。且uint
的有效范围不包含负数
您可以做的是将您的负值转换为uint
。将负的int
转换为uint
大致相当于从int
的最大值加上1减去绝对值。所以如果你的其他常数很小,这不会导致碰撞。
例如:
func main() {
f(1)
f(math.MaxUint64+1 -10)
x := -10
f(uint(x))
}
func f(i uint) {
fmt.Println(i)
}
这将输出(在Go Playground上试试):
1
18446744073709551606
18446744073709551606