如何为接受 UINT 参数的函数分配一个负数

How can I assign a negative number to the function that accepts the UINT parameter

来自 meigk/pkcs11 包。 有什么方法可以在登录函数中将负值指定为 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 包,它的登录功能也只接受 uint 参数作为 userType。但是可以通过使用 unchecked 关键字来完成。所以我可以在登录函数中没有错误地输入负值。

这是我在 C# 中使用 https://github.com/Pkcs11Interop

的示例代码
public enum SpecialRole
{
   CU = -12345
}
session.Login(unchecked((CKU)SpecialRole.CU), Settings.CryptoUserPin);

那么,我该如何在 Go 中执行此操作?欢迎推荐。

如果参数类型为uint,则只能传递assignable to the type uint (as stated in 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