Skip to content
This repository was archived by the owner on Oct 30, 2024. It is now read-only.

Commit 1b3f8c9

Browse files
author
Matt Manzi
committed
Initial Commit
en/decipher function has been loosely coded, as well as a function to permute bits using a vector
0 parents  commit 1b3f8c9

File tree

8 files changed

+192
-0
lines changed

8 files changed

+192
-0
lines changed

.gitignore

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
.DS_Store
2+
/.build
3+
/Packages
4+
/*.xcodeproj
5+
xcuserdata/
6+
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata

Package.swift

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// swift-tools-version:5.1
2+
// The swift-tools-version declares the minimum version of Swift required to build this package.
3+
4+
import PackageDescription
5+
6+
let package = Package(
7+
name: "s-des",
8+
dependencies: [
9+
// Dependencies declare other packages that this package depends on.
10+
// .package(url: /* package url */, from: "1.0.0"),
11+
],
12+
targets: [
13+
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
14+
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
15+
.target(
16+
name: "s-des",
17+
dependencies: []),
18+
.testTarget(
19+
name: "s-desTests",
20+
dependencies: ["s-des"]),
21+
]
22+
)

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# s-des
2+
3+
A description of this package.

Sources/s-des/main.swift

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//
2+
// main.swift
3+
// S-DES algorithm command-line entry point.
4+
//
5+
// Created by Matt Manzi on 2/25/20.
6+
// Project 2 of CMSC 487, Spring 2020.
7+
//

Sources/s-des/s_des.swift

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//
2+
// s_des.swift
3+
// Houses all the core functionality of the Simplified Data Encryption Standard (DES).
4+
//
5+
// Created by Matt Manzi on 2/25/20.
6+
// Project 2 of CMSC 487, Spring 2020.
7+
//
8+
9+
import Foundation
10+
11+
let ROUNDS = 4
12+
let IP: [[UInt8]] = [
13+
[2, 6, 3, 1, 4, 8, 5, 7],
14+
[4, 1, 3, 5, 7, 2, 8, 6]
15+
]
16+
17+
/**
18+
TODO: comment
19+
*/
20+
func cipher(_ block: UInt8, using key: UInt16) -> UInt8 {
21+
22+
// initial permutation
23+
let permuted = permute(block, by: IP[0])
24+
25+
/*
26+
split block into L and R, like:
27+
MSb LSb
28+
+-----------+-----------+
29+
| r | l |
30+
+-----------+-----------+
31+
*/
32+
var l: UInt8 = (permuted & 0x0F)
33+
var r: UInt8 = (permuted & 0xF0) >> 4
34+
35+
// perform cipherment rounds
36+
for i in 0..<ROUNDS {
37+
38+
let k = ks(i + 1, key)
39+
40+
let temp = l ^ f(r, k)
41+
l = r
42+
r = temp
43+
44+
}
45+
46+
/*
47+
combine L and R into single block, like:
48+
MSb LSb
49+
+-----------+-----------+
50+
| l | r |
51+
+-----------+-----------+
52+
*/
53+
let preoutput: UInt8 = (l << 4) + r
54+
55+
// inverse initial permutation
56+
let output = permute(preoutput, by: IP[1])
57+
58+
return output
59+
}
60+
61+
/**
62+
TODO: comment
63+
*/
64+
func permute<T: UnsignedInteger>(_ bits: T, by vector: [T]) -> T {
65+
66+
// isolate each bit and move it to it's permutated position
67+
var permuted: T = 0
68+
for (i, bit) in vector.enumerated() {
69+
let mask: T = 1 << (bit - 1)
70+
let shift = (i + 1) - Int(bit)
71+
permuted += (bits & mask) << shift
72+
}
73+
74+
return permuted
75+
}
76+
77+
/**
78+
TODO: implement
79+
*/
80+
func ks(_ round: Int, _ key: UInt16) -> UInt8 {
81+
82+
return 0
83+
}
84+
85+
/**
86+
TODO: implement
87+
*/
88+
func f(_ halfBlock: UInt8, _ k: UInt8) -> UInt8 {
89+
90+
return 0
91+
}

Tests/LinuxMain.swift

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import XCTest
2+
3+
import s_desTests
4+
5+
var tests = [XCTestCaseEntry]()
6+
tests += s_desTests.allTests()
7+
XCTMain(tests)
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import XCTest
2+
3+
#if !canImport(ObjectiveC)
4+
public func allTests() -> [XCTestCaseEntry] {
5+
return [
6+
testCase(s_desTests.allTests),
7+
]
8+
}
9+
#endif

Tests/s-desTests/s_desTests.swift

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import XCTest
2+
import class Foundation.Bundle
3+
4+
final class s_desTests: XCTestCase {
5+
func testExample() throws {
6+
// This is an example of a functional test case.
7+
// Use XCTAssert and related functions to verify your tests produce the correct
8+
// results.
9+
10+
// Some of the APIs that we use below are available in macOS 10.13 and above.
11+
guard #available(macOS 10.13, *) else {
12+
return
13+
}
14+
15+
let fooBinary = productsDirectory.appendingPathComponent("s-des")
16+
17+
let process = Process()
18+
process.executableURL = fooBinary
19+
20+
let pipe = Pipe()
21+
process.standardOutput = pipe
22+
23+
try process.run()
24+
process.waitUntilExit()
25+
26+
let data = pipe.fileHandleForReading.readDataToEndOfFile()
27+
let output = String(data: data, encoding: .utf8)
28+
29+
XCTAssertEqual(output, "Hello, world!\n")
30+
}
31+
32+
/// Returns path to the built products directory.
33+
var productsDirectory: URL {
34+
#if os(macOS)
35+
for bundle in Bundle.allBundles where bundle.bundlePath.hasSuffix(".xctest") {
36+
return bundle.bundleURL.deletingLastPathComponent()
37+
}
38+
fatalError("couldn't find the products directory")
39+
#else
40+
return Bundle.main.bundleURL
41+
#endif
42+
}
43+
44+
static var allTests = [
45+
("testExample", testExample),
46+
]
47+
}

0 commit comments

Comments
 (0)