lib/min_crypto.nim
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
import base64 import ../core/parser, ../core/value, ../core/interpreter, ../core/utils when defined(ssl): import strutils, openssl, times, ../vendor/aes/aes {.compile: "../vendor/aes/libaes.c".} when defined(windows): {.passL: "-static -Lvendor/openssl/windows -lssl -lcrypto -lws2_32".} elif defined(linux): {.passL: "-static -Lvendor/openssl/linux -lssl -lcrypto".} elif defined(macosx): {.passL: "-Bstatic -Lvendor/openssl/macosx -lssl -lcrypto -Bdynamic".} proc EVP_MD_CTX_new*(): EVP_MD_CTX {.cdecl, importc: "EVP_MD_CTX_new".} proc EVP_MD_CTX_free*(ctx: EVP_MD_CTX) {.cdecl, importc: "EVP_MD_CTX_free".} proc hash(s: string, kind: EVP_MD, size: int): string = var hash_length: cuint = 0 var hash = alloc[ptr cuchar](size) let ctx = EVP_MD_CTX_new() discard EVP_DigestInit_ex(ctx, kind, nil) discard EVP_DigestUpdate(ctx, unsafeAddr s[0], s.len.cuint) discard EVP_DigestFinal_ex(ctx, hash, cast[ptr cuint](hash_length)) EVP_MD_CTX_free(ctx) var hashStr = newString(size) copyMem(addr(hashStr[0]), hash, size) dealloc(hash) return hashStr.toHex.toLowerAscii[0..size-1] proc crypto_module*(i: In)= let def = i.define() def.symbol("encode") do (i: In): let vals = i.expect("'sym") let s = vals[0] i.push s.getString.encode.newVal def.symbol("decode") do (i: In): let vals = i.expect("'sym") let s = vals[0] i.push s.getString.decode.newVal when defined(ssl): def.symbol("md5") do (i: In): let vals = i.expect("'sym") let s = vals[0].getString i.push hash(s, EVP_md5(), 32).newVal def.symbol("md4") do (i: In): let vals = i.expect("'sym") let s = vals[0].getString i.push hash(s, EVP_md4(), 32).newVal def.symbol("sha1") do (i: In): let vals = i.expect("'sym") var s = vals[0].getString i.push hash(s, EVP_sha1(), 40).newVal def.symbol("sha224") do (i: In): let vals = i.expect("'sym") let s = vals[0].getString i.push hash(s, EVP_sha224(), 56).newVal def.symbol("sha256") do (i: In): let vals = i.expect("'sym") let s = vals[0].getString i.push hash(s, EVP_sha256(), 64).newVal def.symbol("sha384") do (i: In): let vals = i.expect("'sym") let s = vals[0].getString i.push hash(s, EVP_sha384(), 96).newVal def.symbol("sha512") do (i: In): let vals = i.expect("'sym") let s = vals[0].getString i.push hash(s, EVP_sha512(), 128).newVal def.symbol("aes") do (i: In): let vals = i.expect("'sym", "'sym") let k = vals[0] let s = vals[1] var text = s.getString var key = hash(k.getString, EVP_sha1(), 40) var iv = hash((key & $getTime().toUnix), EVP_sha1(), 40) var ctx = cast[ptr AES_ctx](alloc0(sizeof(AES_ctx))) AES_init_ctx_iv(ctx, cast[ptr uint8](key[0].addr), cast[ptr uint8](iv[0].addr)); var input = cast[ptr uint8](text[0].addr) AES_CTR_xcrypt_buffer(ctx, input, text.len.uint32); i.push text.newVal def.finalize("crypto") |