Swift - Secp256k1 compute common secret - swift

I'm after a way to generate a common secret using the secp256k1 EC. I tried with https://github.com/soyersoyer/SwCrypt/ but doesn't support the secp256k1 curve.
I would need to do something like this:
let pairOne = generateKeyPair()
let pairTwo = generateKeyPair()
let sharedOne = computeSharedSecret(privateKey: pairOne.privateKey, publicKey: pairTwo.publicKey)
let sharedTwo = computeSharedSecret(privateKey: pairTwo.privateKey, publicKey: pairOne.publicKey)
XCTAssertEqual(sharedOne, sharedTwo)
Do you know any library to do it?

Related

Substrings in Swift 4

I have a url string (fake)
http://fools.sayers.mine.cs/api/analytics/ces_ssn
And I'd like to create a new URL string
http://fools.sayers.mine.cs/api/
The issue I'm facing is the last parameter ces_ssn can sometimes be anything like ces_fw or adv_let so I can't entirely set an endIndex in my code.
Is there a way to create a function that is dynamic in saying just give me the first 32 characters every time, not matter the endIndex
You have a URL. Use URL. Assuming you know you want to drop the last two parts of the path, you can do:
let myURL = URL(string: "http://fools.sayers.mine.cs/api/analytics/ces_ssn")!
let shortURL = myURL.deletingLastPathComponent().deletingLastPathComponent()
print(shortURL)
Output:
http://fools.sayers.mine.cs/api/
This works for Swift 4
var url = "http://fools.sayers.mine.cs/api/analytics/ces_ssn"
let newStr = url.prefix(32)
or probably the perfect way
if let index = url.range(of: "api/")?.upperBound {
let api = url.prefix(upTo: index)
}
You can use prefix()
"http://fools.sayers.mine.cs/api/analytics/ces_ssn".prefix(32)
That sounds prone to mistake if all of a sudden your URL is https instead of http, for example.
Instead I would do:
let url = URL(string: "http://fools.sayers.mine.cs/api/analytics/ces_ssn")!
let components = url.pathComponents
let scheme = url.scheme!
let host = url.host!
let slash = components.removeFirst()
print (components) // ["api", "analytics", "ces_ssn"]
The components you are interested in are then the 0 and 1 component, and you could reconstruct your URL like this:
let newURL = "\(scheme)://\(host)/\(components[0])/\(components[1])"
print (newURL) // "http://fools.sayers.mine.cs/api/analytics"

URL Builder in Swift

I am newbie on Swift and I am building API URL string as follows before pass it to URLSession.
I wonder there is a better way of doing it?
let jsonUrlString = Constants.API_URL + "/" + Constants.PATH + "/"
+ String(page)+"/" + Constants.NUMBER_ITEMS_PER_PAGE
The proper way to build a URL is to use URL and URLComponents. Simply appending strings together is error prone and it does not properly escape special characters that you might have in your values.
Here's one possible solution using URL:
if let baseURL = URL(string: Constants.API_URL) {
let jsonURL = baseURL.appendingPathComponent(Constants.PATH)
.appendingPathComponent(String(page))
.appendingPathComponent(Constants.NUMBER_ITEMS_PER_PAGE)
// use jsonURL with your URLSession
}
Another option with URLComponents (this properly ensures special characters are encoded):
if let baseComps = URLComponents(string: Constants.API_URL) {
var components = baseComps
components.path = "/\(Constants.PATH)/\(page)/\(Constants.NUMBER_ITEMS_PER_PAGE)"
if let jsonURL = components.url {
// use jsonURL with your URLSession
}
}
Also there is another way in swift to build string is called interpolation and mostly this one is used by developers.
If you using this you don't have to take your Int or another type value into string, Because is automatic take value into string.
i.e
let myValue = 3
let intToString = "\(myValue)" // "3"
let doubleValue = 4.5
let doubleToString = "\(doubleValue)" // "4.5"
So you URL will be like as below
let jsonUrlString = "\(Constants.API_URL)/\(Constants.PATH)/\(page)/\(Constants.NUMBER_ITEMS_PER_PAGE)"

Can you send objects other than strings in URLQueryItems?

