CDS
view release on metacpan or search on metacpan
lib/CDS/C.pm view on Meta::CPAN
SV * publicKeyFromPrivateKey(SV * svPrivateKey) {
struct cdsRSAPrivateKey * key = privateKeyFromSV(svPrivateKey);
struct cdsRSAPublicKey publicKey;
memcpy(&publicKey.e, &key->rsaPublicKey.e, sizeof(struct cdsBigInteger));
memcpy(&publicKey.n, &key->rsaPublicKey.n, sizeof(struct cdsBigInteger));
SV * obj = newSVpvn((char *) &publicKey, sizeof(struct cdsRSAPublicKey));
SvREADONLY_on(obj);
return obj;
}
SV * publicKeyNew(SV * svE, SV * svN) {
struct cdsRSAPublicKey key;
cdsInitializePublicKey(&key, bytesFromSV(svE), bytesFromSV(svN));
if (! key.isValid) return &PL_sv_undef;
SV * obj = newSVpvn((char *) &key, sizeof(struct cdsRSAPublicKey));
SvREADONLY_on(obj);
return obj;
}
SV * publicKeyE(SV * svThis) {
struct cdsRSAPublicKey * this = publicKeyFromSV(svThis);
if (this == NULL) return &PL_sv_undef;
return svFromBigInteger(&this->e);
}
SV * publicKeyN(SV * svThis) {
struct cdsRSAPublicKey * this = publicKeyFromSV(svThis);
if (this == NULL) return &PL_sv_undef;
return svFromBigInteger(&this->n);
}
SV * publicKeyVerify(SV * svThis, SV * svDigest, SV * svSignature) {
struct cdsRSAPublicKey * this = publicKeyFromSV(svThis);
if (this == NULL) return &PL_sv_undef;
bool ok = cdsVerify(this, bytesFromSV(svDigest), bytesFromSV(svSignature));
return ok ? &PL_sv_yes : &PL_sv_no;
}
SV * publicKeyEncrypt(SV * svThis, SV * svMessage) {
struct cdsRSAPublicKey * this = publicKeyFromSV(svThis);
if (this == NULL) return &PL_sv_undef;
uint8_t buffer[256];
struct cdsBytes encrypted = cdsEncrypt(this, bytesFromSV(svMessage), buffer);
return svFromBytes(encrypted);
}
SV * performanceStart() {
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
SV * obj = newSVpvn((char *) &ts, sizeof(struct timespec));
SvREADONLY_on(obj);
return obj;
}
static struct timespec * timerFromSV(SV * sv) {
if (! SvPOK(sv)) return NULL;
STRLEN length;
struct timespec * ts = (struct timespec *) SvPV(sv, length);
return length == sizeof(struct timespec) ? ts : NULL;
}
SV * performanceElapsed(SV * svThis) {
struct timespec * this = timerFromSV(svThis);
if (this == NULL) return &PL_sv_undef;
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
time_t dsec = ts.tv_sec - this->tv_sec;
long dnano = ts.tv_nsec - this->tv_nsec;
long diff = (long) dsec * 1000 * 1000 + dnano / 1000;
return newSViv(diff);
}
ENDOFCODE
1;
( run in 0.676 second using v1.01-cache-2.11-cpan-9581c071862 )