// NewAttribute allocates a Attribute and returns a pointer to it. // Note that this is merely a convience function, as values returned // from the HSM are not converted back to Go values, those are just raw // byte slices. func NewAttribute(typ uint, x interface{}) *Attribute { // This function nicely transforms *to* an attribute, but there is // no corresponding function that transform back *from* an attribute, // which in PKCS#11 is just an byte array. a := new(Attribute) a.Type = typ if x == nil { return a } switch x.(type) { case bool: // create bbool if x.(bool) { a.Value = []byte{1} break } a.Value = []byte{0} case uint, int: var y uint if _, ok := x.(int); ok { y = uint(x.(int)) } if _, ok := x.(uint); ok { y = x.(uint) } // TODO(miek): ugly! switch int(C.Sizeof()) { case 4: a.Value = make([]byte, 4) a.Value[0] = byte(y) a.Value[1] = byte(y >> 8) a.Value[2] = byte(y >> 16) a.Value[3] = byte(y >> 24) case 8: a.Value = make([]byte, 8) a.Value[0] = byte(y) a.Value[1] = byte(y >> 8) a.Value[2] = byte(y >> 16) a.Value[3] = byte(y >> 24) a.Value[4] = byte(y >> 32) a.Value[5] = byte(y >> 40) a.Value[6] = byte(y >> 48) a.Value[7] = byte(y >> 56) } case string: a.Value = []byte(x.(string)) case []byte: // just copy a.Value = x.([]byte) case time.Time: // for CKA_DATE a.Value = cDate(x.(time.Time)) default: panic("pkcs11: unhandled attribute type") } return a }
// NewAttribute allocates a Attribute and returns a pointer to it. // Note that this is merely a convience function, as values returned // from the HSM are not converted back to Go values, those are just raw // byte slices. func NewAttribute(typ uint, x interface{}) *Attribute { a := new(Attribute) a.Type = typ if x == nil { return a } switch x.(type) { case bool: // create bbool if x.(bool) { a.Value = []byte{1} break } a.Value = []byte{0} case uint, int: var y uint if _, ok := x.(int); ok { y = uint(x.(int)) } if _, ok := x.(uint); ok { y = x.(uint) } switch int(C.Sizeof()) { case 4: a.Value = make([]byte, 4) a.Value[0] = byte(y) a.Value[1] = byte(y >> 8) a.Value[2] = byte(y >> 16) a.Value[3] = byte(y >> 24) case 8: a.Value = make([]byte, 8) a.Value[0] = byte(y) a.Value[1] = byte(y >> 8) a.Value[2] = byte(y >> 16) a.Value[3] = byte(y >> 24) a.Value[4] = byte(y >> 32) a.Value[5] = byte(y >> 40) a.Value[6] = byte(y >> 48) a.Value[7] = byte(y >> 56) } case string: a.Value = []byte(x.(string)) case []byte: // just copy a.Value = x.([]byte) case time.Time: // for CKA_DATE a.Value = cDate(x.(time.Time)) default: panic("pkcs11: unhandled attribute type") } return a }