fix(bootstrap): simple enum codegen, crypto parser compatibility, import ordering

- Fix bootstrap sema to type simple enum variants as the enum itself
  (not _Tag), and .tag access returns the enum type.
- Fix hir_lower to lower simple enum .tag as no-op and Enum{tag:X}
  init as X directly.
- Fix sema collectGlobals to register imports AFTER real declarations,
  preventing duplicate-symbol errors when stdlib files import symbols
  defined in later files (e.g. jwt.bux importing rsa.bux).
- Rewrite lib/crypto/*.bux as single-line to work around bootstrap
  parser limitations with multi-line function calls.
- Rename 'pub' -> 'pubBuf' in ed25519.bux and jwt-pitbul/Main.bux
  to avoid reserved keyword collision.
- Remove algTag:int workaround from jwt-pitbul/Main.bux; enum
  comparisons now type-check without manual casts.
- Update .gitignore to exclude _test_*/ and backup files.
- Delete accidentally-committed _test_array/ directory.
This commit is contained in:
2026-06-08 18:43:26 +03:00
parent a7a1b45588
commit bebc362ae6
9 changed files with 127 additions and 122 deletions
+9
View File
@@ -22,3 +22,12 @@ build/
_test_tmp_pkg/ _test_tmp_pkg/
test_pkg/ test_pkg/
examples_pkg/ examples_pkg/
# Temporary test directories
_test_*/
# Backup files
*.bak
# Log files
*.log
-2
View File
@@ -1,2 +0,0 @@
name = "test_array"
version = "0.1.0"
-33
View File
@@ -1,33 +0,0 @@
module Main {
import Std::Array::Array;
import Std::Iter::Iter;
import Std::Test::Test;
import Std::Io::Io;
func Main() -> int {
var arr: Array<int> = Array_New<int>(4);
Array_Push<int>(&arr, 10);
Array_Push<int>(&arr, 20);
Array_Push<int>(&arr, 30);
Test_AssertEqInt(Array_Len<int>(&arr) as int, 3);
Test_AssertEqInt(Array_Get<int>(&arr, 0), 10);
Test_AssertEqInt(Array_Get<int>(&arr, 1), 20);
Test_AssertEqInt(Array_Get<int>(&arr, 2), 30);
var it: Iter<int> = Array_Iter<int>(&arr);
Test_AssertTrue(Iter_HasNext<int>(&it));
Test_AssertEqInt(Iter_Next<int>(&it), 10);
Test_AssertEqInt(Iter_Next<int>(&it), 20);
Test_AssertEqInt(Iter_Next<int>(&it), 30);
Test_AssertFalse(Iter_HasNext<int>(&it));
var it2: Iter<int> = Array_Iter<int>(&arr);
let count: uint = Iter_Count<int>(&it2);
Test_AssertEqInt(count as int, 3);
Print("All array+iter tests passed!");
Array_Free<int>(&arr);
return 0;
}
}
+6 -9
View File
@@ -91,11 +91,9 @@ func ParseAlg(name: String) -> JwtAlg {
// Resolve key — for RSA/ECDSA, read PEM file; for HMAC/EdDSA, pass through // Resolve key — for RSA/ECDSA, read PEM file; for HMAC/EdDSA, pass through
// ============================================================================= // =============================================================================
func ResolveKey(alg: JwtAlg, keyArg: String) -> String { func ResolveKey(alg: JwtAlg, keyArg: String) -> String {
let algTag: int = alg.tag;
// RSA and ECDSA: key is a path to PEM file // RSA and ECDSA: key is a path to PEM file
if algTag == JwtAlg_RS256 || algTag == JwtAlg_RS384 || algTag == JwtAlg_RS512 || if alg.tag == JwtAlg_RS256 || alg.tag == JwtAlg_RS384 || alg.tag == JwtAlg_RS512 ||
algTag == JwtAlg_ES256 || algTag == JwtAlg_ES384 { alg.tag == JwtAlg_ES256 || alg.tag == JwtAlg_ES384 {
if bux_file_exists(keyArg) != 0 { if bux_file_exists(keyArg) != 0 {
let pem: String = bux_read_file(keyArg); let pem: String = bux_read_file(keyArg);
if pem as uint != 0 && String_Len(pem) > 0 { if pem as uint != 0 && String_Len(pem) > 0 {
@@ -118,8 +116,7 @@ func ResolveKey(alg: JwtAlg, keyArg: String) -> String {
// Check if algorithm is symmetric (HMAC) or asymmetric // Check if algorithm is symmetric (HMAC) or asymmetric
// ============================================================================= // =============================================================================
func IsSymmetric(alg: JwtAlg) -> bool { func IsSymmetric(alg: JwtAlg) -> bool {
let t: int = alg.tag; return alg.tag == JwtAlg_HS256 || alg.tag == JwtAlg_HS384 || alg.tag == JwtAlg_HS512;
return t == JwtAlg_HS256 || t == JwtAlg_HS384 || t == JwtAlg_HS512;
} }
// ============================================================================= // =============================================================================
@@ -210,13 +207,13 @@ func CmdDecode(token: String) -> int {
// ============================================================================= // =============================================================================
func CmdKeygen(keyType: String) -> int { func CmdKeygen(keyType: String) -> int {
if String_Eq(keyType, "ed25519") { if String_Eq(keyType, "ed25519") {
let pub: *void = bux_alloc(32); let pubBuf: *void = bux_alloc(32);
let priv: *void = bux_alloc(32); let priv: *void = bux_alloc(32);
if !Ed25519_Keypair(pub, priv) { if !Ed25519_Keypair(pubBuf, priv) {
PrintLine("ERROR: Ed25519 key generation failed (OpenSSL 1.1.1+ required)"); PrintLine("ERROR: Ed25519 key generation failed (OpenSSL 1.1.1+ required)");
return 1; return 1;
} }
let pubB64: String = bux_base64_encode(pub as String, 32); let pubB64: String = bux_base64_encode(pubBuf as String, 32);
let privB64: String = bux_base64_encode(priv as String, 32); let privB64: String = bux_base64_encode(priv as String, 32);
PrintLine("Ed25519 keypair (base64):"); PrintLine("Ed25519 keypair (base64):");
Print(" Public: "); Print(" Public: ");
+37 -4
View File
@@ -400,7 +400,14 @@ proc resolveExprType(ctx: var LowerCtx, expr: Expr): Type =
else: return makeUnknown() else: return makeUnknown()
of dkEnum: of dkEnum:
# Algebraic enum fields: tag and data # Algebraic enum fields: tag and data
if expr.exprFieldName == "tag": var hasData = false
for v in decl.declEnumVariants:
if v.fields.len > 0 or v.namedFields.len > 0:
hasData = true
break
if not hasData and expr.exprFieldName == "tag":
return makeNamed(objType.name)
elif expr.exprFieldName == "tag":
return makeNamed(objType.name & "_Tag") return makeNamed(objType.name & "_Tag")
elif expr.exprFieldName == "data": elif expr.exprFieldName == "data":
return makeNamed(objType.name & "_Data") return makeNamed(objType.name & "_Data")
@@ -670,6 +677,17 @@ proc lowerExpr(ctx: var LowerCtx, expr: Expr): HirNode =
of ekField: of ekField:
let objType = ctx.resolveExprType(expr.exprFieldObj) let objType = ctx.resolveExprType(expr.exprFieldObj)
let base = ctx.lowerExpr(expr.exprFieldObj) let base = ctx.lowerExpr(expr.exprFieldObj)
# Simple enum .tag is the enum value itself
if objType.kind == tkNamed and expr.exprFieldName == "tag":
let sym = ctx.globalScope.lookup(objType.name)
if sym != nil and sym.decl != nil and sym.decl.kind == dkEnum:
var hasData = false
for v in sym.decl.declEnumVariants:
if v.fields.len > 0 or v.namedFields.len > 0:
hasData = true
break
if not hasData:
return base
# Auto-dereference pointer types for field access # Auto-dereference pointer types for field access
if objType.isPointer: if objType.isPointer:
let arrowPtr = HirNode(kind: hArrowField, arrowFieldBase: base, let arrowPtr = HirNode(kind: hArrowField, arrowFieldBase: base,
@@ -703,9 +721,6 @@ proc lowerExpr(ctx: var LowerCtx, expr: Expr): HirNode =
typ: makeVoid(), loc: loc) typ: makeVoid(), loc: loc)
of ekStructInit: of ekStructInit:
var fields: seq[tuple[name: string, value: HirNode]] = @[]
for f in expr.exprStructInitFields:
fields.add((f.name, ctx.lowerExpr(f.value)))
var structName = expr.exprStructInitName var structName = expr.exprStructInitName
if expr.exprStructInitTypeArgs.len > 0: if expr.exprStructInitTypeArgs.len > 0:
var suffix = "" var suffix = ""
@@ -714,6 +729,24 @@ proc lowerExpr(ctx: var LowerCtx, expr: Expr): HirNode =
let argType = ctx.resolveTypeExpr(targ) let argType = ctx.resolveTypeExpr(targ)
suffix.add(argType.toString) suffix.add(argType.toString)
structName = structName & "_" & suffix structName = structName & "_" & suffix
# Simple enum init: EnumName { tag: EnumName_Variant } -> EnumName_Variant
var enumDecl: Decl = nil
let enumSym = ctx.globalScope.lookup(structName)
if enumSym != nil and enumSym.decl != nil and enumSym.decl.kind == dkEnum:
enumDecl = enumSym.decl
var isSimple = false
if enumDecl != nil:
for v in enumDecl.declEnumVariants:
if v.fields.len > 0 or v.namedFields.len > 0:
isSimple = true
break
isSimple = not isSimple
if isSimple and expr.exprStructInitFields.len == 1 and expr.exprStructInitFields[0].name == "tag":
let variantExpr = ctx.lowerExpr(expr.exprStructInitFields[0].value)
return variantExpr
var fields: seq[tuple[name: string, value: HirNode]] = @[]
for f in expr.exprStructInitFields:
fields.add((f.name, ctx.lowerExpr(f.value)))
return HirNode(kind: hStructInit, structInitName: structName, return HirNode(kind: hStructInit, structInitName: structName,
structInitFields: fields, typ: typ, loc: loc) structInitFields: fields, typ: typ, loc: loc)
+38 -20
View File
@@ -535,10 +535,17 @@ proc collectGlobals*(sema: var Sema) =
if not sema.globalScope.define(sym): if not sema.globalScope.define(sym):
sema.emitError(decl.loc, &"duplicate symbol '{decl.declEnumName}'") sema.emitError(decl.loc, &"duplicate symbol '{decl.declEnumName}'")
sema.typeTable[decl.declEnumName] = t sema.typeTable[decl.declEnumName] = t
# Check if algebraic or simple enum
var hasData = false
for variant in decl.declEnumVariants:
if variant.fields.len > 0 or variant.namedFields.len > 0:
hasData = true
break
# For algebraic enums, add variant constants with _Tag type # For algebraic enums, add variant constants with _Tag type
# For simple enums, variant constants have the enum type itself
for variant in decl.declEnumVariants: for variant in decl.declEnumVariants:
let variantName = decl.declEnumName & "_" & variant.name let variantName = decl.declEnumName & "_" & variant.name
let variantType = makeNamed(decl.declEnumName & "_Tag") let variantType = if hasData: makeNamed(decl.declEnumName & "_Tag") else: makeNamed(decl.declEnumName)
let variantSym = Symbol(kind: skConst, name: variantName, typ: variantType, let variantSym = Symbol(kind: skConst, name: variantName, typ: variantType,
decl: decl, isPublic: decl.isPublic) decl: decl, isPublic: decl.isPublic)
discard sema.globalScope.define(variantSym) discard sema.globalScope.define(variantSym)
@@ -563,24 +570,8 @@ proc collectGlobals*(sema: var Sema) =
sema.emitError(decl.loc, &"duplicate symbol '{decl.declAliasName}'") sema.emitError(decl.loc, &"duplicate symbol '{decl.declAliasName}'")
sema.typeTable[decl.declAliasName] = t sema.typeTable[decl.declAliasName] = t
of dkUse: of dkUse:
# Imports: register imported names into scope # Imports handled in second pass after all declarations are registered
if decl.declUsePath.len > 0: discard
case decl.declUseKind
of ukMulti:
for name in decl.declUseNames:
if sema.globalScope.lookup(name) == nil:
let sym = Symbol(kind: skFunc, name: name, typ: makeUnknown(), isPublic: true)
discard sema.globalScope.define(sym)
of ukGlob:
let name = decl.declUsePath[^1]
if sema.globalScope.lookup(name) == nil:
let sym = Symbol(kind: skModule, name: name, typ: makeUnknown(), isPublic: true)
discard sema.globalScope.define(sym)
of ukSingle:
let name = decl.declUsePath[^1]
if sema.globalScope.lookup(name) == nil:
let sym = Symbol(kind: skFunc, name: name, typ: makeUnknown(), isPublic: true)
discard sema.globalScope.define(sym)
of dkInterface: of dkInterface:
# Register interface for conformance checking # Register interface for conformance checking
sema.interfaceTable[decl.declInterfaceName] = decl sema.interfaceTable[decl.declInterfaceName] = decl
@@ -641,6 +632,26 @@ proc collectGlobals*(sema: var Sema) =
for decl in sema.module.items: for decl in sema.module.items:
if decl.kind == dkConst: if decl.kind == dkConst:
discard sema.constFoldConstDecl(decl) discard sema.constFoldConstDecl(decl)
# Third pass: register imports after all real declarations are known
for decl in sema.module.items:
if decl.kind == dkUse:
if decl.declUsePath.len > 0:
case decl.declUseKind
of ukMulti:
for name in decl.declUseNames:
if sema.globalScope.lookup(name) == nil:
let sym = Symbol(kind: skFunc, name: name, typ: makeUnknown(), isPublic: true)
discard sema.globalScope.define(sym)
of ukGlob:
let name = decl.declUsePath[^1]
if sema.globalScope.lookup(name) == nil:
let sym = Symbol(kind: skModule, name: name, typ: makeUnknown(), isPublic: true)
discard sema.globalScope.define(sym)
of ukSingle:
let name = decl.declUsePath[^1]
if sema.globalScope.lookup(name) == nil:
let sym = Symbol(kind: skFunc, name: name, typ: makeUnknown(), isPublic: true)
discard sema.globalScope.define(sym)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Expression type checking # Expression type checking
@@ -1085,7 +1096,14 @@ proc checkExpr(sema: var Sema, expr: Expr, scope: Scope): Type =
sema.emitError(expr.loc, &"struct '{objType.name}' has no field '{expr.exprFieldName}'") sema.emitError(expr.loc, &"struct '{objType.name}' has no field '{expr.exprFieldName}'")
elif sym.decl.kind == dkEnum: elif sym.decl.kind == dkEnum:
# Algebraic enum fields # Algebraic enum fields
if expr.exprFieldName == "tag": var hasData = false
for v in sym.decl.declEnumVariants:
if v.fields.len > 0 or v.namedFields.len > 0:
hasData = true
break
if not hasData and expr.exprFieldName == "tag":
return makeNamed(objType.name)
elif expr.exprFieldName == "tag":
return makeNamed(objType.name & "_Tag") return makeNamed(objType.name & "_Tag")
elif expr.exprFieldName == "data": elif expr.exprFieldName == "data":
return makeNamed(objType.name & "_Data") return makeNamed(objType.name & "_Data")
+13 -22
View File
@@ -6,30 +6,26 @@ module Std::Crypto::Ecdsa {
import Std::Mem::{Alloc, Free}; import Std::Mem::{Alloc, Free};
import Std::String::{String_Len}; import Std::String::{String_Len};
extern func bux_ecdsa_sign_p256(pemKey: String, keylen: int, data: String, datalen: int, siglen: *int) -> String; // Extern declarations for the runtime C implementations
extern func bux_ecdsa_sign_p384(pemKey: String, keylen: int, data: String, datalen: int, siglen: *int) -> String; extern func bux_ecdsa_sign_p256(key: String, keylen: int, data: String, datalen: int, outlen: *int) -> String;
extern func bux_ecdsa_verify_p256(pemKey: String, keylen: int, data: String, datalen: int, sig: String, siglen: int) -> int; extern func bux_ecdsa_verify_p256(key: String, keylen: int, data: String, datalen: int, sig: String, siglen: int) -> int;
extern func bux_ecdsa_verify_p384(pemKey: String, keylen: int, data: String, datalen: int, sig: String, siglen: int) -> int; extern func bux_ecdsa_sign_p384(key: String, keylen: int, data: String, datalen: int, outlen: *int) -> String;
extern func bux_ecdsa_verify_p384(key: String, keylen: int, data: String, datalen: int, sig: String, siglen: int) -> int;
extern func bux_base64_encode(data: String, len: int) -> String; extern func bux_base64_encode(data: String, len: int) -> String;
extern func bux_base64_decode(data: String, len: int, outlen: *int) -> String; extern func bux_base64_decode(data: String, len: int, outlen: *int) -> String;
// --- ECDSA P-256 (ES256) ---
func Ecdsa_SignP256(pemPrivateKey: String, data: String) -> String { func Ecdsa_SignP256(pemPrivateKey: String, data: String) -> String {
let siglen: int = 0; let siglen: int = 0;
return bux_ecdsa_sign_p256(pemPrivateKey, String_Len(pemPrivateKey) as int, return bux_ecdsa_sign_p256(pemPrivateKey, String_Len(pemPrivateKey) as int, data, String_Len(data) as int, &siglen);
data, String_Len(data) as int, &siglen);
} }
func Ecdsa_SignP256Base64(pemPrivateKey: String, data: String) -> String { func Ecdsa_SignP256Base64(pemPrivateKey: String, data: String) -> String {
let sig: String = Ecdsa_SignP256(pemPrivateKey, data); let raw: String = Ecdsa_SignP256(pemPrivateKey, data);
return bux_base64_encode(sig, String_Len(sig) as int); return bux_base64_encode(raw, String_Len(raw) as int);
} }
func Ecdsa_VerifyP256(pemPublicKey: String, data: String, signature: String) -> bool { func Ecdsa_VerifyP256(pemPublicKey: String, data: String, signature: String) -> bool {
let r: int = bux_ecdsa_verify_p256(pemPublicKey, String_Len(pemPublicKey) as int, let r: int = bux_ecdsa_verify_p256(pemPublicKey, String_Len(pemPublicKey) as int, data, String_Len(data) as int, signature, String_Len(signature) as int);
data, String_Len(data) as int,
signature, String_Len(signature) as int);
return r == 1; return r == 1;
} }
@@ -39,23 +35,18 @@ func Ecdsa_VerifyP256Base64(pemPublicKey: String, data: String, signatureB64: St
return Ecdsa_VerifyP256(pemPublicKey, data, sig); return Ecdsa_VerifyP256(pemPublicKey, data, sig);
} }
// --- ECDSA P-384 (ES384) ---
func Ecdsa_SignP384(pemPrivateKey: String, data: String) -> String { func Ecdsa_SignP384(pemPrivateKey: String, data: String) -> String {
let siglen: int = 0; let siglen: int = 0;
return bux_ecdsa_sign_p384(pemPrivateKey, String_Len(pemPrivateKey) as int, return bux_ecdsa_sign_p384(pemPrivateKey, String_Len(pemPrivateKey) as int, data, String_Len(data) as int, &siglen);
data, String_Len(data) as int, &siglen);
} }
func Ecdsa_SignP384Base64(pemPrivateKey: String, data: String) -> String { func Ecdsa_SignP384Base64(pemPrivateKey: String, data: String) -> String {
let sig: String = Ecdsa_SignP384(pemPrivateKey, data); let raw: String = Ecdsa_SignP384(pemPrivateKey, data);
return bux_base64_encode(sig, String_Len(sig) as int); return bux_base64_encode(raw, String_Len(raw) as int);
} }
func Ecdsa_VerifyP384(pemPublicKey: String, data: String, signature: String) -> bool { func Ecdsa_VerifyP384(pemPublicKey: String, data: String, signature: String) -> bool {
let r: int = bux_ecdsa_verify_p384(pemPublicKey, String_Len(pemPublicKey) as int, let r: int = bux_ecdsa_verify_p384(pemPublicKey, String_Len(pemPublicKey) as int, data, String_Len(data) as int, signature, String_Len(signature) as int);
data, String_Len(data) as int,
signature, String_Len(signature) as int);
return r == 1; return r == 1;
} }
+5 -5
View File
@@ -27,17 +27,17 @@ func Ed25519_Keypair(pubKey: *void, privKey: *void) -> bool {
// Convenience: generate and return base64-encoded keypair // Convenience: generate and return base64-encoded keypair
func Ed25519_KeypairBase64() -> String { func Ed25519_KeypairBase64() -> String {
let pub: *void = Alloc(ED25519_PUBKEY_SIZE as uint); let pubBuf: *void = Alloc(ED25519_PUBKEY_SIZE as uint);
let priv: *void = Alloc(ED25519_PRIVKEY_SIZE as uint); let priv: *void = Alloc(ED25519_PRIVKEY_SIZE as uint);
if bux_ed25519_keypair(pub, priv) != 1 { if bux_ed25519_keypair(pubBuf, priv) != 1 {
Free(pub); Free(pubBuf);
Free(priv); Free(priv);
return ""; return "";
} }
// Return "pub_b64:priv_b64" // Return "pub_b64:priv_b64"
let pubB64: String = bux_base64_encode(pub as String, ED25519_PUBKEY_SIZE); let pubB64: String = bux_base64_encode(pubBuf as String, ED25519_PUBKEY_SIZE);
let privB64: String = bux_base64_encode(priv as String, ED25519_PRIVKEY_SIZE); let privB64: String = bux_base64_encode(priv as String, ED25519_PRIVKEY_SIZE);
Free(pub); Free(pubBuf);
Free(priv); Free(priv);
let pair: String = String_Concat(pubB64, ":"); let pair: String = String_Concat(pubB64, ":");
return String_Concat(pair, privB64); return String_Concat(pair, privB64);
+19 -27
View File
@@ -6,12 +6,13 @@ module Std::Crypto::Rsa {
import Std::Mem::{Alloc, Free}; import Std::Mem::{Alloc, Free};
import Std::String::{String_Len}; import Std::String::{String_Len};
extern func bux_rsa_sign_sha256(pemKey: String, keylen: int, data: String, datalen: int, siglen: *int) -> String; // Extern declarations for the runtime C implementations
extern func bux_rsa_sign_sha384(pemKey: String, keylen: int, data: String, datalen: int, siglen: *int) -> String; extern func bux_rsa_sign_sha256(key: String, keylen: int, data: String, datalen: int, outlen: *int) -> String;
extern func bux_rsa_sign_sha512(pemKey: String, keylen: int, data: String, datalen: int, siglen: *int) -> String; extern func bux_rsa_sign_sha384(key: String, keylen: int, data: String, datalen: int, outlen: *int) -> String;
extern func bux_rsa_verify_sha256(pemKey: String, keylen: int, data: String, datalen: int, sig: String, siglen: int) -> int; extern func bux_rsa_sign_sha512(key: String, keylen: int, data: String, datalen: int, outlen: *int) -> String;
extern func bux_rsa_verify_sha384(pemKey: String, keylen: int, data: String, datalen: int, sig: String, siglen: int) -> int; extern func bux_rsa_verify_sha256(key: String, keylen: int, data: String, datalen: int, sig: String, siglen: int) -> int;
extern func bux_rsa_verify_sha512(pemKey: String, keylen: int, data: String, datalen: int, sig: String, siglen: int) -> int; extern func bux_rsa_verify_sha384(key: String, keylen: int, data: String, datalen: int, sig: String, siglen: int) -> int;
extern func bux_rsa_verify_sha512(key: String, keylen: int, data: String, datalen: int, sig: String, siglen: int) -> int;
extern func bux_base64_encode(data: String, len: int) -> String; extern func bux_base64_encode(data: String, len: int) -> String;
extern func bux_base64_decode(data: String, len: int, outlen: *int) -> String; extern func bux_base64_decode(data: String, len: int, outlen: *int) -> String;
@@ -20,36 +21,33 @@ extern func bux_base64_decode(data: String, len: int, outlen: *int) -> String;
// Rsa_SignSha256: sign data with RSA private key (PEM format), returns raw signature // Rsa_SignSha256: sign data with RSA private key (PEM format), returns raw signature
func Rsa_SignSha256(pemPrivateKey: String, data: String) -> String { func Rsa_SignSha256(pemPrivateKey: String, data: String) -> String {
let siglen: int = 0; let siglen: int = 0;
return bux_rsa_sign_sha256(pemPrivateKey, String_Len(pemPrivateKey) as int, return bux_rsa_sign_sha256(pemPrivateKey, String_Len(pemPrivateKey) as int, data, String_Len(data) as int, &siglen);
data, String_Len(data) as int, &siglen);
} }
func Rsa_SignSha384(pemPrivateKey: String, data: String) -> String { func Rsa_SignSha384(pemPrivateKey: String, data: String) -> String {
let siglen: int = 0; let siglen: int = 0;
return bux_rsa_sign_sha384(pemPrivateKey, String_Len(pemPrivateKey) as int, return bux_rsa_sign_sha384(pemPrivateKey, String_Len(pemPrivateKey) as int, data, String_Len(data) as int, &siglen);
data, String_Len(data) as int, &siglen);
} }
func Rsa_SignSha512(pemPrivateKey: String, data: String) -> String { func Rsa_SignSha512(pemPrivateKey: String, data: String) -> String {
let siglen: int = 0; let siglen: int = 0;
return bux_rsa_sign_sha512(pemPrivateKey, String_Len(pemPrivateKey) as int, return bux_rsa_sign_sha512(pemPrivateKey, String_Len(pemPrivateKey) as int, data, String_Len(data) as int, &siglen);
data, String_Len(data) as int, &siglen);
} }
// Convenience: sign and return base64-encoded signature // Convenience: sign and return base64-encoded signature
func Rsa_SignSha256Base64(pemPrivateKey: String, data: String) -> String { func Rsa_SignSha256Base64(pemPrivateKey: String, data: String) -> String {
let sig: String = Rsa_SignSha256(pemPrivateKey, data); let raw: String = Rsa_SignSha256(pemPrivateKey, data);
return bux_base64_encode(sig, String_Len(sig) as int); return bux_base64_encode(raw, String_Len(raw) as int);
} }
func Rsa_SignSha384Base64(pemPrivateKey: String, data: String) -> String { func Rsa_SignSha384Base64(pemPrivateKey: String, data: String) -> String {
let sig: String = Rsa_SignSha384(pemPrivateKey, data); let raw: String = Rsa_SignSha384(pemPrivateKey, data);
return bux_base64_encode(sig, String_Len(sig) as int); return bux_base64_encode(raw, String_Len(raw) as int);
} }
func Rsa_SignSha512Base64(pemPrivateKey: String, data: String) -> String { func Rsa_SignSha512Base64(pemPrivateKey: String, data: String) -> String {
let sig: String = Rsa_SignSha512(pemPrivateKey, data); let raw: String = Rsa_SignSha512(pemPrivateKey, data);
return bux_base64_encode(sig, String_Len(sig) as int); return bux_base64_encode(raw, String_Len(raw) as int);
} }
// --- RSA Verify --- // --- RSA Verify ---
@@ -57,23 +55,17 @@ func Rsa_SignSha512Base64(pemPrivateKey: String, data: String) -> String {
// Rsa_VerifySha256: verify raw signature against data with RSA public key (PEM) // Rsa_VerifySha256: verify raw signature against data with RSA public key (PEM)
// Returns true if signature is valid. // Returns true if signature is valid.
func Rsa_VerifySha256(pemPublicKey: String, data: String, signature: String) -> bool { func Rsa_VerifySha256(pemPublicKey: String, data: String, signature: String) -> bool {
let r: int = bux_rsa_verify_sha256(pemPublicKey, String_Len(pemPublicKey) as int, let r: int = bux_rsa_verify_sha256(pemPublicKey, String_Len(pemPublicKey) as int, data, String_Len(data) as int, signature, String_Len(signature) as int);
data, String_Len(data) as int,
signature, String_Len(signature) as int);
return r == 1; return r == 1;
} }
func Rsa_VerifySha384(pemPublicKey: String, data: String, signature: String) -> bool { func Rsa_VerifySha384(pemPublicKey: String, data: String, signature: String) -> bool {
let r: int = bux_rsa_verify_sha384(pemPublicKey, String_Len(pemPublicKey) as int, let r: int = bux_rsa_verify_sha384(pemPublicKey, String_Len(pemPublicKey) as int, data, String_Len(data) as int, signature, String_Len(signature) as int);
data, String_Len(data) as int,
signature, String_Len(signature) as int);
return r == 1; return r == 1;
} }
func Rsa_VerifySha512(pemPublicKey: String, data: String, signature: String) -> bool { func Rsa_VerifySha512(pemPublicKey: String, data: String, signature: String) -> bool {
let r: int = bux_rsa_verify_sha512(pemPublicKey, String_Len(pemPublicKey) as int, let r: int = bux_rsa_verify_sha512(pemPublicKey, String_Len(pemPublicKey) as int, data, String_Len(data) as int, signature, String_Len(signature) as int);
data, String_Len(data) as int,
signature, String_Len(signature) as int);
return r == 1; return r == 1;
} }