如何将负数赋值给接受UINT形参的函数?

  • 本文关键字:UINT 形参 函数 赋值 go pkcs#11
  • 更新时间 :
  • 英文 :


来自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

相关内容

  • 没有找到相关文章

最新更新