diff --git a/calc_autn.pl b/calc_autn.pl new file mode 100755 index 00000000..1b34f9eb --- /dev/null +++ b/calc_autn.pl @@ -0,0 +1,59 @@ +#!/usr/bin/perl +## +## Calculated EAP-AKA AUTN based on: +## AUTN = (SQN xor AK) || AMF || MAC = 48 + 16 + 64 = 128 bits +## +use strict; +use warnings; +use diagnostics; +use Carp; +$SIG{__DIE__} = sub{Carp::confess(@_)}; +use Getopt::Long; +$| = 1; + +our $usage = qq($0: calculate AUTN + All input is in ascii hex. + --sqn SQN + --ak AK, output of f5 + --amf AMF for test-set configuration + --mac MAC, output of f1 + +Example for test-set 19 (4.3.19) from 3GPP TS 35.208, v6.0.0 Release 6 + $0 --sqn 16f3b3f70fc2 --ak ada15aeb7bb8 --amf c3ab --mac 2a5c23d15ee351d5 +); + + +our $sqn = ""; +our $ak = ""; +our $amf = ""; +our $mac = ""; + +GetOptions ( + 'sqn=s' => \$::sqn, + 'ak=s' => \$::ak, + 'amf=s' => \$::amf, + 'mac=s' => \$::mac, +) || die("$::usage"); + +#AUTN = (SQN xor AK) || AMF || MAC = 48 + 16 + 64 = 128 bits +print "AUTN for SQN: $sqn AK: $ak AMF: $amf MAC: $mac\n"; +my $i; +my @sqnc = split("", $sqn); +my @akc = split("", $ak); +if (@sqnc != 12) { + die("sqn must have 12 ascii bytes."); +} +if (@akc != 12) { + die("ack must have 12 ascii bytes."); +} + +for ($i = 0; $i<12; $i++) { + my $v = hex($sqnc[$i]); + $v ^= hex($akc[$i]); + printf "%1x", $v; +} +print $amf; +print $mac; +print "\n"; + +## eof