Ok, I am building an iMessage app and to transfer data back and forth I have to use URLQueryItems. I am working with an SKScene and need to transfer Ints, CGPoints, images, etc. Reading Apple's documentation and my own attempts it seems like you can only store strings in URLQueryItems.
As this us the only way to pass data back and forth, is there a (better) way to store other types of data? Currently I have been doing this:
func composeMessage(theScene: GameScene) {
let conversation = activeConversation
let session = conversation?.selectedMessage?.session ?? MSSession()
let layout = MSMessageTemplateLayout()
layout.caption = "Hello world!"
let message = MSMessage(session: session)
message.layout = layout
message.summaryText = "Sent Hello World message"
var components = URLComponents()
let queryItem = URLQueryItem(name: "score",value: theScene.score.description)
components.queryItems = [queryItem] //array of queryitems
message.url = components.url!
print("SENT:",message.url?.query)
conversation?.insert(message, completionHandler: nil)
}
Then on the flip side I have to convert this string back to an Int again. Doing this with CGPoints will be inefficient.. how would one pass something like a CGPoint in a URLQueryItem? Any other way than storing the x and y values as strings?
EDIT: This is how I have been receiving data from the other person and putting into their scene:
override func willBecomeActive(with conversation: MSConversation) {
// Called when the extension is about to move from the inactive to active state.
// This will happen when the extension is about to present UI.
// Use this method to configure the extension and restore previously stored state.
let val = conversation.selectedMessage?.url?.query?.description
print("GOT IT ", val)
if(val != nil)
{
scene.testTxt = val!
}
}
As you discovered, to pass data via URLQueryItem, you do have to convert everything to Strings since the information is supposed to be represented as a URL after all :) For CGPoint information, you can break the x and y values apart and send them as two separate Ints converted to String. Or, you can send it as a single String value in the form of "10,5" where 10 is the x and 5 is the y value but at the other end you would need to split the value on a comma first and then convert the resulting values back to Ints, something like this (at the other end):
let arr = cgPointValue.components(separatedBy:",")
let x = Int(arr[0])
let y = Int(arr[1])
For other types of data, you'd have to follow a similar tactic where you convert the values to String in some fashion. For images, if you have the image in your resources, you should be able to get away with passing just the name or an identifying number. For external images, a URL (or part of one if the images all come from the same server) should work. Otherwise, you might have to look at base64 encoding the image data or something if you use URLQueryItem but if you come to that point, you might want to look at what you are trying to achieve and if perhaps there is a better way to do it since large images could result in a lot of data being sent and I'm not sure if iMessage apps even support that. So you might want to look into limitations in the iMessage app data passing as well.
Hope this helps :)
You can use iMessageDataKit library for storing key-value pairs in your MSMessage objects. It makes setting and getting data really easy and straightforward like:
let message: MSMessage = MSMessage()
message.md.set(value: 7, forKey: "moveCount")
message.md.set(value: "john", forKey: "username")
message.md.set(values: [15.2, 70.1], forKey: "startPoint")
message.md.set(values: [20, 20], forKey: "boxSize")
if let moveCount = message.md.integer(forKey: "moveCount") {
print(moveCount)
}
if let username = message.md.string(forKey: "username") {
print(username)
}
if let startPoint = message.md.values(forKey: "startPoint") {
print("x: \(startPoint[0])")
print("y: \(startPoint[1])")
}
if let boxSize = message.md.values(forKey: "boxSize") {
let size = CGSize(width: CGFloat(boxSize[0] as? Float ?? 0),
height: CGFloat(boxSize[1] as? Float ?? 0))
print("box size: \(size)")
}
(Disclaimer: I'm the author of iMessageDataKit)

PMCreateSession not creating print session

Trying to get printable rect for OS X app. Seems to involve creating a session, then a page format, validating the format, etc. Code compiles, but getting a status of -50 from PMCreateSession. Am I declaring printSession improperly? Normally don't have to deal so much with UnsafeMutablePointers.
Thanks!
let printSession: UnsafeMutablePointer<PMPrintSession> = nil
let pmPageFormat: UnsafeMutablePointer<PMPageFormat> = nil
var status = PMCreateSession(printSession)
status = PMCreatePageFormat(pmPageFormat)
status = PMSessionDefaultPageFormat(printSession.memory, pmPageFormat.memory)
let changed: UnsafeMutablePointer<DarwinBoolean> = nil
status = PMSessionValidatePageFormat(printSession.memory, pmPageFormat.memory, changed)
changed.destroy()
var pRect = PMRect()
status = PMGetAdjustedPageRect(pmPageFormat.memory, &pRect)
Swift.print("pRect \(pRect)")
status = PMRelease(pmPageFormat)
status = PMRelease(printSession)
Am I declaring printSession improperly?
One could acquire a PMPrintSession as follows:
// create a C Null pointer of type PMPrintSession
let printSession = unsafeBitCast(0, to: PMPrintSession.self)
// pass by & converts PMPrintSession to UnsafeMutablePointer<PMPrintSession>
PMCreateSession(&printSession)
…
// recast printSession to release memory
PMRelease( PMObject(printSession) )
Alternately, a PMPrintSession can be accessed from the Cocoa NSPrintInfo:
let printInfo = NSPrintInfo.shared()
let printSession = PMPrintSession(printInfo.pmPrintSession())
Normally don't have to deal so much with UnsafeMutablePointers
For information more information on using an UnsafeMutablePointer see StackOverflow "How to use UnsafeMutablePointer in Swift?"
For a complete example of using Core Printing with Swift see 004.42Apple_CorePrintingExample on GitHub.

AES calculation CMAC Java to Swift

I am trying to calculate CMAC
byte[] key={0x09,0x11,0x12,0x34,0x56,0x78,0x00,0x01,0x01,0x13,0x14,0x36,0x58,0x7A,0x02,0x03};
AES mAES=new AES();
mAES.AesInit(key);
byte[] response = mAES.calcCMAC(challenge);
Swift i am using the lib CryptoSwift
let key = [0x09,0x11,0x12,0x34,0x56,0x78,0x00,0x01,0x01,0x13,0x14,0x36,0x58,0x7A,0x02,0x03] as [UInt8]
let message:NSData = NSData.fromHexString("DA55C255")
let mac = Authenticator.Poly1305(key: key).authenticate(message.arrayOfBytes())
But it's not working as expected.
the expected result is
Challenge isDA55C255
Response isED7CA01A
we don't find any solution, we have created our own classe
https://gist.github.com/bolom/b426a0163943b576175b