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

Commit ef35fb3

Browse files
author
David Sutton
committed
Implemented a very gross ssh-key finger print function.
This could easily be improved.
1 parent e2e2c75 commit ef35fb3

File tree

4 files changed

+91
-1
lines changed

4 files changed

+91
-1
lines changed

http_signature/utils.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
import re
12
import struct
23
import hashlib
34
import base64
45

6+
from Crypto.PublicKey import RSA
7+
58
def lkv(d):
69
parts = []
710
while d:
@@ -33,13 +36,22 @@ def __getitem__(self, key):
3336
def __contains__(self, key):
3437
return super(CaseInsensitiveDict, self).__contains__(key.lower())
3538

39+
# currently busted...
3640
def get_fingerprint(key):
3741
"""
3842
Takes an ssh public key and generates the fingerprint.
3943
4044
See: http://tools.ietf.org/html/rfc4716 for more info
4145
"""
42-
key = base64.b64decode(key.strip().split()[1].encode('ascii'))
46+
if key.startswith('ssh-rsa'):
47+
key = key.split(' ')[1]
48+
else:
49+
regex = r'\-{4,5}[\w|| ]+\-{4,5}'
50+
key = re.split(regex, key)[1]
51+
52+
key = key.replace('\n', '')
53+
key = key.strip().encode('ascii')
54+
key = base64.b64decode(key)
4355
fp_plain = hashlib.md5(key).hexdigest()
4456
return ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))
4557

tests/test

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
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
51+
-----END RSA PRIVATE KEY-----

tests/test.pub

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDnonsoPY983WNK9deaaPdAj5dV/jOWXTAqaxKQhdpjNLHNZ+knN2QxB9t5CWdIx7KCben7IzzR0/AYJY3YT+onagV0KHMXH+A6axHmJ9zz6q2VTSLrDimtmiyVElb3oFPubyWptTyVsp87NKR3IiT/jH0PvirTDVsFnzz+lPGXZmQ8iQqtnBPAaw1Gj0EWj2tYIexjeAPsm6gOy5qaJzcbT/CpwfBCJVilO2ROUHCoGDcZ9BJOE76A3AnHtemHbvxUxVruv0YAvGzcfhed5llKRxRhSer0Yk27BZT7SPEj7GkuGypkTVmX2lmGDKbT33/IC6h3YlprCFOWnNza47PxqN+NXPX2LSNcxp42IJW2ke4rYM18EJK0FBTr8gd/jCwowbgTuDlYZl3ZpjlICIktp15sj36uea1dGyj2x+xnYCLElY+wHMxWVeHdT01VGnT2QMCGJen3J/jZdwhOqwPWTgSfhfGKGZcRoOZFVboA09lpo0YwzPy3zR1RdruF1bEtFFkXwyNlEvWIJQx3cZjmI6Zr0CJoI/fTdBDvRDCL2WaO/beMjCh23a7u9q3zt4Ku+eUdYCPXNAPZ7YzeC3FMXcpxAws6xIFAP70Hkys3uHh9CuGArFNmCqMl5vh7j5h5s3DMeDw6lFubwZPsCSzNHmB2GoUtKZg7SnRPl5rBHQ==

tests/test_utils.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#!/usr/bin/env python
2+
import os
3+
import re
4+
import sys
5+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
6+
7+
import unittest
8+
9+
from http_signature.utils import get_fingerprint
10+
11+
class TestUtils(unittest.TestCase):
12+
13+
def test_get_fingerprint(self):
14+
with open('rsa_public.pem', 'r') as k:
15+
key = k.read()
16+
fingerprint = get_fingerprint(key)
17+
self.assertEqual(fingerprint, "73:61:a2:21:67:e0:df:be:7e:4b:93:1e:15:98:a5:b7")
18+
19+
with open('test.pub', 'r') as k:
20+
key = k.read()
21+
fingerprint = get_fingerprint(key)
22+
self.assertEqual(fingerprint, "b3:d0:ad:c2:0e:a0:0f:3d:26:f1:67:3e:8b:91:9b:1a")
23+
24+
25+
if __name__ == "__main__":
26+
unittest.main()

0 commit comments

Comments
 (0)