diff options
author | daurnimator <quae@daurnimator.com> | 2016-11-08 15:34:44 +1100 |
---|---|---|
committer | daurnimator <quae@daurnimator.com> | 2016-11-08 16:23:03 +1100 |
commit | 3eb66b869582bcd791cf89dd552abc4bb9e7c627 (patch) | |
tree | 872406ac224460159ccba8e776df832852db4a15 /src/openssl.c | |
parent | cb727f97f2e00512c70631210de2d8b951e81587 (diff) | |
download | luaossl-3eb66b869582bcd791cf89dd552abc4bb9e7c627.tar.gz luaossl-3eb66b869582bcd791cf89dd552abc4bb9e7c627.tar.bz2 luaossl-3eb66b869582bcd791cf89dd552abc4bb9e7c627.zip |
openssl.pkey: Add pkey:encrypt() method
Diffstat (limited to 'src/openssl.c')
-rw-r--r-- | src/openssl.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/openssl.c b/src/openssl.c index 4564061..87938e5 100644 --- a/src/openssl.c +++ b/src/openssl.c | |||
@@ -3181,6 +3181,61 @@ static int pk_setPrivateKey(lua_State *L) { | |||
3181 | } /* pk_setPrivateKey() */ | 3181 | } /* pk_setPrivateKey() */ |
3182 | 3182 | ||
3183 | 3183 | ||
3184 | static int pk_encrypt(lua_State *L) { | ||
3185 | size_t outlen, inlen; | ||
3186 | EVP_PKEY *key = checksimple(L, 1, PKEY_CLASS); | ||
3187 | EVP_PKEY_CTX *ctx; | ||
3188 | const char *str = luaL_checklstring(L, 2, &inlen); | ||
3189 | BIO *bio; | ||
3190 | BUF_MEM *buf; | ||
3191 | int rsaPadding = RSA_PKCS1_PADDING; /* default for `openssl rsautl` */ | ||
3192 | int base_type = EVP_PKEY_base_id(key); | ||
3193 | |||
3194 | if (lua_istable(L, 3)) { | ||
3195 | if (base_type == EVP_PKEY_RSA) { | ||
3196 | lua_getfield(L, 3, "rsaPadding"); | ||
3197 | rsaPadding = luaL_optint(L, -1, rsaPadding); | ||
3198 | lua_pop(L, 1); | ||
3199 | } | ||
3200 | } | ||
3201 | |||
3202 | bio = getbio(L); | ||
3203 | BIO_get_mem_ptr(bio, &buf); | ||
3204 | |||
3205 | if (!(ctx = EVP_PKEY_CTX_new(key, NULL))) | ||
3206 | goto sslerr; | ||
3207 | |||
3208 | if (EVP_PKEY_encrypt_init(ctx) <= 0) | ||
3209 | goto sslerr; | ||
3210 | |||
3211 | if (base_type == EVP_PKEY_RSA && !EVP_PKEY_CTX_set_rsa_padding(ctx, rsaPadding)) | ||
3212 | goto sslerr; | ||
3213 | |||
3214 | if (EVP_PKEY_encrypt(ctx, NULL, &outlen, str, inlen) <= 0) | ||
3215 | goto sslerr; | ||
3216 | |||
3217 | if (!BUF_MEM_grow_clean(buf, outlen)) | ||
3218 | goto sslerr; | ||
3219 | |||
3220 | if (EVP_PKEY_encrypt(ctx, buf->data, &outlen, str, inlen) <= 0) | ||
3221 | goto sslerr; | ||
3222 | |||
3223 | EVP_PKEY_CTX_free(ctx); | ||
3224 | ctx = NULL; | ||
3225 | |||
3226 | lua_pushlstring(L, buf->data, outlen); | ||
3227 | |||
3228 | return 1; | ||
3229 | sslerr: | ||
3230 | if (ctx) { | ||
3231 | EVP_PKEY_CTX_free(ctx); | ||
3232 | ctx = NULL; | ||
3233 | } | ||
3234 | |||
3235 | return auxL_error(L, auxL_EOPENSSL, "pkey:encrypt"); | ||
3236 | } /* pk_encrypt() */ | ||
3237 | |||
3238 | |||
3184 | static int pk_sign(lua_State *L) { | 3239 | static int pk_sign(lua_State *L) { |
3185 | EVP_PKEY *key = checksimple(L, 1, PKEY_CLASS); | 3240 | EVP_PKEY *key = checksimple(L, 1, PKEY_CLASS); |
3186 | EVP_MD_CTX *md = checksimple(L, 2, DIGEST_CLASS); | 3241 | EVP_MD_CTX *md = checksimple(L, 2, DIGEST_CLASS); |
@@ -3907,6 +3962,7 @@ static const auxL_Reg pk_methods[] = { | |||
3907 | { "type", &pk_type }, | 3962 | { "type", &pk_type }, |
3908 | { "setPublicKey", &pk_setPublicKey }, | 3963 | { "setPublicKey", &pk_setPublicKey }, |
3909 | { "setPrivateKey", &pk_setPrivateKey }, | 3964 | { "setPrivateKey", &pk_setPrivateKey }, |
3965 | { "encrypt", &pk_encrypt }, | ||
3910 | { "sign", &pk_sign }, | 3966 | { "sign", &pk_sign }, |
3911 | { "verify", &pk_verify }, | 3967 | { "verify", &pk_verify }, |
3912 | { "getDefaultDigestName", &pk_getDefaultDigestName }, | 3968 | { "getDefaultDigestName", &pk_getDefaultDigestName }, |