Crypt-HSM

 view release on metacpan or  search on metacpan

lib/Crypt/HSM.xs  view on Meta::CPAN

	RETVAL = newHV();
	hv_stores(RETVAL, "cryptoki-version", version_to_sv(&info.cryptokiVersion));
	hv_stores(RETVAL, "manufacturer-id", trimmed_value(info.manufacturerID, 32));
	hv_stores(RETVAL, "flags", newRV_noinc((SV*)newHV()));
	hv_stores(RETVAL, "library-description", trimmed_value(info.libraryDescription, 32));
	hv_stores(RETVAL, "library-version", version_to_sv(&info.libraryVersion));
OUTPUT: RETVAL


void slots(Crypt::HSM::Provider self, CK_BBOOL tokenPresent = 1)
PPCODE:
	CK_ULONG count, i;

	CK_RV result = self->funcs->C_GetSlotList(tokenPresent, NULL, &count);
	if ( result != CKR_OK )
		croak_with("Couldn't get slots", result);

	EXTEND(SP, (int)count);

	CK_SLOT_ID_PTR slotList = safecalloc(count, sizeof(CK_SLOT_ID));
	SAVEFREEPV(slotList);

lib/Crypt/HSM.xs  view on Meta::CPAN

	if (result != CKR_OK)
		croak_with("Could not open session", result);

	RETVAL = PerlMemShared_calloc(1, sizeof(struct Session));
	refcount_init(&RETVAL->refcount, 1);
	RETVAL->slot = slot_refcount_increment(self);
	RETVAL->handle = handle;
OUTPUT: RETVAL

void mechanisms(Crypt::HSM::Slot self)
PPCODE:
	CK_ULONG length, i;
	CK_RV result = slot_funcs(self)->C_GetMechanismList(self->slot, NULL, &length);
	if (result != CKR_OK)
		croak_with("Couldn't get mechanisms length", result);

	CK_MECHANISM_TYPE* types = safecalloc(length, sizeof(CK_MECHANISM_TYPE));
	SAVEFREEPV(types);
	result = slot_funcs(self)->C_GetMechanismList(self->slot, types, &length);
	if (result != CKR_OK)
		croak_with("Couldn't get mechanisms", result);

lib/Crypt/HSM.xs  view on Meta::CPAN

CODE:
	CK_ULONG flags = 0;
	int i;
	for (i = 1; i < items; ++i)
		flags |= get_flags(mechanism_flags, ST(i));
	RETVAL = (self->flags & flags) == flags;
OUTPUT: RETVAL


void flags(Crypt::HSM::Mechanism::Info self)
PPCODE:
	CK_ULONG i;
	for (i = 0; i < CHAR_BIT * sizeof(CK_ULONG); ++i) {
		CK_ULONG right = 1ul << i;
		if (self->flags & right)
			mXPUSHs(entry_to_sv(map_reverse_find(mechanism_flags, right)));
	}


CK_ULONG min_key_size(Crypt::HSM::Mechanism::Info self)
CODE:

lib/Crypt/HSM.xs  view on Meta::CPAN

	CK_OBJECT_HANDLE handle;
	CK_RV result = session_funcs(self)->C_CreateObject(self->handle, template.member, template.length, &handle);
	if (result != CKR_OK)
		croak_with("Could not create object", result);

	RETVAL = new_object(self, handle);
OUTPUT: RETVAL


void find_objects(Crypt::HSM::Session self, Attributes attributes = empty)
PPCODE:
	CK_RV result = session_funcs(self)->C_FindObjectsInit(self->handle, attributes.member, attributes.length);
	if (result != CKR_OK)
		croak_with("Could not find objects", result);

	CK_ULONG actual = 0;
	do {
		CK_OBJECT_HANDLE current[16];
		CK_ULONG iter;
		CK_RV result = session_funcs(self)->C_FindObjects(self->handle, current, sizeof(current) / sizeof(*current), &actual);
		if (result != CKR_OK) {
			session_funcs(self)->C_FindObjectsFinal(self->handle);
			croak_with("Could not find objects", result);
		}
		for (iter = 0; iter < actual; ++iter)
			mXPUSHs(new_object(self, current[iter]));
	} while (actual > 0);
	session_funcs(self)->C_FindObjectsFinal(self->handle);


void generate_keypair(Crypt::HSM::Session self, CK_MECHANISM_TYPE mechanism_type, Attributes publicKeyTemplate, Attributes privateKeyTemplate, ...)
PPCODE:
	CK_OBJECT_HANDLE publicKey;
	CK_OBJECT_HANDLE privateKey;

	CK_MECHANISM mechanism = mechanism_from_args(mechanism_type, 4);
	CK_RV result = session_funcs(self)->C_GenerateKeyPair(self->handle, &mechanism, publicKeyTemplate.member, publicKeyTemplate.length, privateKeyTemplate.member, privateKeyTemplate.length, &publicKey, &privateKey);
	if (result != CKR_OK)
		croak_with("Could not create keypair", result);

	mXPUSHs(new_object(self, publicKey));
	mXPUSHs(new_object(self, privateKey));



( run in 2.325 seconds using v1.01-cache-2.11-cpan-71847e10f99 )