Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// swift-tools-version:5.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
name: "tommath",
platforms: [
.macOS(.v10_10), .iOS(.v9), .tvOS(.v9)
],
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(
name: "libtommath",
targets: ["libtommath"])
],
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.target(
name: "libtommath",
path: ".",
exclude: ["demo", "doc", "etc", "logs", "mtest"],
sources: ["."],
publicHeadersPath: "modulemap",
cSettings: [
.headerSearchPath("."),
.unsafeFlags(["-flto=thin"]) // for Dead Code Elimination
])
],
cLanguageStandard: .gnu11,
cxxLanguageStandard: .gnucxx14
)
94 changes: 94 additions & 0 deletions demo/tommath_tests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import XCTest
import libtommath

/* ---> Basic Manipulations <--- */

extension mp_int {
var isZero: Bool { used == 0 }
var isNeg: Bool { sign == MP_NEG }
var isEven: Bool { used == 0 || (dp[0] & 1) == 0 }
var isOdd: Bool { !isEven }
}

func mp_get_u32(_ a: UnsafePointer<mp_int>) -> UInt32 {
return UInt32(bitPattern: mp_get_i32(a))
}

class LibTommathTests: XCTestCase {

override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
}

override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}

func testTrivialStuff() throws {
var a = mp_int()
var b = mp_int()
var c = mp_int()
var d = mp_int()

XCTAssertEqual(mp_init(&a), MP_OKAY)
XCTAssertEqual(mp_init(&b), MP_OKAY)
XCTAssertEqual(mp_init(&c), MP_OKAY)
XCTAssertEqual(mp_init(&d), MP_OKAY)

defer {
mp_clear(&a)
mp_clear(&b)
mp_clear(&c)
mp_clear(&d)
}

XCTAssert(mp_error_to_string(MP_OKAY) != nil)

/* a: 0->5 */
mp_set(&a, 5)
/* a: 5-> b: -5 */
XCTAssertEqual(mp_neg(&a, &b), MP_OKAY)
XCTAssertEqual(mp_cmp(&a, &b), MP_GT)
XCTAssertEqual(mp_cmp(&b, &a), MP_LT)
XCTAssertTrue(b.isNeg)
/* a: 5-> a: -5 */
var t = a // Fix compiler error: Overlapping accesses to 'a', but modification requires exclusive access; consider copying to a local variable
XCTAssertEqual(mp_neg(&t, &a), MP_OKAY)
XCTAssertEqual(mp_cmp(&b, &a), MP_EQ)
XCTAssertTrue(a.isNeg)
/* a: -5-> b: 5 */
XCTAssertEqual(mp_abs(&a, &b), MP_OKAY)
XCTAssertTrue(!b.isNeg)
/* a: -5-> b: -4 */
XCTAssertEqual(mp_add_d(&a, 1, &b), MP_OKAY)
XCTAssertTrue(b.isNeg)
XCTAssertEqual(mp_get_i32(&b), -4)
XCTAssertEqual(mp_get_u32(&b), UInt32(bitPattern: -4))
XCTAssertEqual(mp_get_mag_u32(&b), 4)
/* a: -5-> b: 1 */
XCTAssertEqual(mp_add_d(&a, 6, &b), MP_OKAY)
XCTAssertEqual(mp_get_u32(&b), 1)
/* a: -5-> a: 1 */
t = a
XCTAssertEqual(mp_add_d(&t, 6, &a), MP_OKAY)
XCTAssertEqual(mp_get_u32(&a), 1)
mp_zero(&a);
/* a: 0-> a: 6 */
t = a
XCTAssertEqual(mp_add_d(&t, 6, &a), MP_OKAY)
XCTAssertEqual(mp_get_u32(&a), 6)

mp_set(&a, 42)
mp_set(&b, 1)
t = b
XCTAssertEqual(mp_neg(&t, &b), MP_OKAY)
mp_set(&c, 1)
XCTAssertEqual(mp_exptmod(&a, &b, &c, &d), MP_OKAY)

mp_set(&c, 7)
/* same here */
XCTAssertTrue(mp_exptmod(&a, &b, &c, &d) != MP_OKAY)

XCTAssertTrue(a.isEven != a.isOdd)
}
}
4 changes: 4 additions & 0 deletions modulemap/module.modulemap
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module libtommath [extern_c] {
header "../tommath.h"
export *
}