// cAttribute returns the start address and the length of an attribute list. func cAttributeList(a []*Attribute) (arena, C.CK_ATTRIBUTE_PTR, C.CK_ULONG) { var arena arena if len(a) == 0 { return nil, nil, 0 } pa := make([]C.CK_ATTRIBUTE, len(a)) for i := 0; i < len(a); i++ { pa[i]._type = C.CK_ATTRIBUTE_TYPE(a[i].Type) if a[i].Value == nil { continue } pa[i].pValue, pa[i].ulValueLen = arena.Allocate(a[i].Value) } return arena, C.CK_ATTRIBUTE_PTR(&pa[0]), C.CK_ULONG(len(a)) }
// cAttribute returns the start address and the length of an attribute list. func cAttributeList(a []*Attribute) (C.CK_ATTRIBUTE_PTR, C.CK_ULONG) { if len(a) == 0 { return nil, 0 } pa := make([]C.CK_ATTRIBUTE, len(a)) for i := 0; i < len(a); i++ { pa[i]._type = C.CK_ATTRIBUTE_TYPE(a[i].Type) if a[i].Value == nil { continue } pa[i].pValue = C.CK_VOID_PTR((&a[i].Value[0])) pa[i].ulValueLen = C.CK_ULONG(len(a[i].Value)) } return C.CK_ATTRIBUTE_PTR(&pa[0]), C.CK_ULONG(len(a)) }
/* GetAttributeValue obtains the value of one or more object attributes. */ func (c *Ctx) GetAttributeValue(sh SessionHandle, o ObjectHandle, a []*Attribute) ([]*Attribute, error) { // copy the attribute list and make all the values nil, so that // the C function can (allocate) fill them in pa := make([]C.CK_ATTRIBUTE, len(a)) for i := 0; i < len(a); i++ { pa[i]._type = C.CK_ATTRIBUTE_TYPE(a[i].Type) } e := C.GetAttributeValue(c.ctx, C.CK_SESSION_HANDLE(sh), C.CK_OBJECT_HANDLE(o), C.CK_ATTRIBUTE_PTR(&pa[0]), C.CK_ULONG(len(a))) if toError(e) != nil { return nil, toError(e) } a1 := make([]*Attribute, len(a)) for i, c := range pa { x := new(Attribute) x.Type = uint(c._type) if int(c.ulValueLen) != -1 { x.Value = C.GoBytes(unsafe.Pointer(c.pValue), C.int(c.ulValueLen)) C.free(unsafe.Pointer(c.pValue)) } a1[i] = x } return a1, nil }